Как исключить пользовательскую таксономию из цикла записей
Существует ли простой или легкий способ исключить все записи с определенной пользовательской таксономией из цикла? Я искал везде, но ни 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'.
Умно. Но тогда мне все равно нужно вручную вводить каждый термин из этой таксономии, верно?
Thomas
Извините, я не совсем понимаю. В массиве terms вы определяете значения терминов, которые хотите исключить из запроса в цикле. Если вам нужно сделать их динамическими, возможно, вы можете добавить пользовательское мета-значение к каждой записи, а затем проверять значение этого мета-ключа в вашем запросе и устанавливать его таким образом, если это то, что вы имеете в виду.
Dwayne Charrington
Вам следует использовать оператор 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. Список терминов может значительно увеличиться, но этот подход должен охватывать все термины с именем этой таксономии.
italiansoda
Хотя это ответ на вопрос автора темы (голосую за), большинство из нас, вероятно, хочет исключить конкретный термин или набор терминов. Для этого вам понадобится этот ответ.
rinogo
Вот как это сделать для пользовательских типов записей и пользовательских таксономий:
$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/
-Адам