web-dev-qa-db-fra.com

afficher les balises du type de message personnalisé UNIQUEMENT

J'ai un type de message personnalisé avec des balises incluses en tant que taxonomie. J'essaie d'afficher une liste de toutes les balises qui sont dans le type de message personnalisé uniquement. J'ai d'abord utilisé:

wp_tag_cloud();

ce qui génère bien la liste des tags avec des liens mais montre les tags des posts normaux. J'ai essayé d'interroger les messages comme ceci:

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;

mais il montre les balises dans les charges en double. Par exemple, si j'avais la balise test, elle dirait test, test, test et ainsi de suite.

C'est le code qui déclare les tags

'taxonomies' => array('post_tag')

Est-ce que quelqu'un connaît un moyen d'afficher une liste de balises spécifiques à mon type de message personnalisé uniquement?

4
user34466

Les solutions ci-dessus fonctionnent correctement mais ne sont pas optimisées exactement. Voici une méthode qui interroge cette base de données UNE FOIS sur les données que vous recherchez et vous fournit une liste d'objets termes. Il peut accepter un argument post_type et, s'il n'est pas fourni, utilisera le type post_type de l'objet global $ post en cours.

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

Ainsi, si vous avez appelé post_type_tags( 'archive' ), par exemple, vous obtiendrez une liste d'objets terme pour post_tag par ordre décroissant de popularité pour les types de publication 'archive'.

Vous pouvez ensuite émettre votre liste de liens comme ceci:

$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