web-dev-qa-db-fra.com

Parcourez toutes les balises et les messages de sortie dans la liste alphabétique

J'ai un tas d'articles qui ont chacun plusieurs étiquettes et j'essaie de trouver un moyen de les afficher tous sur une seule page, organisés sous une liste alphabétique de leurs étiquettes respectives. Par exemple. si Post1 a les balises A, B et D et Post2 a les balises A, C et D, le résultat devrait ressembler à ceci:

Tag A
Post1
Post2

Tag B
Poste 1

Tag C
Post2

Tag D
Post1
Post2

EDIT: Je l'ai eu avec des catégories, mais j'aimerais quand même qu'il fonctionne avec des balises. (Tous les ID exclus sont parce que j'utilise techniquement des catégories pour une autre organisation.) Le code fonctionnel est le suivant:

<?php $cat_args = array(
    'orderby' => 'title',
    'order' => 'ASC',
    'exclude' => '26,27,32,52,36,31,42,38,41'
    );

$categories = get_categories($cat_args);
    foreach ($categories as $category)
    {
    $catID = $category->term_id;
    $catName = $category->name;
    echo '<strong>'.$catName.'</strong>';
        global $post; // required
        $pArgs = array('category' => $catID,'post_type' => 'shows','orderby' => 'title', 'order' => 'ASC');
        $custom_posts = get_posts($pArgs);
        foreach($custom_posts as $post) : setup_postdata($post);  ?>
            <div class="show">
            <a href="<?php the_permalink(); ?>">
                            <?php the_post_thumbnail("show"); ?>
                <h3 class="center"><?php the_title(); ?></h3>
            </a>
            </div>
        <?php endforeach; ?>
        <?php } ?>
2
Linn

(Non testé) mais devrait fonctionner avec n'importe quelle taxonomie, y compris la taxonomie 'tag' (post_tag). L'exemple suivant utilise la taxonomie avec le nom 'my-taxonomy'.

<?php
//Get terms for this taxonomy - orders by name ASC by default
$terms = get_terms('my-taxonomy');

//Loop through each term
foreach($terms as $term):

   //Query posts by term. 
   $args = array(
    'orderby' => 'title', //As requested in comments
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'field' => 'slug',
            'terms' => array($term->slug)
        )
     ));
    $tag_query = new WP_Query( $args );

    //Does tag have posts?
    if($tag_query->have_posts()):

        //Display tag title
        echo '<h2> Tag :'.esc_html($term->name).'</h2>';

        //Loop through posts and display
        while($tag_query->have_posts()):$tag_query->the_post();
            //Display post info here
        endwhile;

    endif; //End if $tag_query->have_posts
    wp_reset_postdata();
 endforeach;//Endforeach $term

?>
2
Stephen Harris

Voici le code final que j'ai utilisé avec une taxonomie personnalisée (édité sur la base de la réponse de Stephen ci-dessus pour que cela fonctionne réellement - je ne faisais que interroger des catégories avec mon ancien code):

<?php $terms = get_terms('dates');
    foreach($terms as $term):
        $args = array(
        'orderby' => 'title',
        'tax_query' => array(
            array( 
                'taxonomy' => 'dates',
                'field' => 'slug',
                'terms' => array($term->slug)
            )
        )
        );
        $tag_query = new WP_Query( $args );
        if($tag_query->have_posts()):
            echo '<strong>'.esc_html($term->name).'</strong>';
            while($tag_query->have_posts()):$tag_query->the_post(); ?>
                <div class="show">
                    <a href="<?php the_permalink(); ?>">
                        <?php the_post_thumbnail("show"); ?>
                        <h3 class="center"><?php the_title(); ?></h3>
                    </a>
                </div><!-- .show -->
            <?php endwhile;
        endif; //End if $tag_query->have_posts
        wp_reset_postdata();
    endforeach; //Endforeach $term
?>
3
Linn
    $tags = get_tags();

    foreach($tags as $tag) {

    echo '<strong>'.$tag->name.'</strong>';

   $args=array( 
  ‘tag__in’ => array($tag->term_id),
   ‘showposts’=>5, 
   ‘caller_get_posts’=>1 
   ); 
   $my_query = new WP_Query($args); 
   if( $my_query->have_posts() ) { 
     while ($my_query->have_posts()) : $my_query->the_post();
     .........
     endwhile; 

    }

    }
1
Rajeev Vyas

Vous devez d’abord obtenir tous les tags que vous avez utilisés, puis les transmettre à WP_Query et obtenir tous les articles.

<?php
$tags = get_tags();
$tag_str = array();
foreach($tags as $tag) {
    $tag_str[] = $tag->name;
}

if(!empty($tag_str)){
    $tag_str = implode('+', $tag_str);
    $my_query = new WP_Query(array('orderby' => 'title', 'order' => 'ASC', $tag => $tag_str));

    if($my_query->have_posts()):
        while($my_query->have_posts()):$my_query->the_post();
            //loop here
        endwhile;
    endif;
    wp_reset_postdata();
} else {
    //do something if no tags found
}
?>

Pas essayé ce code, mais devrait vous donner une idée. Mettez les contrôles supplémentaires si nécessaire.

0
Rutwick Gangurde