web-dev-qa-db-fra.com

Comment afficher une archive de balises d'un seul type de message

J'ai un site avec plusieurs types de post personnalisés et taxonomies. Les taxonomies sont partagées entre tous les types de publication.

Sur la page d'archives du type de message "vidéos", je souhaite afficher une liste de toutes les balises "pays" associées aux vidéos. Lorsque ce lien est cliqué, j'aimerais pouvoir accéder aux archives de ce pays, mais cela ne montre que les "vidéos", pas les autres types d'articles qui peuvent avoir la même étiquette de pays.

Je dois également pouvoir faire la même chose pour d’autres types de postes et taxonomies, par exemple. lorsque dans l'archive de type de publication 'galeries', un nuage de tags est affiché, lequel renvoie à l'archive de balises ne montrant que les galeries.

Je pense que cela devrait être facile, mais je n'arrive pas à comprendre!

Dois-je créer des modèles d'archive prenant les arguments transmis via l'URL? Par exemple. mysite.com/country/canada?type=video

..et ensuite manipuler la fonction get_tags en quelque sorte? Je ne peux vraiment pas comprendre ce que je pense.

Bravo pour votre aide.

1
kdev

J'ai élaboré une solution à cela. J'espère que cela peut aider quelqu'un d'autre.

Ajoutez d’abord les deux fonctions suivantes à votre fichier functions.php (ou plugin):

function get_terms_by_post_type( $taxonomies, $post_types ) {
    global $wpdb;
    $query = $wpdb->prepare( "SELECT t.*, COUNT(*) from $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id WHERE p.post_type IN('".join( "', '", $post_types )."') AND tt.taxonomy IN('".join( "', '", $taxonomies )."') GROUP BY t.term_id");
    $results = $wpdb->get_results( $query );
    return $results;
}

function show_post_type_terms($taxonomy, $posttype = null ) {
    global $post;
    if(!isset($posttype)) $posttype = get_post_type( $post->ID );
    $terms = get_terms_by_post_type( array($taxonomy), array($posttype) );
    echo '<ul>';
    foreach($terms as $term) {
        $output = '<li><a href="'.get_bloginfo('url').'/'.$taxonomy.'/'.$term->slug.'/?post_type='.$posttype.'">'.$term->name.'</a></li>';
        echo $output;
    }
    echo '</ul>';
}

Désormais, sur vos pages d'archives de type publication personnalisées, vous pouvez utiliser <?php show_post_type_terms('country'); ?>, en remplaçant "pays" par la taxonomie que vous souhaitez renvoyer.

Une requête est ajoutée à la fin des liens créés pour renvoyer uniquement le type de publication que vous visualisez actuellement. Si vous êtes sur une page d'archive 'vidéos', elle sera liée à une archive de taxonomie affichant uniquement les publications vidéo.

2
kdev

OK, j'ai une réponse partielle à ma propre question.

Je peux utiliser les éléments suivants pour générer une liste de termes de taxonomie avec des liens ne montrant que le type de publication actuel:

$args = array( 'taxonomy' => 'country' );

$terms = get_terms('country', $args);

$count = count($terms); $i=0;

if ($count > 0) {
    $term_list = '<ul class="my_term-archive">';
    foreach ($terms as $term) {
        $i++;
        $term_list .= '<li><a href="/country/' . $term->slug . '/?post_type='.get_post_type( $post->ID ).'" title="' . sprintf('View all posts filed under %s', $term->name) . '">' . $term->name . '</a></li>';
    }
    echo $term_list.'</ul>';
}

Mon problème restant est que cela répertorie toujours les termes de taxonomie auxquels aucune vidéo n'est jointe. Par exemple. peut-être qu'un autre type de message a reçu l'étiquette "pays" du mot "Canada". Même s'il n'y a pas de "vidéos" étiquetées avec "Canada", "Canada" sera toujours affiché dans cette liste.

0
kdev

Je pense que je peux répondre à une partie de cela. Vous avez besoin d'un filtre dans votre fichier functions.php pour forcer la boucle dans votre modèle tag.php à coopérer.

/**
 * Function and filter to force tag.php (tag archives) to display only video custom post types. 
 */
function add_custom_types_to_tag_archives( $query ) {
    if( is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
        $post_types = array( 'video' );
        $query->set( 'post_type', $post_types );
        return $query;
    }
}
add_filter( 'pre_get_posts', 'add_custom_types_to_tag_archives' ); 

J'espère que cela t'aides. C'est la première fois que je réponds à une question ici :)

0
Ben Pearson