WordPressでウィジェット登録が出来るようにするHOWTOと、そのウィジェットにいろいろ設定したのに何度やっても設定が消えてしまった話

014 002

今回は自作テーマ作成中におこったウィジェット登録にまつわるトラブルの話。

事の顛末を書きます と、Wordpressの管理画面に外観->ウィジェットってあるじゃないですか。テーマ特定の登録エリアにお好きなウィジェットを登録できるイカ シタ機能。あそこにアーカイブ一覧とか、最近の投稿なんてウィジェットをガシガシ追加していくと、あら不思議!ブログっぽいものができあがり!となる訳で す。

 

そんなウィジェットの登録をしてからブログの画面を見てみたら、なぜか登録したウィジェットが表示されてない。

おかしいなー。いま登録したけどなーとか思いながらもう一度ウィジェット登録画面を見てみたら、登録したものが全部なくなってる!

またやり直しかよ!とかブツブツいいながらマウスをポチポチして、テキストウィジェットに文章を書き直して、これでどうだ!とばかりにサイトを表示してみた 訳ですが見事になんにも反映されてない・・・。

その後、何度やってみても登録されないので、こりゃテーマ修正中になんかやっちまったかと解析に向かったわ けです。

そもそも自作テーマでウィジェット登録ってどうやるの?

5b0a34f1ecceb68c7ed7f08262e67b9e

まずですね、テーマでウィジェット機能をつかうためにはウィジェットを使いますよという宣言をしてあげなきゃいけません。

その宣言をするのが register_sidebar という関数。サイドバーとか言ってるけど気にしない。

この関数にウィジェットの識別IDと、その他もろもろを指定してやると、外観->ウィジェットに指定したボックスがでます。

function.php あたりでこんな感じでつかいます。
関数の詳しい使い方は各自マニュアル参照です。

ウィジェットをつかうよーという宣言ができたら、次は実際につかいたい個所で dynamic_sidebar という関数をつかいます。

こいつにさっきの register_sidebar で指定した識別ID(上の例なら widget-1)を渡してあげると、その場所にウィジェットが表示されるようになります。

細かい話をすると、dynamic_sidebar をする時は is_active_sidebar を使ってエラーチェックしたりするのがお作法なんですがその辺は省略。

これでめでたくウィジェット機能が使えるようになりました。

ウィジェットの設定内容が反映されないというトラブル

で、ここからが本題。

上記の方法でウィジェットを登録できるようにしまして、ひと区切りついたのでちょっとテストでもしようかと管理ページからウィジェットをポチっとやったら冒頭の状態だったと。

最初はウィジェット画面で保存時に動くAjaxが失敗して保存が出来てないんじゃないかと疑ってみたんですが別にエラーはでてない。
wp-admin/widgets.php を追っかけても怪しいところはない。

じゃあということでウィジェットの設定項目を表示するところで保存したデータが取れてるかを見てみようと wp-includes/widgets.php で値を見てみたんですがこれも問題なし。

うーん、と小一時間あれこれ見て気付きましたよ。

原因は dynamic_sidebar をするときの識別IDに大文字が混じっていたことでした。

これ、はじめて知ったんですが、wordpressは register_sidebar をした時の識別IDを、内部ですべて小文字に変換して保持していて、不親切なことに dynamic_sidebar をした時の識別IDは小文字でマッチングをかけてくれないためにIDがマッチしない。

APIにそんなこと書いてあったかー?いや、ない!(たぶん)。
おもわず「えー、うそーん」という声が出ましたよ。

原因がわかったので dynamic_sidebar と、念のために register_sidebar で登録する識別IDを小文字にしてあげたところ、いつも通りのイカシタ機能が使えるようになりました。

このエントリーのまとめ

いやね、そういうお仕事をしてますから自作テーマを作るのも何度目だというくらい何度も作ってきてますし、テーマ制作でウィジェット周りのコードなんて定型文みたいにつかってたんですが、慣れってのはいけませんね。

そんなワケないだろと思い込んでソースを追わないのはイクナイ。さっさとソース見てればこんなに時間がかからないですんだのにねー。

ということで、賢明なみなさまはこんなアホなトラブルにあわないとは思いますが、どこかのだれかの役に立つことを願ってエントリー。