サポート » 使い方全般 » category.phpでカテゴリーに属するタグだけを表示

  • 解決済 developer

    (@6flat)


    現在次のようにしてすべての記事に属するすべてのタグを表示させています。
    タグをクエリパラメータにする事でカテゴリーとタグの関連付けを維持させたいのですが、この方法だと当然ですが投稿が存在しないタグも表示されてしまいます。
    これを、タイトル通りにカテゴリーに属するタグだけを表示させる事で解決したいのですが、どうしたら良いか分からずにいます。
    何か良い方法があればお教え頂けると幸いです。

    <?php
    if ( is_category() ) {
        $posttags =  get_terms( "post_tag" );
        if ( $posttags ) {
            echo '<ul>';
            foreach( $posttags as $tag ) {
                echo '<li><a href="' . get_bloginfo(url) . $new_uri = add_query_arg( 'tag', $tag->slug, $_SERVER['REQUEST_URI'] ) . '">' . $tag->name . '</a></li>';
            }
            echo '</ul>';
        }
    }
    ?>
8件の返信を表示中 - 1 - 8件目 (全8件中)
  • 解決方法ではないのですが、不思議に思うので教えてください。
    get_terms が返すタームの一覧に、投稿が存在しないタグ(ターム)も含まれてしまうということですね。
    しかし get_terms の hide_empty パラメータのデフォルトが true なので、投稿が存在するタグだけが返されるとばかり思っていました。
    関数リファレンス/get terms

    すみません、的外れなコメントをしてしまったかもしれないので改めて。
    「カテゴリーとタグの関連付け」や「カテゴリーに属するタグ」と書いておられますが、例えばカテゴリー inu, neko と投稿タグ inu, neko があるということでしょうか。
    どのようなカテゴリーとタグが付いた投稿があって、カテゴリーアーカイブページにどのように表示したいのか、よろしければ具体例を挙げて頂けませんか。

    トピック投稿者 developer

    (@6flat)

    コメントありがとうございます。
    もう少し詳しく書くべきでした。

    [Post-A]
    Category: animal > dog
    Tag: wan, little
    
    [Post-B]
    Category: animal > cat
    Tag: nyan, little
    
    [Post-C]
    Category: animal > dog
    Tag: wan, big

    上の様なカテゴリ・タグが与えられた投稿があった場合、カテゴリー「dog」を開いた時にタグ「wan」「little」「big」だけが表示されるようにしたいのです。(現状ではタグ「nyan」も表示されてしまいます)

    ただ投稿のあるタグを全て表示してアクセスするだけだと、カテゴリー「dog」が維持されずに
    http://example.com/tag/wan/
    とタグアーカイブを開く事になってしまいます。

    これを次の様に、カテゴリを維持したままタグを選択する事で投稿を絞り込む様な作りにしたいのです。
    http://example.com/category/dog/?tag=wan

    上の状態ではタグ「wan」が選択されているので表示される投稿は「Post-A」「Post-C」です。

    次にこの状態でタグ「big」を選択すると、URLは以下のようになり、表示される投稿は「Post-C」になります。
    http://example.com/category/dog/?tag=big

    ここでタグ「nyan」を選択してしまうと、カテゴリー「dog」には該当する記事が存在しないので記事が存在しないと返されてしまいます。

    説明下手なので分かり難いかもしれませんが、上の様な事が実現したい内容です。

    カテゴリーとタグに直接の関連付けがある訳ではなくて
    投稿を中心にして関連付けがあるんですね。
    そうすると、こんなコードが書ければよさそうです。

    1. get_objects_in_term を使って、表示中のカテゴリーが付いた投稿のIDを配列で取得する。
    2. wp_get_object_terms の第一パラメータに投稿IDの配列を与えてタグの一覧を取得。
    3. タグの配列から重複を排除。

    トピック投稿者 developer

    (@6flat)

    ありがとうございます。
    大分行き詰まっていたので、アドバイスを頂けて嬉しいです。
    あまりPHPには明るくないですが、提案して頂いた3点を踏まえて試行錯誤してみようと思います。
    引き続き解決策は募っていこうと思いますが、その間に試行錯誤の結果が出たら、改めてこちらのトピックで報告致します。

    トピック投稿者 developer

    (@6flat)

    次のコードで求めていた結果を得ることができました。
    gblsmさんに適切な関数を教えて頂いたおかげで、特に難しく考えずにできました。
    ただ、3.にあるタグの配列の重複というのは、表示上では特に問題がなさそうだったので行っていないのですが、私が勘違いしているだけで、そのような処理も組み込んでおいた方が良いのでしょうか?

    <?php
    // 現在のカテゴリーのIDを取得
    $cat_id = get_query_var( 'cat' );
    if( !$cat_id ){
        $cat_now = get_the_category();
        $cat_now = $cat_now[0];
        $cat_id  = $cat_now -> 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 ) {
        echo '<ul>' . "\n";
        foreach( $current_tags as $tag ){
            echo '<li><a href="' . get_bloginfo( url ) . $new_uri = add_query_arg( 'tag', $tag -> slug, $_SERVER['REQUEST_URI'] ) . '">' . $tag -> name . '</a></li>' . "\n";
        }
        echo '</ul>';
    }
    ?>

    6flat さん、うまく表示できてよかったです。

    タグの配列の重複排除は、もしかしたらと思って用心のため挙げたのですが、いま改めて wp_get_object_terms のコードを見ると重複することはないので大丈夫です。
    get_objects_in_term の方はカテゴリーを複数指定すると同じ投稿が重複して出てくる場合がありますが、でも今回の使い方では重複を気にしなくて構わないです。

    トピック投稿者 developer

    (@6flat)

    get_objects_in_termの第一パラメータに整数ではなく配列で複数指定すると重複する可能性がでてくるんですね。
    今回は大丈夫という事で安心しましたが、こちらも後学のために覚えておこうと思います。
    細かな疑問にまで答えて頂いて感謝します。
    ありがとうございました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「category.phpでカテゴリーに属するタグだけを表示」には新たに返信することはできません。