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?
Je ne sais pas si c'est l'option la plus efficace ou non, mais je l'ai fait de la manière suivante:
get_posts
et les ai stockées dans un seul tableauusort
en utilisant post_date
pour obtenir le dernier messageVoici 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);
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.