今さら聞けない、WordPressで特定カテゴリーの記事タイトル上部にカテゴリー専用バナーを表示したい。テーマはSimplicity【初心者備忘録】

このブログには「アナログレコード回顧録」というカテゴリーがあって、もともと別ブログに掲載していた記事を統合した際に設定したものなんですが、独自色を出すために、以前から記事タイトル上部にカテゴリーを示す専用バナーを表示させていたんです。

で、その時のWordPressのテーマはTwenty Twelveだったのですが、ちょっと前にテーマをSimplicityに変更したために、一時そのバナーがなくなり、今回改めて設定したので、その作業内容を書き留めておこうと思います。初心者完全備忘録なので、内容は参考程度に。

特定カテゴリーの記事タイトル上部にカテゴリー専用バナーを表示させる

つまりは、テーマSimplicity(バージョンはSimplicity2)で、
“特定カテゴリーの記事タイトル上部にカテゴリー専用バナーを表示させる。”

ということなんですが、正直、技術的に疎い私は、PHPやらパラメータやら全く理解してないので、以前、テーマTwenty Twelveを使用していた時にもかなり悪戦苦闘してようやく設定したんです。で、その時の記事がこちらです。
今さら聞けない、WordPressで特定カテゴリーの記事だけに、カテゴリー専用バナーを表示したい〜functions.phpをいじって真っ白になる失敗のおまけ付き | ローカルブロガーのメモ帳

その内容は、まずは特定カテゴリーを指定するのに条件分岐タグで関数「in_category」を使用するんですが、当ブログの場合、親カテゴリー(アナログレコード回顧録)の下に、子・孫カテゴリーがたくさん設定されているので、その親カテゴリーに属する子、孫カテゴリーまでを対象にしなければいけません。

親カテゴリーを指定した際に、子、孫カテゴリーまでを対象にする関数

ここで登場するのが「post_is_in_descendant_category」という関数なんですが、難しいです。

で、結局、こちらのサイトをそっくり参考にさせてもらってます、
【WordPressで特定のカテゴリの記事「だけ」に特定の要素(バナーやテキストリンクなど)を表示する方法】 | 今村だけがよくわかるブログ
関数リファレンス/in category – WordPress Codex 日本語版

詳しい内容は難しいので省きますが、上記サイトに掲載されている、次のコードをfunctions.phpに追記すると、親カテゴリーを指定した際に、子、孫カテゴリーまでを対象にしてくれます。

そうそう、初心者的にfunctions.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;
	}
}

テーマSimplicityの場合、私は子テーマもダウンロードしているのですが、子テーマにもfunctions.phpが含まれているので、そちらに追加してます。

「in_category」を使用して追加するコードと場所

さて、あとは「in_category」を使用して、専用バナーを表示させたい場所に記述を追加するのですが、それもまた難しい。

今回は、アナログレコード回顧録というカテゴリー(カテゴリースラッグが「analogrecord」で、ID=1862)に属する記事のタイトルの上に専用バナーを表示させたいので、先ほどの参考サイトにならい、次のコードを追加します。

<?php if ( in_category( 'analogrecord' ) || post_is_in_descendant_category( 1862 ) ) { ?>表示内容〜今回はバナー画像<?php } ?>

で、このコードを追加するSimplicityのPHPファイルなんですが、個別記事タイトル上部に挿入なので、Simplicityのファイル一覧を見ると、個別投稿 (single.php)かと思うのですが、そうではなくて、どうやらentry-body-phpになります。

そして、これを直接いじるんではなくて、FTPソフトでSimplicityのentry-body-phpのファイルをコピーして、子テーマに移動してからそちらに追加します。

そして、ようやくテーマSimplicitでも、特定カテゴリーの記事タイトル上部に、カテゴリー専用バナーを表示することができました。

長かった…

おわりに

ということで、やっぱりちょっと難しくて、ハードルが高かったです。
過去に一度やった内容のカスタマイズだったのですが、時間も結構かかってしまいました。

けど、分からないながらもこうやって少しずつでも、思ったようにカスタマイズしていくのは楽しいかも。