Избегайте дублирования при слиянии двух запросов

Я объединил два запроса, но когда я привожу их результаты, он показывает дубликаты.

Вот код

$arg = array('post_type' => 'story','post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC','posts_per_page' => -1, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'business_name', 'value' => $_POST['business_name'], 'compare' => 'LIKE' ) ) $stories = new WP_Query($arg); $arg1 = array('post_type' => 'story','post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC','posts_per_page' => 5); $stories2 = new WP_Query($arg1); $query = new WP_Query(); $query->posts = array_merge($stories->posts, $stories2->posts); foreach($query->posts as $post) { <?php echo the_field('author_name'); ?> } 

РЕДАКТИРОВАТЬ

Из комментариев

есть мета-запрос в первом аргументе, поэтому в первом post post post только те сообщения, которые имеют деловое имя_файла meta, были установлены, но он показывает только 2 результата, чтобы заполнить пробел, я добавлю дополнительную почтовую форму в этот раздел, так что есть способ, которым я могу удалить те сообщения, которые приходят из arg?

Solutions Collecting From Web of "Избегайте дублирования при слиянии двух запросов"

Прежде чем начать, у вас возникла проблема с вашим meta_query . Вы не должны использовать relation для одного внутреннего массива meta_query

Отношение (строка) – Логическая связь между каждым внутренним массивом meta_query, когда их больше одного. Возможные значения: «И», «ИЛИ». Не используйте с одним внутренним массивом meta_query.

Ваш первый запрос кажется правильным, и я согласен с этим. Второй запрос в основном там, чтобы заполнять сообщения, если первый запрос имеет меньше определенного количества сообщений. Есть несколько способов достичь этого

  • Использование «замещающих должностей», как описано в этом сообщении @GM

  • Использование второго запроса для заполнения остальных сообщений

Я не буду касаться сообщения @GM или его реализации, поскольку он уже сделал это, поэтому не стесняйтесь проверить эту должность

Во второй идее использования второго запроса для получения сообщений вам придется немного запланировать.

Здесь нужно иметь в виду:

  • Подсчитайте количество сообщений в первом запросе. Если это меньше заданной суммы, вычислите количество сообщений, которые будут получены вторым запросом

  • Используйте meta_query для извлечения сообщений во втором запросе, который не имеет указанного значения meta_value .

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

Вот концепция:

( Предостережение: все непроверенные )

Первое, что вам нужно сделать, это получить количество сообщений, возвращаемых первым запросом. Это можно легко сделать с помощью $found_posts . В твоем случае

 $stories->found_posts 

После этого вы можете проверить это на заданное значение в условном выражении. Предположим, вам нужно показать 10 должностей

 $min_posts = 10; if( $stories->found_posts < $min_posts ) { //get posts from the second query } 

Теперь вам нужно рассчитать количество сообщений, которое вам нужно будет получить от второго запроса.

 $ppp = $min_posts - $stories->found_posts; 

$ppp будет количество сообщений, которые будут извлечены и, таким образом, будут posts_per_page на posts_per_page

 $arg1 = array( 'post_type' => 'story', 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC', 'posts_per_page' => $ppp, 'meta_query' => array( array( 'key' => 'business_name', 'value' => $_POST['business_name'], 'compare' => 'NOT LIKE' ), ), ); $stories2 = new WP_Query($arg1); 

Теперь вы можете объединить (при необходимости) и отобразить результаты

 $posts = array_merge($stories->posts, $stories2->posts); 

Итоговый код:

( Как указано, все непроверенные )

 $arg = array( 'post_type' => 'story', 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'business_name', 'value' => $_POST['business_name'], 'compare' => 'LIKE' ), ), ); $stories = new WP_Query($arg); $min_posts = 10; if( $stories->found_posts < $min_posts ) { $ppp = $min_posts - $stories->found_posts; $arg1 = array( 'post_type' => 'story', 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC', 'posts_per_page' => $ppp, 'meta_query' => array( array( 'key' => 'business_name', 'value' => $_POST['business_name'], 'compare' => 'NOT LIKE' ), ), ); $stories2 = new WP_Query($arg1); $posts = array_merge($stories->posts, $stories2->posts); }else{ $posts = $stories->posts; } foreach ( $posts as $post ) { echo $post->ID; }