Как исключить пользовательскую таксономию из цикла записей
Существует ли простой или легкий способ исключить все записи с определенной пользовательской таксономией из цикла? Я искал везде, но ни Stack Exchange, Stack Overflow, ни Google, похоже, не дают прямого ответа.
Я знаю, что это можно сделать через прямой запрос WPDB, но это кажется слишком сложным решением для того, что должно быть достаточно простым.

Это решение не так широко известно, но оно должно быть.
Вы можете сделать следующее:
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'terms' => array('cat', 'dog'),
'field' => 'slug',
'operator' => 'NOT IN',
),
);
query_posts($args);
Аргумент operator может принимать и другие значения, но приведенный выше код по сути означает: получить все записи из таксономии 'category', которые не содержат термины 'cat' или 'dog'.

Умно. Но тогда мне все равно нужно вручную вводить каждый термин из этой таксономии, верно?

Извините, я не совсем понимаю. В массиве terms вы определяете значения терминов, которые хотите исключить из запроса в цикле. Если вам нужно сделать их динамическими, возможно, вы можете добавить пользовательское мета-значение к каждой записи, а затем проверять значение этого мета-ключа в вашем запросе и устанавливать его таким образом, если это то, что вы имеете в виду.

Вам следует использовать оператор NOT EXISTS
вместе с передачей слага таксономии, что указывает запросу не включать записи из выбранной категории вашей пользовательской таксономии внутри цикла.
Чтобы исключить все записи, которые находятся в таксономии "fruit" (независимо от вида фрукта), вот сниппет:
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'fruit',
'operator' => 'NOT EXISTS'
)
)
);
$query = new WP_Query( $args );

Это выглядит более эффективным, чем использование NOT IN
для XX количества terms
. Список терминов может значительно увеличиться, но этот подход должен охватывать все термины с именем этой таксономии.

Хотя это ответ на вопрос автора темы (голосую за), большинство из нас, вероятно, хочет исключить конкретный термин или набор терминов. Для этого вам понадобится этот ответ.

Вот как это сделать для пользовательских типов записей и пользовательских таксономий:
$happening = new WP_Query(
array(
'post_type' => 'news', // запрашиваем только тип записей News
'tax_query' => array(
array(
'taxonomy' => 'news-cat',
'field' => 'slug',
'terms' => 'media', // исключаем элементы с таксономией media в пользовательской таксономии news-cat
'operator' => 'NOT IN')
),
)
);
Это отлично сработало для исключения пользовательской таксономии из пользовательского типа записей.. Хотел добавить код цикла запросов, чтобы завершить сниппет: while ( $the_query->have_posts() ) : $the_query->the_post();

query_posts( array(
'post_type' => 'listings',
'tax_query' => array(
array(
'taxonomy' => 'status',
'field' => 'slug',
'terms' => 'sold',
'operator' => 'NOT IN'
),
)
)
);
Этот код исключает записи со статусом => sold (проданные) из типа записей => listings (объявления)

Я сделал следующее, чтобы исключить записи из определённого термина таксономии:
$argos = array(
'tax_query' => array (
array(
'taxonomy' => 'topics', // Моя пользовательская таксономия
'terms' => 'college', // Термин таксономии, который я хочу исключить
'field' => 'slug', // Указываю, передаю ли я ярлык термина или его ID
'operator' => 'NOT IN', // Оператор выбора - используйте IN для включения, NOT IN для исключения
),
),
'post_type'=>'page', // Тип записи, который я хочу отобразить (может быть и пользовательским типом записи)
'posts_per_page' => -1,
'orderby' => 'title',
'order'=>'ASC',
'post_parent' =>$post->ID // Показывать дочерние записи или страницы текущей страницы/записи
);
$query = new WP_Query( $args );

Я использую плагин WordPress "RYO ‘Category Visibility’", который работает довольно хорошо.
На странице администрирования вы можете выбрать, какие категории будут видны или исключены из различных областей.
http://ryowebsite.com/wp-plugins/category-visibility/
-Адам
