web-dev-qa-db-ja.com

カスタム投稿タイプのタグのみを表示

分類法としてタグを含むカスタム投稿タイプがあります。カスタム投稿タイプのみに含まれるすべてのタグのリストを表示しようとしています。私は最初に使用しました:

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の場合、testtesttestなどとなります。

これはタグを宣言するコードです。

'taxonomies' => array('post_tag')

私のカスタム投稿タイプのみに固有のタグのリストを表示する方法を知っている人はいますか?

4
user34466

上記の解決策は正しく機能しますが、厳密には最適化されていません。これはあなたが探しているデータのために一度だけそのデータベースを問い合わせ、そしてあなたにタームオブジェクトのリストを与えるメソッドです。それは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>';
}
6
Bendoh