プログラミングナレッジKnowledgeSide

2017.07.27

親カテゴリーでの条件分岐と親カテゴリーのテンプレートを子カテゴリーに使用する

Pocket

クライアントワークでこのようなケースがあったので備忘録としての記事です。WordPressでは親カテゴリー、子カテゴリーとカテゴリーに階層構造を持たせることができます。しかし子カテゴリーが多くなってくると機能的に複雑になってきたり管理が大変になったりします。そこで子カテゴリーではなく属する親カテゴリーでの条件分岐やページテンプレートで扱いたいという時に使える小技になります。

 

1. 子カテゴリーが属する親カテゴリー別での条件分岐

post_is_in_descendant_category関数というものを使用します。まずはfunctions.phpに下記を記述して関数の定義を行います。

 

【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;
    }
}

 

あとはif文での分岐条件にpost_is_in_descendant_category関数を用います。引数には親カテゴリーのスラッグやIDを指定します。WPのin_category関数と併用することが多いかと思います。これで子カテゴリーを親カテゴリー単位で条件分岐ができるようになります。

if ( in_category( 'cat-1' ) || post_is_in_descendant_category( 'cat-1' ) ) { 
        // 「cat-1」もしくは「cat-1」に属する子カテゴリーのものであった場合の出力内容
} else if ( in_category( 'cat-2' ) || post_is_in_descendant_category( 'cat-2' ) ) { 
        // 「cat-2」もしくは「cat-2」に属する子カテゴリーのものであった場合の出力内容
} else if ( in_category( 'cat-3' ) || post_is_in_descendant_category( 'cat-3' ) ) { 
        // 「cat-3」もしくは「cat-3」に属する子カテゴリーのものであった場合の出力内容    
}

 

2. 親カテゴリーのアーカイブテンプレートを子カテゴリーにも使用する

functions.phpに下記コードを記述します。子カテゴリーのアーカイブテンプレートと親カテゴリーのアーカイブテンプレートを統合するような内容の記述になっています。こうすることで子カテゴリーのアーカイブは、属する親カテゴリーのアーカイブテンプレート(category-{slug}.php)で表示されるようになります。

 

【functions.php】

add_filter( 'category_template', 'parent_category_template' );
function parent_category_template( $template ) {
    $category = get_queried_object();
    if ( $category->parent != 0 &&
        ( $template == "" || strpos( $template, "category.php" ) !== false ) ) {
        $templates = array();
        while ( $category->parent ) {
            $category = get_category( $category->parent );
            if ( !isset( $category->slug ) ) break;
            $templates[] = "category-{$category->slug}.php";
            $templates[] = "category-{$category->term_id}.php";
        }
        $templates[] = "category.php";
        $template = locate_template( $templates );
    }
    return $template;
}

 


 

このようなテクニックは主に階層カテゴリーでページ構成されているWordPressサイトには使えるかと思います。不用意に子カテゴリー分だけページテンプレートを作成しなくても済みますし管理も楽になるのではないでしょうか。

 

(参考)
WPCodex:関数リファレンス/in category
子カテゴリのアーカイブページを親カテゴリ用のテンプレートファイルで表示しよう

 

 

Pocket

>>記事一覧に戻る