it-swarm.com.ru

Получение 3 последних сообщений из каждого из 5 различных типов сообщений

У меня есть 5 различных пользовательских типов сообщений. Я показываю 15 последних сообщений из них на моей домашней странице, используя следующий запрос:

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

Он отлично работает, показывает последние 15 сообщений из этих 5 пользовательских типов сообщений. Но проблема в том, что слишком много обновлений cpt1 и cpt3 ( около 8-10 сообщений в день на каждый тип сообщения). Поэтому на домашней странице я редко нахожу сообщения от cpt2/4/5 .

Поэтому я хочу показать последние 3 сообщения из каждого типа сообщений (всего 15 сообщений), используя дату в порядке упорядочения (сортировка). Таким образом, 3 сообщения из каждого типа сообщений будут видны и отсортированы по дате среди всех 5 типов сообщений. Но я не смог найти хорошего решения для этого.

Что мне пришло в голову, так это запустить 5 запросов и сохранить их в массив, а затем отсортировать их.

Есть ли в любом случае я могу сделать это, используя только один запрос, а не 5 запросов?

2
тнє Sufi

Я не уверен, является ли это наиболее эффективным вариантом или нет, но я сделал это следующим образом:

  1. Я сохранил 5 отдельных запросов с использованием get_posts и сохранил их в одном массиве
  2. Мне пришлось сгладить массив, так как он был многомерным. Затем использовал usort, используя post_date, чтобы получить последнее сообщение
  3. Я сохранил отсортированные данные, используя Transient API , чтобы минимизировать вызов базы данных.

Вот код:

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

Нет способа сделать это в одном запросе. Вы должны разделить его на несколько запросов, так как команды SQL не созданы для обработки этого типа, и, следовательно, ни API запросов WordPress.

0
Tyler Carter