[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です。