現在、放置中の「アナログレコード回顧録」という別ブログの過去記事を、当ブログに統合中で、その元ブログのタイトルと同じカテゴリー名を作って分類してるんですが、他の記事に比べて、結構独自色の強い内容なんですよね。
そこで、他の記事と差別化をするために、そのカテゴリーの記事だけ、記事タイトル上部にカテゴリーを示す専用バナーを表示したいと思うのですが、相変わらずコードなどに疎いので、どうすればよいかさっぱり分からず、色々と調べてみました。つまり、
“特定カテゴリーの記事だけに、記事タイトルの上部にカテゴリー専用バナーを表示したい”
ということです。
備忘録として、色々とごちゃごちゃ書いているのはご勘弁を。
ちなみに、使用しているテーマは、WordPressのTwenty Twelveです。
特定カテゴリーを指定するのに条件分岐タグで関数「in_category」を使用
いきなりですが、コードのことがさっぱり分からず、今回はこちらのサイトを参考にさせていただきました。ありがとうございました。
・WordPressの条件分岐タグの使い方 – 特定の記事やページのみ広告を表示する | WP SEOブログ
上記サイトを参考にさせていただくと、条件分岐のタグを使用するということですね(あ〜、ここら辺はもっと勉強しないと…)。
今回の場合、特定カテゴリーのみにバナーを付けたいので、
<?php if(in_category('パラメータ')): ?>表示内容〜今回はバナー画像<?php endif; ?>
となるのですが、「in」というのがポイントですね。
これで特定カテゴリーに属する記事のみに表示、ということになるようです。
パラメータには、ID、タイトル、スラッグが指定できるとのこと。
ちなみに、カテゴリーのIDを調べるには、管理画面の「投稿」→「カテゴリー」で表示される画面で、確認したいカテゴリーにカーソルを合わせると、ブラウザの左下にURLが表示され、そのなかにIDが表示されています。
実際にカテゴリー名をクリックして、カテゴリーの編集画面を表示すると、ブラウザ上部に表示されるURLの中でも、IDを確認できます。具体的に、今回の「アナログレコード回顧録」というカテゴリーはID=1862でした(随分と大きな数字だけど、まあいいか…)。
このIDで、先ほどの条件分岐タグを表示したい箇所に記述するわけですが、今回は、個別記事の記事タイトル上にバナーを表示したいので、single.phpに記述しました。
これで、OKと思いきや、ここで引っかかってしまいました。
というのも、記事の上部には、バナーが全然表示されないんです。
どうやら、この「in category」には、ルールがあったんですね。
「in category」にはルールがある
全然バナーが表示されないので、いったいどうしたものかと更に調べていたら、「in category」にはルールがあるとのこと。
それについては、こちらを参考にさせてもらいました。ありがとうございました。
・【WordPressで特定のカテゴリの記事「だけ」に特定の要素(バナーやテキストリンクなど)を表示する方法】 | 今村だけがよくわかるブログ)
何がいけなかったというと、どうやらin_category()で指定した場合、その個別記事が直接割り当てた(投稿時にチェックした)カテゴリーしか考慮しないそうです。
つまり、今回の「アナログレコード回顧録」というカテゴリーは親カテゴリーで、その下に、子・孫カテゴリーがあるのですが、投稿時に親カテゴリー「アナログレコード回顧録」にチェックした記事は反映されて、チェックしなかった子や孫カテゴリーの記事には、この指定方法では反映されないということですね。
実は、この辺の「in category」についての詳しい説明は、WordPress Codex 日本語版にも説明がありました。
・関数リファレンス/in category – WordPress Codex 日本語版
次のように、複数のカテゴリーを指定する方法もあるのですが、
<?php if(in_category(array('パラメータ1','パラメータ2','パラメータ3'))): ?>表示内容〜今回はバナー画像<?php endif; ?>
実は、今回のカテゴリーは、子や孫カテゴリーがたくさんあるので、これはあまりにも現実的ではないんですよね(ものすごく長くなるのと、増えるたびに編集が必要になるため)。
「post_is_in_descendant_category」関数を使う〜functions.phpに注意
※ここからは、全然理解できてないので、ほとんど参考サイトを流用させてもらってます。
先ほどの、参考にさせてもらったサイト(【WordPressで特定のカテゴリの記事「だけ」に特定の要素(バナーやテキストリンクなど)を表示する方法】 | 今村だけがよくわかるブログ)や「関数リファレンス/in category – WordPress Codex 日本語版」を読み進めると、どうやら、親カテゴリーに属する子、孫カテゴリーまでを対象にする方法があるようです。
それは、「post_is_in_descendant_category」という関数なんですが、これを使用するためには、コードをfunctions.phpなどに追記しておく必要があるそうです。
う〜ん、初心者的には、本当はfunctions.phpをいじるのは怖いのですが、何があっても自己責任ですよね。必ずバックアップを取って作業しまょう。
で、functions.phpに追記するコードは、参考サイトをそのまま掲載させてもらいますと、下の方に記載しているコードになるのですが、私のようにPHPを全く理解してないものは要注意です。
私はそのまま全部をfunctions.phpににコピペしてしまい、次のようなエラーになって、管理画面もブログ画面も真っ白になってしまいました(汗)
Parse error: syntax error, unexpected ‘<' in /home/users/1/lolipop.jp-28850facf8d68dec/web/wp-content/themes/twentytwelve/functions.php on line 515
ひとまずバックアップしていたファイルをFTPソフトを使って戻して、何とか元に戻りましたが、無知は怖いですね。
このfunctions.phpのトラブルのに際して、改めて調べてこちらを参考にさせてもらいました。ありがとうございました。
・functions.phpを編集したら、サイトが真っ白になっちゃったときに試してみてね | Webourgeon
そうです、コピペの際に、上下の <?php と ?> も一緒に入れてしまって、これが原因のようです。
終了タグの扱いが今ひとつ分かってないのですが、ひとまずfunctions.phpには、下記コードの <?php と ?> を除いた、それに囲まれた部分をコピペして追記しました。(※ここ、初心者要注意ですね)
<?php /** * 投稿に付けられたカテゴリーが、指定されたカテゴリーの子孫カテゴリーに含まれるかテストする * * @パラメータ 整数|配列 $cats - カテゴリーを指定。整数の ID または整数の ID の配列 * @パラメータ 整数|オブジェクト $_post - 投稿。省略するとループまたはメインクエリ内の現在の投稿をテストする * @戻り値 真偽値 True - 投稿のカテゴリーの一つ以上が指定されたカテゴリーの何れかの子孫カテゴリーである場合 * @参考 get_term_by() - カテゴリー名またはスラッグからカテゴリー ID を取得するのに使える * @内部で使用 get_term_children() - $cats を渡す * @内部で使用 in_category() - $_post を渡す(空でもよい) * @バージョン 2.7 * @リンク http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category */ if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) { foreach ( (array) $cats as $cat ) { // get_term_children() は整数の ID しか受け付けない $descendants = get_term_children( (int) $cat, 'category' ); if ( $descendants && in_category( $descendants, $_post ) ) return true; } return false; } } ?>
そして、single.phpに記述する、「post_is_in_descendant_category」関数を使った条件分岐タグは、参考サイトにならって流用させてもらうと(カテゴリースラッグが「analogrecord」で、ID=1862)、
<?php if ( in_category( 'analogrecord' ) || post_is_in_descendant_category( 1862 ) ) { ?>表示内容〜今回はバナー画像<?php } ?>
ということで、これでようやく当初の“特定カテゴリーの記事だけに、記事タイトルの上部にカテゴリー専用バナーを表示したい”という目的が達成できました。長かった…
いや〜、エラーで画面が真っ白になった時は、どうしようかとビビりました。
他にも細かな点で、私の理解力ではよく分からない箇所が多々あるのですが、まずは表示されたので、これで良しとします。
ちょっと長い備忘録となってしまいましたが、色々と分かってないと、記録も長くなってしまいますね…
PHPについては、もうちょっと理解が必要だと、毎回思い知らされるのですがね〜
それと、やっぱりバックアップは大切です。