Объединение запросов с разными аргументами для типа сообщений

Я создаю раздел на сайте, где я объединяю два разных типа сообщений в один цикл, а затем отображаю их случайным образом. Проблема в том, что мне трудно найти способ ограничить количество сообщений в каждом типе.

Вот что я пробовал:

  • Один запрос с несколькими типами сообщений может быть достигнут с помощью массива:

    $args = array( 'post_type' => array( 'photos', 'quotes' ), ... 

    … но не может ограничиваться определенным количеством сообщений для каждого типа.

  • Объединение двух массивов аргументов запроса перед запуском WP_Query на нем:

     $photos = array( 'post_type' => 'photos', 'posts_per_page' => 15, 'orderby' => 'rand' ); $quotes = array( 'post_type' => 'quotes', 'posts_per_page' => 5, 'orderby' => 'rand' ); $args = $photos + $quotes; // Also tried array_merge( $photos, $quotes ); 

    Не повезло. Случается, что последняя переменная $quotes перезаписывает $photos и показывает только кавычки.

  • Объединение двух объектов WP_Query вместе с помощью придания типов:

     $photos_query = new WP_Query( $photos ); $quotes_query = new WP_Query( $quotes ); $result = (object)array_merge( (array)$photos_query, (array)$quotes_query ); 

… и так далее.

Я мог бы, вероятно, использовать SQL-запрос прямо в базе данных, но мне нужно объединить эти два отдельных типа сообщений для одного цикла, упорядоченного случайным образом, и ограниченным количеством сообщений в каждом типе.

Спасибо за вашу помощь!

Один из способов – настроить SQL-запрос, выполняемый с помощью posts_clauses или других подобных фильтров. Чтобы найти их для поиска posts_clauses в «wp-includes / query.php» и см. Серию фильтров непосредственно перед этой строкой. Они вместе способны настраивать любую часть запроса

Еще одна вещь, которую вы можете сделать, – это вручную объединить запрошенные сообщения в объектах

 $photos_query = new WP_Query( $photos ); $quotes_query = new WP_Query( $quotes ); $result = new WP_Query(); // start putting the contents in the new object $result->posts = array_merge( $photos_query->posts, $quotes_query->posts ); // here you might wanna apply some sort of sorting on $result->posts // we also need to set post count correctly so as to enable the looping $result->post_count = count( $result->posts ); 

@mridual aggarwal ваш ответ очень хорош, но, к сожалению, он не объединяет 2 wp_query он показывает только сообщения из обоих в аранжировке. Я имею в виду 5 сообщений из первого и 5 из второго, но не отсортированных в одном, поэтому у меня есть это решение, и оно точно достигло цели для моего самоуправления, по крайней мере

 <?php $term = get_term_by( 'slug', get_query_var( 'tag' ), "post_tag" ); $tagslug = $term->slug; $post_types = get_post_types('','names'); ?> <?php //first query $blogposts = get_posts(array( 'tag' => $tagslug, //first taxonomy 'post_type' => $post_types, 'post_status' => 'publish', )); //second query $authorposts = get_posts(array( 'bookauthor' => $tagslug, //second taxonomy 'post_type' => $post_types, 'post_status' => 'publish', )); $mergedposts = array_merge( $blogposts, $authorposts ); //combine queries $postids = array(); foreach( $mergedposts as $item ) { $postids[]=$item->ID; //create a new query only of the post ids } $uniqueposts = array_unique($postids); //remove duplicate post ids $posts = get_posts(array( //new query of only the unique post ids on the merged queries from above 'post__in' => $uniqueposts, 'post_type' => $post_types, 'post_status' => 'publish', )); foreach( $posts as $post ) : setup_postdata($post); ?> // posts layout <?php endforeach; ?> <?php wp_reset_postdata();?>