Как исключить пользовательскую таксономию из цикла записей

16 мар. 2011 г., 16:50:04
Просмотры: 57.5K
Голосов: 28

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

Я знаю, что это можно сделать через прямой запрос WPDB, но это кажется слишком сложным решением для того, что должно быть достаточно простым.

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

Любые записи, которые имеют любые термины в этой таксономии, или вы имеете в виду конкретный термин вашей пользовательской таксономии? Пример: Если моя таксономия — это фрукты, и у меня есть два термина, яблоко и апельсин, я хочу исключить все записи, которые относятся к фруктам, или только те, которые относятся к яблокам?

t31os t31os
16 мар. 2011 г. 17:00:59

Чтобы расширить вопрос @t31os: post_tag, category, link_category и т.д. — все это встроенные таксономии. Так что, даже если вы называете метки записей (post tags) "терминами", они все равно остаются только таксономией (не иерархической) и находятся на том же "уровне", что и таксономия "категория" (иерархическая).

kaiser kaiser
16 мар. 2011 г. 19:36:18

Продолжая пример @t31os: Я пытаюсь исключить все записи, которые находятся в таксономии фрукты (независимо от того, относятся ли они к 'яблокам', 'грушам' или 'апельсинам').

Thomas Thomas
17 мар. 2011 г. 09:52:48
Все ответы на вопрос 6
4
31

Это решение не так широко известно, но оно должно быть.

Вы можете сделать следующее:

$args['tax_query'] = array(
    array(
        'taxonomy' => 'category',
        'terms' => array('cat', 'dog'),
        'field' => 'slug',
        'operator' => 'NOT IN',
    ),
);
query_posts($args);

Аргумент operator может принимать и другие значения, но приведенный выше код по сути означает: получить все записи из таксономии 'category', которые не содержат термины 'cat' или 'dog'.

21 мар. 2011 г. 13:07:04
Комментарии

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

Thomas Thomas
21 мар. 2011 г. 13:45:20

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

Dwayne Charrington Dwayne Charrington
21 мар. 2011 г. 14:18:13

А, я понял, что вы имеете в виду, но это действительно громоздко.

Thomas Thomas
27 мар. 2011 г. 15:59:16

Я не особо вникал, но наверняка же существует плагин, который делает то, о чем вы просите?

Dwayne Charrington Dwayne Charrington
27 мар. 2011 г. 23:30:17
2
20

Вам следует использовать оператор NOT EXISTS вместе с передачей слага таксономии, что указывает запросу не включать записи из выбранной категории вашей пользовательской таксономии внутри цикла.

Чтобы исключить все записи, которые находятся в таксономии "fruit" (независимо от вида фрукта), вот сниппет:

$args = array(
    'post_type'      => 'post',
    'tax_query'      => array(
        array(
            'taxonomy' => 'fruit',
            'operator' => 'NOT EXISTS'
        )
    )
);

$query = new WP_Query( $args );
17 апр. 2017 г. 19:23:22
Комментарии

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

italiansoda italiansoda
12 мая 2017 г. 22:48:22

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

rinogo rinogo
2 авг. 2019 г. 21:34:38
0

Вот как это сделать для пользовательских типов записей и пользовательских таксономий:

$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();

29 сент. 2011 г. 22:47:49
0
query_posts( array(
    'post_type' => 'listings',
    'tax_query' => array(
        array(
            'taxonomy' => 'status',
            'field'    => 'slug',
            'terms'    => 'sold',
            'operator' => 'NOT IN'
            ),
        )
    )
);

Этот код исключает записи со статусом => sold (проданные) из типа записей => listings (объявления)

21 янв. 2017 г. 10:49:49
0

Я сделал следующее, чтобы исключить записи из определённого термина таксономии:

$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 );
27 апр. 2012 г. 11:00:15
1
-1

Я использую плагин WordPress "RYO ‘Category Visibility’", который работает довольно хорошо.

На странице администрирования вы можете выбрать, какие категории будут видны или исключены из различных областей.

http://ryowebsite.com/wp-plugins/category-visibility/

-Адам

16 мар. 2011 г. 18:34:36
Комментарии

Мне кажется, что установка дополнительного плагина для этого — это перебор. Я предпочитаю минимизировать зависимости, и наверняка есть способ сделать это прямо в цикле.

Thomas Thomas
17 мар. 2011 г. 09:53:35