WP_Query показывает все записи, кроме категории X, если они не находятся также в категории Y.

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

Я пытаюсь показать посты из категорий A, B, C, D… и Y, кроме X, если только посты в X также не находятся в Y, тогда показать их вместе с остальными.

Я могу довольно просто скрыть категорию X:

$args = array(
    'post_type' => 'post',
    'posts_per_page' => 15,
    'paged' => $paged,
    'cat' => '-X',
);

Я пробовал объединить два цикла, один получает все посты, исключая X, другой получает посты, которые находятся и в X, и в Y, но это не работает:

$EverythingButXLoop_args = array(
    'post_type' => 'post',
    'cat' => '-X',
);
$EverythingButXLoop = new WP_Query( $EverythingButXLoop_args );

$OnlyXwithYLoop_args = array(
    'post_type' => 'post',
    'category_name' => 'categoryX+categoryY',
);
$OnlyXwithYLoop = new WP_Query( $OnlyXwithYLoop_args );

$mainLoop_args = array(
    'posts_per_page' => 15,
    'paged' => $paged,
);
$mainLoop = new WP_Query( $mainLoop_args );
$mainLoop->posts = array_merge( $EverythingButXLoop->posts, $OnlyXwithYLoop->posts );

// заполняем счетчик post_count, чтобы цикл работал правильно
$mainLoop->post_count = $EverythingButXLoop->post_count + $OnlyXwithYLoop->post_count;

Я также думал о получении всех идентификаторов категорий в переменной (вместо того, чтобы перечислять каждую из своих множества других категорий) и использовании их с параметром категории для исключения постов в X… как-то, т.е. 'cat' => $categoryIDs, 'category__not_in' => 'X', но я думаю, что все равно сталкиваюсь с первоначальной проблемой: исключить X, кроме случаев, когда в X и Y

Есть идеи, что не так с вышеупомянутой техникой комбинирования, или как я могу добиться этого другим (лучшим) способом? Спасибо заранее!

В вашем wp_query вы должны использовать NOT IN, чего я не вижу. В ваших аргументах для WP_Query() вы должны использовать category__not_in вместо cat. Поэтому измените свой код на:

Исключение одной категории

$args = array(
  'post_type' => 'post',
  'posts_per_page' => 15,
  'paged' => $paged,
  'category__not_in' => 'X', // строка
);

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

Исключение нескольких категорий и отображение постов из X и Y

$args = array(
  'post_type' => 'post',
  'posts_per_page' => 15,
  'paged' => $paged,
  'category__in' => array(X,Y), // Массив
  'post__not_in' => array(X),
);

Ниже полный запрос:

$args = array(
  'post_type' => 'post',
  'posts_per_page' => 15,
  'paged' => $paged,
  'category__in' => array(X,Y), // Массив
  'post__not_in' => array(X),
);

$your_query = new WP_Query( $args );
  while( $your_query->have_posts() ):
  $your_query->the_post();
  the_title();
endwhile;

wp_reset_postdata();

Примечание: Используйте ID, а не слаг или название категории

Ответ или решение

Для решения задачи, вам нужно создать запрос к базе данных WordPress с использованием WP_Query, который будет исключать записи из категории X, за исключением случаев, когда они также принадлежат категории Y. Давайте разберем, как это сделать.

Пошаговое руководство

  1. Идентификация категорий: Важно знать, какие ID у ваших категорий. Если вы используете слаг (slug) категорий, вам нужно будет преобразовать их в ID, используя функцию get_cat_ID().

  2. Настройка аргументов запроса: В запросе нужно использовать category__not_in, чтобы исключить категорию X, и category__in, чтобы включить записи из категорий A, B, C, D… и Y.

Вот пример кода, реализующего данное требование:

// Получаем ID категорий
$category_a_id = get_cat_ID('A');
$category_b_id = get_cat_ID('B');
// ... остальные категории
$category_x_id = get_cat_ID('X');
$category_y_id = get_cat_ID('Y');

// Массив ID категорий, из которых мы хотим выводить посты
$included_categories = array($category_a_id, $category_b_id /* Добавьте другие категории, кроме X и Y */, $category_y_id);

// Основной аргумент для запроса
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 15,
    'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
    'category__in' => $included_categories,
    'category__not_in' => array($category_x_id), // Исключаем категорию X
);

// Создаем основной запрос
$your_query = new WP_Query($args);

// Выводим посты
if ($your_query->have_posts()) :
    while ($your_query->have_posts()) : $your_query->the_post();
        the_title('<h2>', '</h2>');
        // Также можете добавить другие функции для вывода контента
    endwhile;

    // Если у нас есть посты из категории X, которые также в категории Y, выполняем дополнительный запрос
    $args_x_y = array(
        'post_type' => 'post',
        'posts_per_page' => 15,
        'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
        'category__in' => array($category_x_id, $category_y_id), // Проверяем, что посты в обеих категориях
    );

    $x_y_query = new WP_Query($args_x_y);

    // Выводим посты из категории X и Y
    if ($x_y_query->have_posts()) :
        while ($x_y_query->have_posts()) : $x_y_query->the_post();
            the_title('<h2>', '</h2>');
            // Выводим контент
        endwhile;
    endif;

    wp_reset_postdata(); // Сбрасываем данные запроса

else :
    echo 'Постов не найдено.';
endif;

// Сбрасываем данные запроса после основного цикла
wp_reset_postdata();

Объяснение кода:

  • Получение ID категорий: В первую очередь мы получаем ID всех необходимых категорий, включая X и Y. Используйте функцию get_cat_ID(), чтобы получить ID по названию категории.

  • Аргументы запроса: В аргументах для WP_Query мы используем category__in, чтобы включить все категории, за исключением X. В category__not_in мы явно указываем, что посты из категории X не должны отображаться.

  • Дополнительный запрос: После выполнения основного запроса, если нужно, можно провести дополнительный запрос для получения постов из категории X, которые также относятся к Y.

Заключение

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

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

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