カテゴリー一覧を表示しているときに 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
}
?>
そうすると、こうなります。
見ると「CMS関連記事」って出てますね。
他のカテゴリを見ると…
「かいはつもの」では表示されません。
https://blog.gti.jp/post-category/develop/
しかし、孫カテゴリの「プラグイン」では表示されます。
https://blog.gti.jp/post-category/cms/wordpress/plugins-wp/
指定カテゴリーのアーカイブページ(一覧ページ)でどうこうしたいっていう場合にどうぞ。
…ああ、広告出したり、そういうサンプルのほうが実用的なのかな。