in_category()関数では、投稿に割り当てられたカテゴリーのみをテストし、その親カテゴリー(親、親の親、…)を対象としません。
とコーデックスに書いてありますが、要は、親カテゴリまたは、その親カテゴリーに分類されている子カテゴリの投稿に何か処理をさせたり要素を表示させたい(広告など)、そんなときに利用できる条件分岐の方法をご紹介します。
こういったカスタマイズをしたい場合に
カテゴリーは、階層構造を持たせることができますが、子カテゴリーが多くなってくると保守性が悪くなり、管理が大変になったりします。そういった場合に、子カテゴリーではなく属する親カテゴリーでの条件分岐やページテンプレートで扱いたいという時に使える条件分岐です。
親カテゴリーが「フルーツ」の子カテゴリー「ぶどう」「なし」「いちご」・・・今後増えるかも。。。の記事だけに、
- 広告を入れたい
- テンプレートファイルを切り替えたい。single-○○.php など
STEP1 : functions.phpに以下のコードをコピペする。
『post_is_in_descendant_category』という関数を使用するために、functions.phpに下記を記述して関数の定義を行います。
if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) { foreach ( (array) $cats as $cat ) { $descendants = get_term_children( (int) $cat, 'category' ); if ( $descendants && in_category( $descendants, $_post ) ) return true; } return false; } }
条件分岐をしたい箇所、投稿ページ『single.php』などにコードを記入する。
親カテゴリかその子カテゴリに分類されているかどうかで表示内容を切り替えたい場合
<?php if ( in_category(親カテゴリID) || post_is_in_descendant_category(親カテゴリID) ): ?>
// 「親カテゴリ」もしくは「親カテゴリ」に属する子カテゴリーのものであった場合の出力内容
<?php else: ?>
// それ以外の出力内容
<?php endif; ?>