web-dev-qa-db-fra.com

Récupération des 3 derniers messages de chacun des 5 types de messages personnalisés

J'ai 5 types de messages personnalisés différents. Je montre 15 derniers messages d'eux sur ma page d'accueil en utilisant la requête suivante:

$query = new WP_Query( array (
             'posts_per_page'   => 15,
             'post_type' => array ( 'cpt1', 'cpt2', 'cpt3', 'cpt4', 'cpt5' ) 
          )
 );

Cela fonctionne bien, affiche les 15 derniers messages de ces 5 types de messages personnalisés. Mais le problème est, il y a trop de mises à jour sur cpt1 et cpt3 ( environ 8-10 messages par jour sur chaque type de message). Donc, sur la page d’accueil, je trouve rarement des publications de cpt2/4/5 .

Je souhaite donc afficher les 3 derniers messages de chaque type de message (total de 15 messages) en utilisant la date comme ordre de (tri). Ainsi, 3 messages de chaque type de message seront visibles et triés en fonction de la date parmi les 5 types de message. Mais je ne pouvais pas trouver de bonne solution pour cela.

Ce qui m'est venu si loin dans mon esprit est d'exécuter 5 requêtes et de les enregistrer dans un tableau, puis de les trier.

Y a-t-il un moyen de le faire en utilisant une seule requête au lieu de 5?

2
тнє Sufi

Je ne sais pas si c'est l'option la plus efficace ou non, mais je l'ai fait de la manière suivante:

  1. J'ai stocké 5 requêtes séparées en utilisant get_posts et les ai stockées dans un seul tableau
  2. J'ai dû aplatir le tableau, car il était multidimensionnel. Puis utilisé usort en utilisant post_date pour obtenir le dernier message
  3. J'ai enregistré ces données triées à l'aide de API transitoire , afin de minimiser l'appel de base de données.

Voici le code:

function delete_front_page_query_results() {
    delete_transient('post_data');

    $query_cpt1 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt1'
            );
    $query_cpt2 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt2'
            );
    $query_cpt3 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt3'
            );
    $query_cpt4 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt4'
            );
    $query_cpt5 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt5'
            );

    $query_results[] = get_posts($query_cpt1);
    $query_results[] = get_posts($query_cpt2);
    $query_results[] = get_posts($query_cpt3);
    $query_results[] = get_posts($query_cpt4);
    $query_results[] = get_posts($query_cpt5);

    //flattening three dimentional array to two dimensonal array
    $flatten_array =array();
    foreach ($query_results as $data) {
            foreach($data as $flatten_data) {
                 $flatten_array[] = $flatten_data;
            }
    }

    function cpt_array_sort($a, $b) {
            return strtotime($b->post_date) - strtotime($a->post_date);
    }
    usort($flatten_array, 'cpt_array_sort');

    //setting transient with the array
    set_transient ( 'post_data', $flatten_array, 365*24*60*60);
}
add_action('publish_post', 'delete_front_page_query_results);
2
тнє Sufi

Il n'y a aucun moyen de faire cela dans une seule requête. Vous devez le séparer en plusieurs requêtes, car les commandes SQL ne sont pas conçues pour gérer ce type de traitement, de même que l'API de requête de WordPress.

0
Tyler Carter