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
Post2Tag B
Poste 1Tag C
Post2Tag 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 } ?>
(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
?>
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
?>
$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;
}
}
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.