Фильтрация результатов WP_Query по категории
Используя WP_Query, мне нужно собрать выборку постов, которые относятся одновременно к Category1 и Category2. Я хочу, чтобы эта выборка включала Category1 и все её подкатегории (Category3 и Category4), если они также помечены как Category2, даже если они не помечены как Category1.
Категории: Название ID Родитель Category1 1 Category2 2 Category3 3 1 Category4 4 1 Посты: ID Категории 1 1,2 2 2,3 3 2,4
Сейчас, если я использую WP_Query для поиска постов только в Category1, он находит все три поста, включая Post2 и Post3, поскольку Category3 и Category4 являются подкатегориями Category1, даже если посты не принадлежат Category1.
new WP_Query(
array(
'cat' => 1
)
Однако, если я использую 'category__and' для поиска постов, которые относятся и к Category1, и к Category2
new WP_Query(
array(
'category__and' => array(1, 2)
)
он находит только Post1, который имеет и Category1, и Category2, но не находит Post2, который имеет Category2 и Category3, или Post3, хотя Category3 и Category4 являются подкатегориями Category1.
Есть ли способ взять результат этого запроса:
new WP_Query(
array(
'cat' => 1
)
Который находит посты, относящиеся к Category1 И подкатегориям Category1, даже если они не относятся к Category1...
И затем отфильтровать его, чтобы включить только те посты, которые также относятся к Category2?
Спасибо за любые предложения.

Вот как это должно работать:
cat_id
не является допустимым аргументом, поэтому вы получаете записи из всех категорий. Используйтеcat
для указания ID одной категории или массива ID категорий. Например:
Получить записи из категории 1:
new WP_Query(
array(
'cat' => 1
)
Получить записи из категории 1 и категории 2 (не обязательно в обеих одновременно)
new WP_Query(
array(
'cat' => array( 1, 2 )
)
category__and
находит записи, которые принадлежат всем указанным категориям. Например:
Получить записи, которые находятся и в категории 1, и в категории 2:
new WP_Query(
array(
'category__and' => array( 1, 2 )
)
Подробнее в WP Query, параметры категорий.

Извините, я ошибся, набрав 'cat_id' вместо 'cat' в предыдущем вопросе, но в моем рабочем коде я использую именно 'cat'. Так что это пока не отвечает на мой вопрос. Мне нужно найти все записи, которые находятся в Category2 И (Category1 ИЛИ подкатегории Category1). Ваш код с 'category__and' не находит подкатегории

Параметры категорий в WP_Query
не поддерживают такую логику. category__and
и category__in
не возвращают записи из дочерних категорий указанных категорий.
Я рекомендую использовать параметры tax_query
в WP_Query
, которые предоставляют нужную вам логику. Параметр relation
имеет два возможных значения: AND
и OR
.
relation (string) — Логическое соотношение между внутренними массивами таксономий, если их больше одного. Возможные значения: 'AND', 'OR'. Не используйте с одним внутренним массивом таксономии.
Также по умолчанию дочерние термины включаются в tax_query
, что вам и нужно.
include_children (boolean) — Включать или нет дочерние элементы для иерархических таксономий. По умолчанию true.
Вы можете сделать что-то вроде этого:
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => 1,
),
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => 2,
'include_children' => false,
),
),
);
$query = new WP_Query( $args );
Этот код ищет записи, которые находятся в категории 1 и её дочерних категориях, а также проверяет, находятся ли эти записи из категории 1 и её дочерних категорий также в категории 2. Возвращаемый список записей будет содержать посты из категории 1 или любых её дочерних категорий и одновременно находящиеся в категории 2.
Я исключил дочерние категории для категории 2, но вы можете убрать это ограничение, если нужно.
