サポート » 使い方全般 » ループ内で、親と子カテゴリーを選択したとき、親カテゴリーのみ表示したい

  • 解決済 limia25

    (@limia25)


    初めて質問させていただきます。よろしくお願いいたします。

    ループ内で、その記事が属しているカテゴリーをリンク付きで表示したいと思っております。
    例えば

    ■テストA
     LテストAの子カテゴリー
    ■テストB

    上記のカテゴリー全てにチェックを入れたとき、<?php the_category(); ?>で出力すると、
    ・テストA
    ・テストAの子カテゴリー
    ・テストB

    と、チェックしたものすべて表示されますが、

    ・テストA
    ・テストB
    と表示されるようにしたいのですが、可能でしょうか?
    <?php the_category(); ?>で表示する時のように、リストタグで、
    リンク付きで表示したいです。

    よろしくお願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • LABE

    (@latobeam)

    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 );

    なおテストはしていないのでご参考までに。

    トピック投稿者 limia25

    (@limia25)

    LABE様

    返信いただき、ありがとうございます。
    書いていただいたコードをfunctions.phpに入れてみたのですが
    何も変化がないようなのです。

    今はSingle.php内のループに<?php the_category(); ?>を書いている状態で、
    functions.phpには上記のコードをそのまま入れています。
    理解不足で申し訳ありません。

    LABE

    (@latobeam)

    すみません、 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 );
    トピック投稿者 limia25

    (@limia25)

    LABEさま

    ありがとうございます!無事想像通りの表示とすることができました!
    もう一点、例えば書いていただいたコードで
    ・テストA
    ・テストB
    と表示できていますが、そのうち強制的に1つのみ表示にすることはできますか?
    「テストA」「テストB」のどちらかであればどちらも大丈夫なのですが
    デザインの都合もあり、複数選択した時でも1件のみしか表示しないという方法があれば教えていただきたいのですが可能でしょうか?

    立て続けに申し訳ありません。よろしくお願いいたします。

    • この返信は7年前にlimia25が編集しました。
    LABE

    (@latobeam)

    親カテゴリのみに限定したうえで、そのうちの一つだけを表示する、ということでよろしいですか?
    その場合、上でお示ししたコードの下から3行目、

        return $cats;

        return array( reset( $cats ) );

    に変えていただくといいかと思います。

    トピック投稿者 limia25

    (@limia25)

    LABEさま

    ありがとうございます!無事1件表示にすることができました。
    丁寧に教えていただきありがとうございました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「ループ内で、親と子カテゴリーを選択したとき、親カテゴリーのみ表示したい」には新たに返信することはできません。