Ce que j'essaie de réaliser: obtenir n
termes à partir d'une taxonomie personnalisée commandée par le plus récent message de chaque terme. Il sera utilisé pour afficher les derniers messages m
sous chaque terme.
Y a-t-il une meilleure façon de le faire que d'obtenir un tableau de tous les termes et de parcourir en boucle pour trouver le plus récent message dans chacun? Cette approche ne semble pas très efficace ou évolutive.
Mise à jour
Voici mon code de travail jusqu'à présent - peut-il être amélioré?
$taxonomy = 'industry'; //taxonomy name
$terms_to_display = 5; //number of terms to display
$posts_per_term = 4; // number of posts per term to display
$terms = get_terms( array('taxonomy' => $taxonomy, 'hide_empty' => true, 'fields' => 'ids' ) );
$news_items = [];
foreach ( $terms as $term ) {
$args = array (
'post_type' => 'news',
'posts_per_page' => $posts_per_term,
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array (
array (
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => array($term),
),
),
);
$news = new WP_Query( $args );
if ( $news->post_count == $posts_per_term ) { // ignore terms with not enough posts
$news_items[$term] = get_the_date("U", $news->posts[0]->ID); //get date of newest post in this term
}
wp_reset_query();
}
arsort ( $news_items ); //sort descending, keeping keys
$term_ids = array_keys ( array_slice($news_items, 0, $terms_to_display, true) ); //take 'n' newest and return an array of keys (term ids)
foreach ( $term_ids as $term_id ) {
$term = get_term ( $term_id, $taxonomy );
echo "<h2>" . $term->name . "</h2>";
$args = array (
'post_type' => 'news',
'posts_per_page' => $posts_per_term,
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array (
array (
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => array($term_id),
),
),
);
$news = new WP_Query( $args );
if ( $news->have_posts() ) {
echo "<ul>";
while ( $news->have_posts() ) {
$news->the_post();
echo "<li>" . get_the_title() . "</li>";
}
echo "</ul>";
}
wp_reset_query();
}
Fondamentalement, ce que vous faites en ce moment est le suivant:
industry
WP_Query
pour obtenir les messages les plus récents, parcourez-les pour trier les termes, en créant un nouveau tableau avec les identifiants des termesWP_Query
pour obtenir les messages les plus récents et les parcourirÇa fait beaucoup de WP_Query
ies. Essayons de réduire ce nombre.
Nous pouvons le faire comme ceci:
industry
WP_Query
pour obtenir les messages les plus récents, parcourez-les pour trier les termes et créez un nouveau tableauU
, et contiendra à la fois le terme objet et le tableau avec les objets post, nous n'aurons donc pas à les interroger à nouveau.Voici mon code suggéré:
$taxonomy = 'industry'; //taxonomy name
$terms_to_display = 5; //number of terms to display
$posts_per_term = 4; // number of posts per term to display
$terms = get_terms( array('taxonomy' => $taxonomy, 'hide_empty' => true ) );
$news_items = [];
foreach ( $terms as $term ) {
$args = array (
'post_type' => 'news',
'posts_per_page' => $posts_per_term,
'orderby' => 'date',
'order' => 'DESC',
'tax_query' => array (
array (
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => array( $term->term_id ),
),
),
);
$news_query = new WP_Query( $args );
// ignore terms with not enough posts
if ( $news_query->post_count < $posts_per_term ) {
continue;
}
$news_posts = $news_query->get_posts();
// get date of newest post in this term
$newest_post_date = get_the_date( "U", $news_posts[0]->ID );
$news_items[$newest_post_date] = array(
'term' => $term,
'news' => $news_posts,
);
}
krsort( $news_items ); // sort descending by keys
$news_items = array_slice( $news_items, 0, $terms_to_display );
wp_reset_query();
J'ai également apporté quelques modifications:
1. $terms
est maintenant un tableau des WP_Term
objets, pas seulement des identifiants
2. Fait le $news_query->post_count < $posts_per_term
vérifier légèrement plus lisible
Et comment utiliser:
foreach ( $news_items as $item ) {
echo "<h2>" . $item['term']->name . "</h2>";
echo "<ul>";
foreach ( $item['news'] as $news_post ) {
setup_postdata( $news_post );
echo "<li>" . get_the_title() . "</li>";
}
echo "</ul>";
}
wp_reset_query();
De cette façon, nous avons réduit le nombre de WP_Query
ies au nombre de termes non vides dans la taxonomie industry
, et a rendu le tableau résultant beaucoup plus utile.