Включение всех терминов в wordpress tax_query
Я немного запутался, почему я не могу автоматически включить все термины в tax_query?
Мой код:
'tax_query' => array(
array(
'taxonomy' => 'city',
'field' => 'slug',
'terms' => array( nyc, boston, london ),
)
)
Что если у меня десятки городов? Разве не неудобно добавлять их все вручную?

Если у вас нет записей, которые не привязаны к городу, то по сути вы запрашиваете все свои записи? В любом случае, Эрик Холмс прав, что вместо 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 );

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

В дополнение к отмеченному «лучшему ответу» существует еще один способ, который может быть даже быстрее, поскольку нам не нужно сначала получать термины и извлекать их имена.
Это достигается с помощью трюка, используя несуществующий оператор (ни один из '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' // Используем несуществующий оператор
)
)
);

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