今さら聞けない、WordPressで特定カテゴリーの記事だけに、カテゴリー専用バナーを表示したい〜functions.phpをいじって真っ白になる失敗のおまけ付き

Category-banner

現在、放置中の「アナログレコード回顧録」という別ブログの過去記事を、当ブログに統合中で、その元ブログのタイトルと同じカテゴリー名を作って分類してるんですが、他の記事に比べて、結構独自色の強い内容なんですよね。

そこで、他の記事と差別化をするために、そのカテゴリーの記事だけ、記事タイトル上部にカテゴリーを示す専用バナーを表示したいと思うのですが、相変わらずコードなどに疎いので、どうすればよいかさっぱり分からず、色々と調べてみました。つまり、

特定カテゴリーの記事だけに、記事タイトルの上部にカテゴリー専用バナーを表示したい

ということです。
備忘録として、色々とごちゃごちゃ書いているのはご勘弁を。
ちなみに、使用しているテーマは、WordPressのTwenty Twelveです。

特定カテゴリーを指定するのに条件分岐タグで関数「in_category」を使用

いきなりですが、コードのことがさっぱり分からず、今回はこちらのサイトを参考にさせていただきました。ありがとうございました。
WordPressの条件分岐タグの使い方 – 特定の記事やページのみ広告を表示する | WP SEOブログ

上記サイトを参考にさせていただくと、条件分岐のタグを使用するということですね(あ〜、ここら辺はもっと勉強しないと…)。

今回の場合、特定カテゴリーのみにバナーを付けたいので、

<?php if(in_category('パラメータ')): ?>表示内容〜今回はバナー画像<?php endif; ?>

となるのですが、「in」というのがポイントですね。
これで特定カテゴリーに属する記事のみに表示、ということになるようです。

パラメータには、ID、タイトル、スラッグが指定できるとのこと。

ちなみに、カテゴリーのIDを調べるには、管理画面の「投稿」→「カテゴリー」で表示される画面で、確認したいカテゴリーにカーソルを合わせると、ブラウザの左下にURLが表示され、そのなかにIDが表示されています。

category_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 } ?>


ということで、これでようやく当初の“特定カテゴリーの記事だけに、記事タイトルの上部にカテゴリー専用バナーを表示したい”という目的が達成できました。長かった…

Category-banner

いや〜、エラーで画面が真っ白になった時は、どうしようかとビビりました。

他にも細かな点で、私の理解力ではよく分からない箇所が多々あるのですが、まずは表示されたので、これで良しとします。

ちょっと長い備忘録となってしまいましたが、色々と分かってないと、記録も長くなってしまいますね…
PHPについては、もうちょっと理解が必要だと、毎回思い知らされるのですがね〜

それと、やっぱりバックアップは大切です。