Фильтрация результата WP_Query по категориям

Используя WP_Query, мне нужно собрать список сообщений, которые являются как категориями 1, так и категориями2. Я хочу, чтобы этот выбор включал Category1 и все его подкатегории (Category3 и Category4), если они также помечены как Category2, даже если они не помечены как Category1.

 Категории:

 Идентификатор имени Родитель
 Категория1 1
 Категория2 2
 Категория 3 3 1
 Категория4 4 1

 Сообщения:

 Категории идентификаторов
 1 1,2
 2 2,3
 3 2,4


Теперь, если бы я должен был использовать WP_Query, чтобы находить сообщения только в категории1, он, кажется, найдет все три сообщения, включая Post2 и Post3, поскольку категории 3 и Категория4 являются подкатегориями категории1, даже если сообщения не являются Категории1.

new WP_Query( array( 'cat' => 1 ) 

Однако, если я использую «category__and» для поиска сообщений, которые являются как категориями 1, так и категориями 2

 new WP_Query( array( 'category__and' => array(1, 2) ) 

он находит только Post1, который имеет как Category1, так и Category2, но он не найдет Post2, который является Category2 и Category3 или Post3, хотя Category3 и Category4 являются подкатегориями категории 1.

Есть ли способ, которым я могу взять результат этого:

 new WP_Query( array( 'cat' => 1 ) 

Который находит сообщения, которые являются категориями 1 и подкатегориями категории 1, даже если они не являются Категория1 …

И затем фильтрует его, чтобы включать только те сообщения, которые также являются Category2?

Спасибо за любые предложения.

Solutions Collecting From Web of "Фильтрация результата WP_Query по категориям"

Параметры категории WP_Query не имеют такого типа логики. category__and и category__in не возвращают сообщения в дочерних категориях заданных категорий.

Я бы предположил, что вы используете параметры WP_Query в WP_Query , у которых есть логика, которую вы ищете. Параметр relation имеет два возможных значения: 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, но при необходимости вы можете удалить их.

Опишите, как он должен работать:

  • cat_id это не действительный аргумент, поэтому вы получаете сообщения из всех категорий. Используйте cat для установки идентификатора категории или набора идентификаторов категорий. Например:

Получить сообщения из категории 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, параметры категории .