the_category()
で表示されるカテゴリは the_category_list
フィルターで変更することができます。
今回の場合、ある子カテゴリとともに親カテゴリにも属しているならその子カテゴリを除外する、というふうにすれば実現できます。
そこで、親カテゴリと言わず、祖先カテゴリ(親の親……etc.)すべてにわたって判別できるコードを書いてみました。
これは functions.php に追記してください。
function my_category_list( $categories, $post_id ) {
$cats = $categories;
// カテゴリを一つずつ処理
foreach ( $categories as $key => $category ) {
$ancestor = $category;
// カテゴリの祖先を一つずつ辿る
while ( ! empty( $ancestor->parent ) && $ancestor = get_category( $ancestor->parent ) ) {
// 祖先カテゴリが記事に含まれれば
if ( in_array( $ancestor, $categories, true ) ) {
// 元のカテゴリを除外
unset( $cats[ $key ] );
break;
}
}
}
return $cats;
}
add_filter( 'the_category_list', 'my_category_list', 10, 2 );
なおテストはしていないのでご参考までに。
LABE様
返信いただき、ありがとうございます。
書いていただいたコードをfunctions.phpに入れてみたのですが
何も変化がないようなのです。
今はSingle.php内のループに<?php the_category(); ?>を書いている状態で、
functions.phpには上記のコードをそのまま入れています。
理解不足で申し訳ありません。
すみません、 in_array()
のカテゴリオブジェクトに対する挙動が思っていたのと違ったようです。
今度はちょっとこちらでテストして大丈夫だったので、いかがでしょうか。
function my_category_list( $categories, $post_id ) {
$cats = $categories;
// IDだけにする
$cats_ID = array_map( function ( $cat ) {
return $cat->term_id;
}, $cats );
// カテゴリを一つずつ処理
foreach ( $categories as $key => $category ) {
$ancestor = $category;
// カテゴリの祖先を一つずつ辿る
while ( ! empty( $ancestor->parent ) && $ancestor = get_category( $ancestor->parent ) ) {
// 祖先カテゴリが記事に含まれれば
if ( in_array( $ancestor->term_id, $cats_ID, true ) ) {
// 元のカテゴリを除外
unset( $cats[ $key ] );
break;
}
}
}
return $cats;
}
add_filter( 'the_category_list', 'my_category_list', 10, 2 );
LABEさま
ありがとうございます!無事想像通りの表示とすることができました!
もう一点、例えば書いていただいたコードで
・テストA
・テストB
と表示できていますが、そのうち強制的に1つのみ表示にすることはできますか?
「テストA」「テストB」のどちらかであればどちらも大丈夫なのですが
デザインの都合もあり、複数選択した時でも1件のみしか表示しないという方法があれば教えていただきたいのですが可能でしょうか?
立て続けに申し訳ありません。よろしくお願いいたします。
親カテゴリのみに限定したうえで、そのうちの一つだけを表示する、ということでよろしいですか?
その場合、上でお示ししたコードの下から3行目、
return $cats;
を
return array( reset( $cats ) );
に変えていただくといいかと思います。
LABEさま
ありがとうございます!無事1件表示にすることができました。
丁寧に教えていただきありがとうございました!