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

22

Есть ли простой или простой способ исключить все сообщения из пользовательской таксономии в цикле? Я искал высоко и низко, и ни SE, ни SO, ни Google, похоже, не имеют прямого ответа.

Я знаю, что это можно сделать с помощью запроса WPDB, но это похоже на огромную веревку, чтобы прыгнуть за что-то, что должно быть довольно простым.

Томас
источник
5
Какие-либо посты, в которых есть какие-либо термины в этой таксономии, или вы ссылаетесь на определенный термин вашей пользовательской таксономии? Пример: если моя таксономия фруктовая и у меня есть два термина, яблоко и апельсин, хочу ли я исключить все посты с фруктами или только посты с яблоками?
t31os
для расширения @ t31os Q: post_tag, category, link_category и т. д. - все они встроены в таксономии. Таким образом, даже если вы называете теги записей «терминами», это все еще только таксономия (неиерархическая) и на том же «уровне», что и «категория» (иерархическая) таксономия.
Кайзер
Продолжение примера @ t31os: я пытаюсь исключить все посты, которые находятся в плодах таксономии (независимо от того, находятся ли они в «яблоках», «грушах» или «апельсинах»).
Томас

Ответы:

13

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

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

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

$query = new WP_Query( $args );
aniskhan001
источник
2
Похоже, это должно быть более эффективным, чем говорить NOT INчисло ХХ terms. Этот список терминов может увеличиться до большого размера, но он должен охватывать все термины с названием этой таксономии.
italiansoda
В то время как это ответ на вопрос ОП (голосование выше), большинство из нас, вероятно, хотят исключить конкретный термин или набор терминов. Для этого вам нужен этот ответ .
Риного
26

Решение этой проблемы не так широко обнародовано, но так и должно быть.

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

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

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

Дуэйн Чаррингтон
источник
Умная. Но тогда мне все равно нужно вручную вводить каждый термин в этой таксономии, правильно?
Томас
Я не слежу за тобой извините. В массиве терминов вы определяете значения терминов, которые хотите исключить из запроса цикла. Если вы хотите, чтобы они были динамическими, вы можете добавить собственное мета-значение к каждому сообщению, а затем проверить значение этого мета-ключа в своем запросе и установить его таким образом, если вы это имеете в виду.
Дуэйн Чаррингтон
Ах. Я понимаю, что вы имеете в виду, но это действительно громоздко.
Томас
Я действительно не смотрел, но наверняка должен быть плагин, который делает то, что вы спрашиваете тогда?
Дуэйн Чаррингтон
8

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

$happening = new WP_Query(
array( 
  'post_type'  => 'news',        // only query News post type
  'tax_query' => array(
    array(
        'taxonomy'  => 'news-cat',
        'field'     => 'slug',
        'terms'     => 'media', // exclude items media items in the news-cat custom taxonomy
        'operator'  => 'NOT IN')

        ),
   )
);

Это отлично работало, чтобы исключить пользовательскую таксономию из пользовательского типа записи. Просто хотел добавить код цикла запроса, чтобы завершить фрагмент: while ($ the_query-> have_posts ()): $ the_query-> the_post ();

Тим Боуэн
источник
0

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

$argos = array( 
    'tax_query' =>  array (
        array(
            'taxonomy' => 'topics', // My Custom Taxonomy
            'terms' => 'college', // My Taxonomy Term that I wanted to exclude
            'field' => 'slug', // Whether I am passing term Slug or term ID
            'operator' => 'NOT IN', // Selection operator - use IN to include, NOT IN to exclude
        ),
    ),
    'post_type'=>'page', // Post type I want to show, can be a custom post type too
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order'=>'ASC',
    'post_parent' =>$post->ID // show child posts or pages of current page/post
); 

$query = new WP_Query( $args );
erachnid
источник
0
query_posts( array(
    'post_type' => 'listings',
    'tax_query' => array(
        array(
            'taxonomy' => 'status',
            'field'    => 'slug',
            'terms'    => 'sold',
            'operator' => 'NOT IN'
            ),
        )
    )
);

Этот код исключает статус => продано из post_type => списки

Subhash Jangid
источник
-1

Я использую плагин WordPress «Видимость категории» для RYO, который, кажется, работает очень хорошо.

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

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

-Адам

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