このブログの更新は終了しています。
よろしければ新しいブログの方もご覧ください。
WordPress 4.4に早速アップデートしました。すると、このブログのサイドバーにあるタグクラウドが下の画像のように乱れてしまいました。左側が正しい出力、右側が乱れた出力です。
タグクラウドはウィジェットを使っていますが、後述のようにテーマのfunctions.phpでフィルターをフックしてパラメーターを渡し、出力内容を変更しています。試しに変更を加えずそのままデフォルトのウィジェットを出力するように変更すると正しく出力されます。検索してみると同様な現象の報告はあるものの解決策は見つかりませんでしたので、自力でなんとか解決してみました。
まずは正しい出力と乱れた出力のHTMLソースを見比べてみます。正しい出力では、タグクラウド部分全体が<aside>
タグで囲まれ、その下に<h1>
タグでウィジェットのタイトルがあり、次に<div>
で囲まれたタグクラウド本体が出力されています。ところが、乱れた出力ではこれらのタグが一切なく、前のウィジェットの直後にいきなりタグクラウド本体が出力されてしまっています。<aside>
や<div>
に指定されているクラスが存在しないためCSSも正しく適用されていないわけです。タグクラウドの内容自体(除外するタグや並び順など)はデフォルトのものではなく指定したものになっているので、パラメーター自体は正しく渡っています。
WordPressコアのソースを見て直接の原因は分かりました。タグクラウドウィジェットで実際にタグクラウドを取得している部分はwp-includes/widgets/class-wp-widget-tag-cloud.php内の以下のコードで、ウィジェットのタイトルやラッパーを出力する前に記述があります。
$tag_cloud = wp_tag_cloud( apply_filters( 'widget_tag_cloud_args', array(
'taxonomy' => $current_taxonomy,
'echo' => false
) ) );
wp_tag_cloud
関数は元々テーマ中でタグクラウドを出力する関数ですが、echo
パラメーターをfalse
にすることで出力せずに文字列として他の関数・変数に渡すことができます。一旦変数$tag_cloud
に格納されたタグクラウドの文字列は、この後タイトルやラッパーの出力後にecho
されるのですが、今回の乱れた出力では、ここの部分でタグクラウドの出力がされてしまって、その後の処理が行われていません。つまり、wp_tag_cloud
関数の引数echo
がデフォルトのtrue
になってしまっているのです。私がfunction.php内で指定しているパラメーターもここで引数として渡されており、その場合に上のコードにあるecho
の指定(false
)が有効にならず、wp_tag_cloud
関数のecho
のデフォルト値であるtrue
が有効になってしまい、出力されていたというわけです。
これは私のコードの書き方に問題があって、引数を全部自分のものに上書きしていたんですね。その際にecho
は指定をしていなかったのでデフォルトの値が使われてしまっていました。正しくは、引数をマージしないといけなかったのです。
そんなわけで、function.php内の記述を以下のように書き換えることにより問題は解決しました。(以前は$my_args
ではなく直接$args
としていて、wp_parse_args
関数も使わずそのまま返していました。)
function my_tag_cloud_args( $args ) { $my_args = array( //
ここに自分が指定したいパラメーターを記述する。//
(例) 'format' => 'list', 'orderby' => 'count' ); $args = wp_parse_args( $args, $my_args ); return $args; } add_filter( 'widget_tag_cloud_args', 'my_tag_cloud_args' );
アップグレードするまでは正しく動作していた(ように見えた)のは、以前のバージョンではwp_tag_cloud
関数が直接出力に使われていたためです。私がpost_tag
しかタグクラウドに使っていないためtaxonomy
の引数してを無視してしまっていることも問題になりませんでした。
メジャーアップグレードの際にはこういった細かい変更がテーマや動作に影響を与えることが少なくありません。本当はいきなりアップグレードするのではなくローカル環境でチェックしてからの方がいいのは分かってるんですけどね。最初は原因が分からず戸惑いましたが、思ったより早く解決することができましたし、正しいカスタマイズ方法に修正できたので良しとしましょう。
WordPressのフォーラムで教えていただきました。
解決することができました。
ありがとうございました。
どういたしまして。お役に立てて良かったです。
HTML がちゃんと出力されてないなーと思っていましたが、対処法がわからず。
こちらの記事のおかげで修正できました!
ありがとうございました。