この記事は、Wordpressのカスタマイズをfunction.phpを変更して行っている際に、突然ウィジットが保存できなくなった時の対処方法をまとめています。
まず、私に起きたトラブルから説明します。
ウィジットが保存できないトラブルが起きた経緯
WordPressのカスタマイズに慣れてくると徐々にfunction.phpをいじる場面が増えてきます。カスタマイズに慣れてくるとfunction.phpをいじって自前のウィジットを追加したりするわけです。
殆どのウィジットは設定項目があり、ウィジット毎に初期値が決まっていて、ユーザーが変更できるようになっています。
調子に乗ってfunction.phpに追加した自前ウィジットをいろいろいじっていたら、ある日突然、その他のウィジットも含めて、ウィジットの設定を変更しても内容が保存されない状態になりました。
少し細かい話
今回起きた、ウィジットが保存できない、をもう少し具体的に言うと、
- ウィジットをウィジットエリアに配置するところまではできる
- ウィジット配置後にウィジットの設定値を変更し、保存をクリックした後に、再度ウィジットの設定画面を開くと初期状態に戻っている
- 自前ウィジットだけじゃなく、他のウィジットも同じ現象が起きる
- ウィジットの設定値が保存できるときもあったり、保存できないときもあったり不安定
というもので、特に最後は非常に厄介な現象が起きていました。
ウィジットが保存できない時の一般的な原因
その時色々ググって調べたのですが1ページ目に出てくるサイトは、ウィジットが保存できないのは大抵の場合はロリポップかMixHostを使っているケースで、サーバー側のWAFが影響しているという話ばかり。
WAFとはなにか?
WAFとは、Webサーバの前面に配置して通信を解析し、Webアプリケーションの脆弱性を突いた攻撃からWebサイトを守るためのセキュリティ対策です。ネットワークF/WやIPS/IDSでは対応できない攻撃を検知・遮断することができます。
そのWAFが悪さしているときに見られるWordpress上の現象は、以下のようなものです。
- ウィジェット編集画面で保存ボタンをクリックしても更新が確定されない。
- 読み込みインジゲーターがぐるぐる回るだけで進まない。
ちなみに、使用しているサーバーがロリポップやMixHostじゃないし、現象も違うので、あー自分には関係ないなコレと思いました。
通常、ロリポップやMixHostでこの現象が起きると、ウィジットをいじるときにサーバーのWAFをOFFにしないといけなくなります。ウィジットの変更が終わるとまたサーバーのWAFをONにしないといけないという大変面倒な作業が必要です。サーバーの管理画面って結構重いことがあるので、ログインしていちいち変更するのは結構面倒な作業だと思います。
WAF自体は悪いものではなく、セキュリティのために導入されているものですから、WAFがあるロリポップやMixHostが悪いサーバー会社というわけではなく、むしろセキュリティが強い、良いサーバー会社と考えるのが自然です。
最近ではXserverもWAFの導入を始めたことでも今後WAFが重要な技術であることはわかると思います。
ロリポップじゃないサーバーでウィジットが保存できない時の解決策
原因がWAFではないので自力で解決しなければならん状態だと思いました。
いくつか基本的なことを確認しました。
テーマの再インストール
テーマが壊れているかも?と、テーマを上書き再インストール。
⇒変化なし
テーマのバグなのでは?と思ってとりあえずアップデート
直近のアップデートの影響かも?と、アップデートする。
⇒変化なし
全てのpluginをOFFにする
あまり期待せず、定番の【pluginを全てOFF】にしてみました。
⇒変化なし
function.phpを少し前のバージョンに戻す
この時点で、function.phpに原因がありそうだと観念しました。
function.phpに自前のウィジットを追加していったときに、その記述の中にエラーにはならないけどウィジット全体に変な現象を起こす記述がどこかに紛れ込んでいると思いました。
と言っても、ローカルにデバッグ環境もなく、仕方ないのでオンラインでfunction.phpに記載した自前ウィジットをfunction.phpから順番に外していくと、ある部分を取り除くとウィジットが保存できるようになりました。
⇒解決!
画像を選択するタイプのウィジットが保存されない
最近のテーマでは、ギャラリーやスライダーなど画像を指定する独自ウィジットを搭載しているテーマが結構あります。
その手のウィジットで、画像を指定して他の項目を触らない状態だとウィジットの保存ボタンが押せない現象が起きます。ウィジットの保存ボタンを押さずに完了をクリックして、再度ウィジットの設定を開くと指定した画像が消えています。
簡単に言うとウィジットの保存を押していないのだから保存されていないわけですが、なぜ保存が押せないのか?というと、画像指定だけだとウィジットの設定項目に変更がないと認識されてしまうためのようです。
画像以外の項目を少し変更して戻してやるとあら不思議、ウィジットが保存できるようになります。
register_sidebarで追加したウィジェットでウィジェットが保存されない
自分で、register_sidebarでウィジェットを追加したときに、idに大文字が入っているとなぜか、ウィジェットが保存できない現象が発生しました。
この現象は、解析にしにくく、結構パニくるので頭の片隅に残しておいた方が幸せになれると思います。
idに大文字が入っているとNG
register_sidebar(
array(
'name'=>'フッターウィジェット ',
'id'=> 'Mfooter-widget-',
'before_widget' => '<aside class="widget %2$s" id="%1$s">',
'after_widget' => '</aside>',
'before_title' => '<h1 class="widget-title subSection-title">',
'after_title' => '</h1>',
)
);
まとめ
自前のウィジットをfunction.phpに記載して追加すると、ウィジットの設定値が保存できない現象が発生することがある。function.phpに記載ミスがあると通常画面が真っ白になる、今回のケースはそうならないので、気が付きにくいやっかいな不具合である。
その場合は、自分で追加したウィジットをひとつづつfunction.phpから削除していくことで原因の特定ができる。