web-dev-qa-db-de.com

nUR Tags mit benutzerdefiniertem Beitragstyp anzeigen

Ich habe einen benutzerdefinierten Beitragstyp mit Tags als Taxonomie. Ich versuche, eine Liste aller Tags anzuzeigen, die nur im benutzerdefinierten Beitragstyp enthalten sind. Ich habe anfangs verwendet:

wp_tag_cloud();

dadurch wird eine Liste mit Tags mit Links erstellt, die jedoch die Tags der normalen Beiträge enthält. Ich habe versucht, die Beiträge wie folgt abzufragen:

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;

es werden jedoch die Tags in doppelten Ladevorgängen angezeigt. Wenn ich beispielsweise das Tag test hätte, würde es test, test, test und so weiter sagen.

Dies ist der Code, der die Tags deklariert

'taxonomies' => array('post_tag')

Kennt jemand eine Methode zum Anzeigen einer Liste von Tags, die nur für meinen benutzerdefinierten Beitragstyp spezifisch sind?

4
user34466

Die oben genannten Lösungen funktionieren ordnungsgemäß, sind jedoch nicht genau optimiert. Die folgende Methode fragt die Datenbank EINMAL nach den gesuchten Daten ab und zeigt eine Liste der Begriffsobjekte an. Es kann ein post_type-Argument akzeptieren und verwendet, falls keines angegeben ist, den post_type des aktuellen globalen $ post-Objekts.

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 ) );
}

Wenn Sie also zum Beispiel post_type_tags( 'archive' ) aufrufen, erhalten Sie eine Liste von Termobjekten für post_tag in absteigender Reihenfolge der Beliebtheit für "Archiv" -Posttypen.

Sie können dann Ihre Linkliste wie folgt ausgeben:

$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