Recuperando 3 últimas postagens de cada um dos 5 tipos de postagem personalizados diferentes

Tenho 5 diferentes tipos de postagem personalizada. Estou mostrando 15 últimas postagens deles na minha página inicial usando a seguinte consulta:

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

Funciona bem, mostra as últimas 15 postagens desses 5 tipos de postagem personalizados. Mas o problema é que existem muitas atualizações no cpt1 e cpt3 (cerca de 8-10 mensagens por dia em cada tipo de publicação). Então, na página inicial, raramente encontro posts do cpt2 / 4/5 .

Então eu quero mostrar as últimas 3 postagens de cada tipo de publicação (total 15 postagens) usando a data como ordem por (sorting). Então, 3 postagens de cada tipo de publicação serão visíveis e ordenadas com base na data entre os 5 tipos de publicação. Mas não consegui encontrar nenhuma boa solução para isso.

O que veio até agora na minha opinião é, executando 5 consultas e salvando-as em uma matriz e, em seguida, classificá-las.

Existe de qualquer forma eu posso fazer isso usando apenas uma consulta, em vez de 5 consultas?

Solutions Collecting From Web of "Recuperando 3 últimas postagens de cada um dos 5 tipos de postagem personalizados diferentes"

Não tenho certeza, se esta é a opção mais eficiente ou não, mas o fiz da seguinte maneira:

  1. Eu armazenei 5 consultas separadas usando get_posts e as armazenei em uma única matriz
  2. Eu tive que aplainar a matriz, já que era multidimensional. Em seguida, usamos usort usando post_date para obter a última postagem
  3. Salvei esses dados ordenados usando a API Transiente , para minimizar a chamada do database.

Aqui está o código:

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

Não há como fazer isso em uma única consulta. Você deve separá-lo em múltiplas consultas, pois os comandos SQL não são criados para lidar com esse tipo de processamento e, portanto, nem o WordPress’s Query API.