解決方法ではないのですが、不思議に思うので教えてください。
get_terms が返すタームの一覧に、投稿が存在しないタグ(ターム)も含まれてしまうということですね。
しかし get_terms の hide_empty パラメータのデフォルトが true なので、投稿が存在するタグだけが返されるとばかり思っていました。
関数リファレンス/get terms
すみません、的外れなコメントをしてしまったかもしれないので改めて。
「カテゴリーとタグの関連付け」や「カテゴリーに属するタグ」と書いておられますが、例えばカテゴリー inu, neko と投稿タグ inu, neko があるということでしょうか。
どのようなカテゴリーとタグが付いた投稿があって、カテゴリーアーカイブページにどのように表示したいのか、よろしければ具体例を挙げて頂けませんか。
コメントありがとうございます。
もう少し詳しく書くべきでした。
[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. タグの配列から重複を排除。
ありがとうございます。
大分行き詰まっていたので、アドバイスを頂けて嬉しいです。
あまりPHPには明るくないですが、提案して頂いた3点を踏まえて試行錯誤してみようと思います。
引き続き解決策は募っていこうと思いますが、その間に試行錯誤の結果が出たら、改めてこちらのトピックで報告致します。
次のコードで求めていた結果を得ることができました。
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
の方はカテゴリーを複数指定すると同じ投稿が重複して出てくる場合がありますが、でも今回の使い方では重複を気にしなくて構わないです。
get_objects_in_term
の第一パラメータに整数ではなく配列で複数指定すると重複する可能性がでてくるんですね。
今回は大丈夫という事で安心しましたが、こちらも後学のために覚えておこうと思います。
細かな疑問にまで答えて頂いて感謝します。
ありがとうございました。