Вопрос или проблема
Я хочу объединить два запроса и удалить дубликаты. У меня это работает индивидуально. Теперь я добился, чтобы они работали вместе, но результаты не перемешаны, и дубликаты не удаляются. Я получил результат первого запроса, а затем результат второго запроса…
$fav_author_list = get_user_option( 'favorite-authors', fav_authors_get_user_id() );
$fav_categorie_list = get_user_option( 'favorite-categories', fav_categories_get_user_id() );
$rm_blog_args = array(
'posts_per_page' => -1,
'author__in'=> $fav_author_list,
'post_type' => 'post'
);
$rm_blog = new WP_Query($rm_blog_args);
$fb_args = array(
'posts_per_page' => -1,
'category__in'=> $fav_categorie_list,
'post_type' => 'post'
);
$fb = new WP_Query($fb_args);
// Итоговый запрос
$final_query = new WP_Query();
// Объединение запросов
$final_query->posts = array_merge( $rm_blog->posts, $fb->posts);
// Подсчет
echo $final_query->post_count = count( $final_query->posts );
// Удаление дубликатов идентификаторов записей
$post_ids = array();
foreach( $final_query->posts as $item ) {
$post_ids[] = $item->ID;
}
$unique_posts = array_unique($post_ids);
if($final_query->have_posts()) : while ( $final_query->have_posts() ) : $final_query->the_post();
Почему бы не сделать что-то вроде этого?
$fav_author_list = get_user_option( 'favorite-authors', fav_authors_get_user_id() );
$fav_category_list = get_user_option( 'favorite-categories', fav_categories_get_user_id() );
if(!empty($fav_author_list) && !empty($fav_category_list)) {
$rm_args = array(
'posts_per_page' => -1,
'author__in'=> $fav_author_list,
'category__in'=> $fav_category_list,
'post_type' => 'post'
);
} elseif(!empty($fav_author_list) && empty($fav_category_list)) {
$rm_args = array(
'posts_per_page' => -1,
'author__in'=> $fav_author_list,
'post_type' => 'post'
);
} elseif(empty($fav_author_list) && !empty($fav_category_list)) {
$rm_args = array(
'posts_per_page' => -1,
'category__in'=> $fav_category_list,
'post_type' => 'post'
);
} else {
$rm_args=""; // Нет параметров, так как нечего отображать.
}
if(!empty($rm_args)) {
$rm_blog = new WP_Query($rm_args);
if($rm_blog->have_posts()) : while ($rm_blog->have_posts()) : $rm_blog->the_post();
// Действия здесь.
}
Ваша установка не имеет смысла, вы выполняете запрос, но не используете его. Ваши параметры легко можно объединить и использовать в одном запросе, если только вам не нужно что-то делать с первым.
В любом случае, вы можете сохранить идентификаторы записей из первого запроса в массиве, а затем воспользоваться параметром post__not_in
, чтобы удалить записи, возвращенные первым запросом.
Ответ или решение
Для успешного объединения двух запросов в WordPress и удаления дубликатов постов, необходимо учитывать несколько аспектов. Ниже представлено решение, которое позволяет оптимизировать процесс и избежать проблем с дубликатами.
Анализ текущей ситуации
В вашем текущем подходе вы выполняете два отдельных запроса, затем объединяете результаты. Однако, вы сталкиваетесь с проблемами: результаты не смешиваются, и дубликаты постов остаются. Проблема может заключаться в том, что ваши запросы не учитывают пересечения постов между автором и категориями, что приводит к необходимости использовать несколько запросов.
Оптимизированный подход
Для достижения желаемого результата, вы можете использовать один общий запрос с параметрами, которые помогут исключить дубликаты и объединить нужные данные с учётом авторов и категорий.
- Сбор параметров:
- Получите списки предпочтительных авторов и категорий.
- Объедините их в один массив для использования в запросе.
$fav_author_list = get_user_option('favorite-authors', fav_authors_get_user_id());
$fav_category_list = get_user_option('favorite-categories', fav_categories_get_user_id());
// Начальная проверка на наличие данных
$query_args = array('posts_per_page' => -1, 'post_type' => 'post');
if (!empty($fav_author_list)) {
$query_args['author__in'] = $fav_author_list;
}
if (!empty($fav_category_list)) {
$query_args['category__in'] = $fav_category_list;
}
// Выполняем запрос
$final_query = new WP_Query($query_args);
- Удаление дубликатов:
- Используйте функцию
array_unique
вместе сwp_list_pluck
для удаления дубликатов.
- Используйте функцию
$post_ids = wp_list_pluck($final_query->posts, 'ID');
$unique_ids = array_unique($post_ids);
// Подготовка финального массива постов без дубликатов
$final_posts = array_filter($final_query->posts, function($post) use ($unique_ids) {
return in_array($post->ID, $unique_ids);
});
// Обновление постов в финальном объекте
$final_query->posts = $final_posts;
$final_query->post_count = count($final_posts);
- Вывод результатов:
- Теперь можно вывести посты в цикле.
if ($final_query->have_posts()) :
while ($final_query->have_posts()) : $final_query->the_post();
// Здесь выводите информацию о посте
endwhile;
wp_reset_postdata(); // Сбрасываем глобальный объект поста
endif;
Заключение
Используя предложенное решение, вы сможете эффективно объединить два набора данных и избежать дубликатов. Это не только оптимизирует ваш код, но и улучшит производительность вашего сайта. Помните о необходимости регулярного тестирования полученного кода, чтобы убедиться в его корректности и эффективности. Такие подходы делают код более читаемым и проще в обслуживании, что особенно важно в контексте проектов большого масштаба.