Объедините два запроса и удалите дубликаты.

Вопрос или проблема

Я хочу объединить два запроса и удалить дубликаты. У меня это работает индивидуально. Теперь я добился, чтобы они работали вместе, но результаты не перемешаны, и дубликаты не удаляются. Я получил результат первого запроса, а затем результат второго запроса…

    $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 и удаления дубликатов постов, необходимо учитывать несколько аспектов. Ниже представлено решение, которое позволяет оптимизировать процесс и избежать проблем с дубликатами.

Анализ текущей ситуации

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

Оптимизированный подход

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

  1. Сбор параметров:
    • Получите списки предпочтительных авторов и категорий.
    • Объедините их в один массив для использования в запросе.
$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);
  1. Удаление дубликатов:
    • Используйте функцию 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);
  1. Вывод результатов:
    • Теперь можно вывести посты в цикле.
if ($final_query->have_posts()) :
    while ($final_query->have_posts()) : $final_query->the_post();
        // Здесь выводите информацию о посте
    endwhile;
    wp_reset_postdata(); // Сбрасываем глобальный объект поста
endif;

Заключение

Используя предложенное решение, вы сможете эффективно объединить два набора данных и избежать дубликатов. Это не только оптимизирует ваш код, но и улучшит производительность вашего сайта. Помните о необходимости регулярного тестирования полученного кода, чтобы убедиться в его корректности и эффективности. Такие подходы делают код более читаемым и проще в обслуживании, что особенно важно в контексте проектов большого масштаба.

Оцените материал
Добавить комментарий

Капча загружается...