• 解決済 kamachouji

    (@kamachouji)


    現在以下のような形で、親カテゴリアーカイブに、
    そのカテゴリへ属する記事についているタグの一覧を表示しています。
    本来はここに該当親カテゴリの子カテゴリについたタグも表示したいのですが、
    どうにも方法が見つけられず。。ご教授お願いいたします。

    <?php
    $cat_id = get_queried_object()->cat_ID;
    
    // 表示中のカテゴリーに属する投稿のIDを配列で取得
    $current_posts = get_objects_in_term( $cat_id, 'category' );
    
    // 表示中のカテゴリーに属する投稿に付けられたタグの情報をまとめて取得
    $current_tags = wp_get_object_terms( $current_posts, 'post_tag' );
    if ( is_category() and $current_tags ) {
        foreach( $current_tags as $tag ){
            echo '<li><a href="' . $new_uri = add_query_arg( 'tag', $tag -> slug, '/' ) . '">' . $tag -> name . '</a></li>' . "\n";
        }
    }
    ?>
    • このトピックはkamachoujiが8年、 1ヶ月前に変更しました。
    • このトピックはkamachoujiが8年、 1ヶ月前に変更しました。
7件の返信を表示中 - 1 - 7件目 (全7件中)
  • 関数 get_categories() のパラメータ child_of を使って子孫カテゴリー(または parent を使って子だけ)を取得できます。

    言葉足らずでしたので追記します。
    親カテゴリー、子カテゴリー(孫カテゴリー)それぞれから get_objects_in_term() で投稿 ID の配列を取得した後、それを PHP の array_merge() でひとまとめにしてから(重複排除が必要なら array_unique() にも通してから)、wp_get_object_terms() へ渡せば良いかなと思います。

    • この返信は8年、 1ヶ月前にgblsmが編集しました。
    トピック投稿者 kamachouji

    (@kamachouji)

    ご返信ありがとうございます!

    動きのイメージはできるのですが、
    力不足でどのようにソースに落とせばいいのか分からずにいます。。

    今回の場合はどのように書けば良いでしょうか。。稚拙で申し訳ありません。

    先に謝る必要はありませんよ。コードを書くのに挑戦しませんか。最初のコードは自作なのですよね。

    コメントさせていただいた中に説明ページのリンクを貼ってありますから、そのページにある用例を参考にしてコードを書いてみてはどうですか。それでわからないところを相談していただければと思います。

    トピック投稿者 kamachouji

    (@kamachouji)

    ありがとうございます。
    ここで相談させていただくまで以下のような形で挑戦していたのですが、
    上手くうごかず、やむなく親カテのタグのみにしておりました。

    <?php
    $cat_id = get_queried_object()->cat_ID;
    
    // 表示中のカテゴリーに属する投稿のIDを配列で取得
    $parent_posts = get_objects_in_term( $cat_id, 'category' );
    
    // 表示中のカテゴリー>子カテゴリのIDを取得
    $args = array(	'child_of' => $cat_id,); 
    $categories = get_categories( $args );
    
    // 表示中のカテゴリー>子カテゴリに属する投稿のIDを配列で取得
    foreach( $categories as $val){
    $children_posts =  get_objects_in_term( $val->term_id, 'category' );
    }
    
    // 結合
    $current_posts = array_merge($parent_posts, $children_posts);
    
    // 表示中のカテゴリーに属する投稿に付けられたタグの情報をまとめて取得
    $current_tags = wp_get_object_terms( $current_posts, 'post_tag' );
    if ( is_category() and $current_tags ) {
        foreach( $current_tags as $tag ){
            echo '<li><a href="' . $new_uri = add_query_arg( 'tag', $tag -> slug, '/' ) . '">' . $tag -> name . '</a></li>' . "\n";
        }
    }
    ?>

    「表示中のカテゴリー>子カテゴリに属する投稿のIDを配列で取得」の部分がおかしい?ような気がするのですが、ご指南いただけますでしょうか。

    ※この状態だと子カテゴリの記事に属するタグ一覧のみで、親カテのみに属する記事のタグが出ておりません。。

    • この返信は8年、 1ヶ月前にkamachoujiが編集しました。
    • この返信は8年、 1ヶ月前にkamachoujiが編集しました。

    そのコードで「親カテゴリーのみに属する記事のタグが出ない」とは思えませんね。
    (親カテゴリーの記事のタグは出るけれど、子孫カテゴリーの記事のタグが少ししか出ない、と思われます。)

    コードをちょっと変えて検証してみたところ、これで必要なタグが表示できました。

    $cat_id = get_queried_object()->cat_ID;
    
    // 表示中のカテゴリーに属する投稿のIDを配列で取得
    $current_posts = get_objects_in_term( $cat_id, 'category' );
    
    // 表示中のカテゴリー>子カテゴリのIDを取得
    $args = array(
      'child_of' => $cat_id,
    );
    $categories = get_categories( $args );
    
    // 表示中のカテゴリー>子カテゴリに属する投稿のIDを配列で取得
    foreach ( $categories as $val ) {
      $more_posts = get_objects_in_term( $val->term_id, 'category' );
      // 結合
      $current_posts = array_merge( $current_posts, $more_posts );
    }
    
    // 表示中のカテゴリーに属する投稿に付けられたタグの情報をまとめて取得
    $current_tags = wp_get_object_terms( $current_posts, 'post_tag' );
    // category.php に書くなら if ( $current_tags ) { だけで大丈夫。
    if ( is_category() and $current_tags ) {
      foreach ( $current_tags as $tag ) {
        $new_uri = add_query_arg( 'tag', $tag->slug, home_url( '/' ) );
        echo '<li><a href="' . $new_uri . '">' . $tag->name . '</a></li>' . "\n";
      }
    }
    
    • この返信は8年、 1ヶ月前にgblsmが編集しました。
    トピック投稿者 kamachouji

    (@kamachouji)

    ありがとうございます!
    いただいたコードで意図する表示ができました!

    なるほど結合もループ内で行うべきだったのですね。
    大変勉強になりました。

    本当にありがとうございました!

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「カテゴリページで親カテゴリと属する子カテゴリのタグ一覧を表示したい」には新たに返信することはできません。