審判!
この記事の所要時間: 355

カテゴリー一覧を表示しているときに in_category() を使ってカテゴリ判定してなにかを表示しようとすると「その記事に含まれているカテゴリ」ということで、指定カテゴリではないのに表示されてしまうことがあります。

たとえば…

「ニュース」一覧ページで特別なメッセージを表示したい

カテゴリ「ニュース」の一覧を表示したい場合に archive.php などで下記のように分岐します。

if ( in_category( ‘news’ ) ) { echo “ニュース一覧ページへようこそ!てきな”; }

これだと、他のカテゴリの一覧に「ニュース」カテゴリが含まれた記事があっても

ニュース一覧ページへようこそ!

って表示されるときがあります。

カテゴリー指定ならば、本来は category-news.php を作って個別で表示すればよいので、そうすれば終わり…です。

ただ、『「ニュース」カテゴリじゃない場合』という指定だとそうもいきません。

if ( ! in_category( ‘news’ ) ) { echo “ニュース一覧ページじゃないよ”; }

これだとニュースページでも「ニュース一覧ページじゃないよ」ってなっちゃいます。

また細かく出来なかったりします。

特定のカテゴリーに属するかを判定(一番親で判定する)

そこでこんな感じで「指定しているカテゴリ」かどうかわかるメソッドを作ってみました。

指定しているカテゴリーの子、孫、でもいいようになっています。

そういうのダメってときは勝手に改造してくださいw

// 表示しているページが該当カテゴリを指定しているか 親カテゴリーで判定
function get_is_current_category( $cat_slug = "" ) {
  $_is_current_category = false;
  if ( is_archive() && is_category() ) {
    global $cat;
    $_cat_info = get_category( $cat );

    $ancestor = array_pop( get_ancestors( $_cat_info->term_id, 'category' ) );

    $_current_cat = get_category( $ancestor )->slug; // スラッグ取得

    if ( $_current_cat === $cat_slug ) {
      $_is_current_category = true;
    }
  } elseif ( is_singular() ) {
    if ( true === in_category( $cat_slug ) ) {
      $_is_current_category = true;
    }
  }
  return $_is_current_category;
}

テーマのテンプレートなどで使えるかなと思います。

ほんとにテキトーでどこで使うのかわからないサンプルコードなんですが、こんな感じで…

archive.php なんかに突っ込んでみました。

<?php 
if ( get_is_current_category( 'cms' ) ) {
?>
<h2>CMS関連記事</h2>
<?php 
}
?>

そうすると、こうなります。

そしてその子カテゴリーであるWordPressカテゴリー

https://blog.gti.jp/post-category/cms/wordpress/

見ると「CMS関連記事」って出てますね。

他のカテゴリを見ると…

「かいはつもの」では表示されません。

https://blog.gti.jp/post-category/develop/

しかし、孫カテゴリの「プラグイン」では表示されます。

https://blog.gti.jp/post-category/cms/wordpress/plugins-wp/

指定カテゴリーのアーカイブページ(一覧ページ)でどうこうしたいっていう場合にどうぞ。

…ああ、広告出したり、そういうサンプルのほうが実用的なのかな。

この記事が気に入ったら
いいね ! しよう

Twitter で