web-dev-qa-db-fra.com

Obtenez les termes commandés par date de publication

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

}
1
mistertaylor

Fondamentalement, ce que vous faites en ce moment est le suivant:

  1. Obtenez tous les termes de la taxonomie industry
  2. Pour chaque terme, faites un 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 termes
  3. Trier et découper le nouveau tableau
  4. Pour chaque élément d'un nouveau tableau de termes, les identifiants font à nouveau un WP_Query pour obtenir les messages les plus récents et les parcourir

Ça fait beaucoup de WP_Queryies. Essayons de réduire ce nombre.

Nous pouvons le faire comme ceci:

  1. Obtenez tous les termes de la taxonomie industry
  2. Pour chaque terme, faites un WP_Query pour obtenir les messages les plus récents, parcourez-les pour trier les termes et créez un nouveau tableau
  3. Le nouveau tableau sera saisi avec une date au format U, 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_Queryies au nombre de termes non vides dans la taxonomie industry, et a rendu le tableau résultant beaucoup plus utile.

1
dboris