2016-02-10 3 views
0

Я хочу получить данные из двух разных типов сообщений в одном запросе, имеющем разные аргументы для типа post.Я использую следующий код, но как я могу объединить два результата в единственный запрос?Слияние двух типов сообщений в одном WP Query

$args = array(
     'post_type' => 'post', 
     'posts_per_page'=> '1', 
    ); 
    $args1 = array(
     'post_type' => 'page', 
     'posts_per_page'=> '3', 
    ); 
    $post_query = new WP_Query($args); 
    $page_query = new WP_Query($args1); 
+0

Вам нужно два запроса, по крайней мере, –

+0

Да, вы можете объединить '$ posts' свойства –

+0

Пожалуйста, проверьте, я обновил мой question.How может Теперь я объединяю два запроса в одном запросе? – Johny

ответ

1

У вас есть два варианта: объединить результаты или выполнить третий запрос. Мне всегда нравится последний, потому что тогда вы сохраняете объект запроса на месте, что весьма полезно для почтовых счетчиков и разбиения на страницы.

Мы должны быть умными здесь, так как это действительно может замедлить ход событий ненужным и может стать довольно дорогим, так это то, что мы будем делать

  • Выполнить два очень худой, очень умные запросы с get_posts (более оптимизирован как обычный WP_Query, так как он разбивает разбиение на страницы, что делает его более быстрым). Мы также просто запросим идентификаторы почтового ящика, а не полные. Это сделает эти запросы очень быстрыми и очень скудными. Это будет почти так же, как вы никогда не делали эти запросы ;-)

  • Как только у нас есть результаты из этих запросов, мы можем объединить идентификаторы и запустить окончательный запрос, чтобы возвращать полные объекты сообщения, которые мы можем использовать для запуска надлежащего петля

Давайте посмотрим на код

// Set our defaults to keep our code DRY 
$defaults = [ 
    'fields'     => 'ids', 
    'update_post_term_cache' => false, 
    'update_post_meta_cache' => false, 
    'cache_results'   => false 
]; 
// Set query args for query 1 
$args = [ 
    'post_type'  => 'post', 
    'posts_per_page' => '1', 
]; 
// Set query args for query 2 
$args1 = [ 
    'post_type'  => 'page', 
    'posts_per_page' => '3', 
]; 
$post_query = get_posts(array_merge($defaults, $args )); 
$page_query = get_posts(array_merge($defaults, $args1)); 

// Merge the two results 
$post_ids = array_merge ($post_query, $page_query); //. You can swop around here 

// We can now run our final query, but first mke sure that we have a valid array 
if ($post_ids) { 
    $final_args = [ 
     'post_type' => ['post', 'page'], 
     'post__in' => $post_ids, 
     'orderby' => 'post__in', // If you need to keep the order from $post_ids 
     'order'  => 'ASC' // If you need to keep the order from $post_ids 
    ]; 
    $loop = new WP_Query($final_args); 

    // Run your loop as normal 
} 
Смежные вопросы