[WordPress] あるカテゴリーの子カテゴリーかどうかを判定したい
- あるカテゴリーとその子カテゴリーの表示件数や表示順を変えたい、といった場合があります
 - カテゴリーの判定といえば「is_category」ですが、これだけではカテゴリーの子孫かは判定できません
 - 「cat_is_ancestor_of」という関数を使うことで、あるカテゴリーの子カテゴリーかどうかを判定することができます
 
サンプルコード
functions.php
function set_query_category($query) {
    if(is_admin() || !$query->is_main_query()) {
        return;
    }
    
    if(is_category()) {
        $parent_cat_id = get_category_by_slug('movie')->term_id;
        $current_cat_id = get_category_by_slug($query->get('category_name'))->term_id;
        if(is_category($parent_cat_id) || cat_is_ancestor_of($parent_cat_id, $current_cat_id)) {
            $query->set('posts_per_page', 20);
        }
    }
    
    return $query;
}
add_filter('pre_get_posts', 'set_query_category');
    サンプルコードの解説
$parent_cat_id = get_category_by_slug('movie')->term_id;
    - 親カテゴリーのidを取得しています。ここでは、「movie」というスラッグ名のidを変数に格納しています
 
$current_cat_id = get_category_by_slug($query->get('category_name'))->term_id;
    - 表示中のページがどのカテゴリーのアーカイブなのかを取得してそのidを変数に格納しています
 - 「posts_per_page」をフックした時点では、「cat」にidがセットされていないので、下記のコードではidが取得できません。そのため、このようなちょっと回りくどい書き方になっています
 
$current_cat_id = $query->get('cat');
    if(is_category($parent_cat_id) || cat_is_ancestor_of($parent_cat_id, $current_cat_id)) {
    /* 処理 */
}
    - これまでに取得した親カテゴリーidと表示中カテゴリーidを使って判定している部分です
 - まずは「is_category」で親カテゴリーのアーカイブページかを判定します
 - 更にor条件で「cat_is_ancestor_of」という関数を呼びます。第1引数に指定したカテゴリーidが、第2引数に指定したカテゴリーidの祖先であればTRUEが返ります
 - 第2引数のカテゴリーが子でも孫でもひ孫でもTRUEとなります。末代まで判定してくれます
 
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。