Включение всех терминов в wordpress tax_query

17 мар. 2014 г., 20:33:01
Просмотры: 25K
Голосов: 6

Я немного запутался, почему я не могу автоматически включить все термины в tax_query?

Мой код:

'tax_query' => array(
    array(
        'taxonomy' => 'city',
        'field' => 'slug',
        'terms' => array( nyc, boston, london ),
         )
)

Что если у меня десятки городов? Разве не неудобно добавлять их все вручную?

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

Вы делаете запрос для обычных записей? Или для пользовательского типа записей? То есть, у каждой записи будет указан город?

helgatheviking helgatheviking
17 мар. 2014 г. 20:49:58

Да, я делаю запрос для записей с помощью "query_posts".

wp student wp student
17 мар. 2014 г. 20:51:11

Это совсем не круто, возможно вам не нужен Tax Query, а просто параметр - 'taxonomy' => 'city'

Howdy_McGee Howdy_McGee
17 мар. 2014 г. 20:59:05
Все ответы на вопрос 3
2
14

Если у вас нет записей, которые не привязаны к городу, то по сути вы запрашиваете все свои записи? В любом случае, Эрик Холмс прав, что вместо query_posts() следует использовать WP_Query.

Тем не менее, вы можете получить список всех терминов таксономии, а затем использовать эти значения в вашем таксономическом запросе.

// получаем все термины таксономии
$terms = get_terms( 'city' ); 
// преобразуем массив объектов терминов в массив ID терминов
$term_ids = wp_list_pluck( $terms, 'term_id' );

// продолжаем с таксономическим запросом
$args = array ('tax_query' => array(
    array(
        'taxonomy' => 'city',
        'field' => 'term_id',
        'terms' => $term_ids,
         )
)
);

$city_posts = new WP_Query( $args );
17 мар. 2014 г. 21:08:29
Комментарии

Спасибо, я выбрал WP_Query. Это звучит лучше, чем query_posts(), потому что в конечном итоге query_posts() - это функция, которая возвращает WP_Query. И вместо term_ids я использовал 'taxonomy' => 'city, чтобы включить все записи в ней.

wp student wp student
17 мар. 2014 г. 23:19:57

Нет, я ошибся с использованием только 'taxonomy' => 'city'. Потому что это включает все записи. Мне придется включить term_ids. Спасибо за решение.

wp student wp student
17 мар. 2014 г. 23:39:39
1

В дополнение к отмеченному «лучшему ответу» существует еще один способ, который может быть даже быстрее, поскольку нам не нужно сначала получать термины и извлекать их имена.

Это достигается с помощью трюка, используя несуществующий оператор (ни один из 'IN', 'NOT IN', 'AND', 'EXISTS' и 'NOT EXISTS'). Например, строка 'XXX' справляется с этой задачей и заставляет WordPress не входить в условия во время генерации запроса, поэтому также пропускается конкатенация 0=1.

(Условия находятся в функции get_sql_for_clause() файла class-wp-tax-query.php, где разрешенные операторы проверяются через условия и нет блока 'else'.)

$args = array ('tax_query' => 
     array(
         array(
              'taxonomy' => 'city',
              //'field' => 'term_id', // <-- не требуется, значение по умолчанию
              //'terms' => $term_ids, // <-- не требуется
              'operator' => 'XXX'     // Используем несуществующий оператор
         )
     )
);
17 янв. 2018 г. 14:27:08
Комментарии

Это особенно полезно, если вы хотите выбрать записи, которые не принадлежат ни к одному термину таксономии. Это действительно спасло меня от излишнего усложнения запроса — либо использовать заданный ID термина, либо разрешить все записи. Огромное спасибо!

physalis physalis
5 июл. 2023 г. 14:03:13
0

Во-первых, не используйте query_posts. Вместо этого создайте новый объект WP_Query.

Во-вторых, зачем добавлять все категории, если вы буквально добавляете ВСЕ категории? Разве это не то же самое, что получить все записи? Вы также можете указать, какие категории исключить. Например, "Все, кроме Chicago".

17 мар. 2014 г. 21:00:38