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

14 сент. 2014 г., 05:58:27
Просмотры: 33.6K
Голосов: 2

Используя 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?

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

3
Комментарии

Я опечатался и написал 'cat_id' вместо 'cat' в предыдущем вопросе, но в рабочем коде я использую именно 'cat'. Код в вопросе был исправлен.

user79283 user79283
14 сент. 2014 г. 17:08:13

добавил дополнительные пояснения

user79283 user79283
14 сент. 2014 г. 17:15:10

Добро пожаловать на WPSE. Если вы еще этого не сделали, пожалуйста, ознакомьтесь с [ask] и также посетите нашу страницу [tour]. Очень важно предоставлять точные детали/код, чтобы кто-то мог вам помочь. Это также поможет избежать закрытия вашего вопроса из-за синтаксических ошибок. :-)

Pieter Goosen Pieter Goosen
14 сент. 2014 г. 19:14:53
Все ответы на вопрос 2
1

Вот как это должно работать:

  • 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, параметры категорий.

14 сент. 2014 г. 12:59:32
Комментарии

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

user79283 user79283
14 сент. 2014 г. 17:10:36
2

Параметры категорий в 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, но вы можете убрать это ограничение, если нужно.

14 сент. 2014 г. 19:11:43
Комментарии

Отлично - это сработало. Я бы поставил плюс вашему ответу, но у меня пока недостаточно репутации. Спасибо за помощь!

user79283 user79283
14 сент. 2014 г. 19:30:00

Без проблем. Рад, что у вас всё получилось. Удачи :-)

Pieter Goosen Pieter Goosen
14 сент. 2014 г. 19:32:53