分類法としてタグを含むカスタム投稿タイプがあります。カスタム投稿タイプのみに含まれるすべてのタグのリストを表示しようとしています。私は最初に使用しました:
wp_tag_cloud();
リンク付きのタグのリストはうまく生成されますが、通常の投稿のタグが表示されます。私はこのような投稿をクエリしようとしました:
query_posts( array( 'post_type' => 'archive' ) );
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
the_tags('<ul><li>','</li><li>','</li></ul>');
wp_reset_query();
endwhile;
endif;
ただし、タグは重複して読み込まれます。たとえば、タグがtest
の場合、test
、test
、test
などとなります。
これはタグを宣言するコードです。
'taxonomies' => array('post_tag')
私のカスタム投稿タイプのみに固有のタグのリストを表示する方法を知っている人はいますか?
上記の解決策は正しく機能しますが、厳密には最適化されていません。これはあなたが探しているデータのために一度だけそのデータベースを問い合わせ、そしてあなたにタームオブジェクトのリストを与えるメソッドです。それはpost_type引数を受け取ることができ、もし引数が与えられなければ、現在のグローバル$ postオブジェクトのpost_typeを使います。
function post_type_tags( $post_type = '' ) {
global $wpdb;
if ( empty( $post_type ) ) {
$post_type = get_post_type();
}
return $wpdb->get_results( $wpdb->prepare( "
SELECT COUNT( DISTINCT tr.object_id )
AS count, tt.taxonomy, tt.description, tt.term_taxonomy_id, t.name, t.slug, t.term_id
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr
ON p.ID=tr.object_id
INNER JOIN {$wpdb->term_taxonomy} tt
ON tt.term_taxonomy_id=tr.term_taxonomy_id
INNER JOIN {$wpdb->terms} t
ON t.term_id=tt.term_taxonomy_id
WHERE p.post_type=%s
AND tt.taxonomy='post_tag'
GROUP BY tt.term_taxonomy_id
ORDER BY count DESC
", $post_type ) );
}
たとえば、post_type_tags( 'archive' )
を呼び出した場合、post_tagのtermオブジェクトのリストが 'archive'の投稿タイプの人気の高い順に表示されます。
そうすれば、リンクのリストを以下のようにして発行できます。
$archive_tags = post_type_tags( 'archive' );
foreach( $archive_tags as $tag ) {
echo '<a href="' . get_tag_link( $tag->term_id ). '">' . esc_html( $tag->name ) . '</a>';
}