Comment exclure une taxonomie personnalisée de la boucle de publication

22

Existe-t-il un moyen simple ou facile d'exclure tous les messages d'une taxonomie personnalisée dans la boucle? J'ai regardé haut et bas, et ni SE, SO ni Google ne semblent avoir de réponse directe.

Je sais que cela peut être fait via une requête WPDB, mais cela semble être une énorme corde à sauter pour quelque chose qui devrait être assez simple.

Thomas
la source
5
Des articles qui ont des termes dans cette taxonomie, ou faites-vous référence à un terme particulier de votre taxonomie personnalisée? Exemple: si ma taxonomie est fruit et que j'ai deux termes, pomme et orange, voudrais-je exclure tous les articles qui contiennent des fruits, ou seulement ceux qui ont des pommes?
t31os
pour étendre @ t31os Q: post_tag, category, link_category, etc. sont toutes des taxonomies _builtin. Donc, même si vous appelez les balises postales "termes", ce n'est toujours qu'une taxonomie (non hiérarchique) et au même "niveau" que la taxonomie "catégorie" (hiérarchique).
kaiser
Pour continuer l'exemple @ t31os: j'essaie d'exclure tous les messages qui sont dans le fruit de la taxonomie (indépendamment du fait qu'ils soient dans «pommes», «poires» ou «oranges»).
Thomas

Réponses:

13

Vous voudriez utiliser l' NOT EXISTSopérateur avec passer le slug de taxonomie, qui indique à la requête de ne pas inclure une catégorie choisie de votre taxonomie personnalisée dans la boucle.

Pour exclure tous les articles qui se trouvent dans la taxonomie "fruit" (quel que soit le type de fruit), voici l'extrait:

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

$query = new WP_Query( $args );
aniskhan001
la source
2
Il semble que cela devrait être plus efficace que de dire NOT INXX nombre de terms. Cette liste de termes pourrait atteindre une grande taille, mais cela devrait couvrir tous les termes avec le nom de cette taxonomie.
italiansoda
Bien que ce soit la réponse à la question du PO (surévaluée), la plupart d'entre nous veulent probablement exclure un terme ou un ensemble de termes spécifiques. Pour cela, vous voulez cette réponse .
rinogo
26

La solution à ce problème n'est pas vraiment rendue publique, mais elle devrait l'être.

Vous pouvez effectuer les opérations suivantes:

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

L'argument opérateur peut prendre d'autres termes, mais le code ci-dessus dit essentiellement obtenir tous les messages de la «catégorie» de taxonomie qui n'ont pas les termes «chat» ou «chien».

Dwayne Charrington
la source
Intelligent. Mais alors, je devrais toujours saisir manuellement chaque terme dans cette taxonomie, n'est-ce pas?
Thomas
Je ne te suis pas désolé. Dans le tableau des termes, vous définissez les valeurs de terme que vous souhaitez exclure de votre requête de boucle. Si vous vouliez qu'ils soient dynamiques, vous pouvez peut-être ajouter une méta-valeur personnalisée à chaque publication, puis vérifier la valeur de cette méta-clé dans votre requête et la définir de cette façon si c'est ce que vous voulez dire.
Dwayne Charrington
Ah. Je vois ce que tu veux dire, mais c'est vraiment lourd.
Thomas
Je n'ai pas vraiment regardé, mais il doit sûrement y avoir un plugin qui fait ce que vous demandez alors?
Dwayne Charrington
8

Voici comment procéder pour les types de publication personnalisés et les taxonomies personnalisées:

$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')

        ),
   )
);

Cela a parfaitement fonctionné pour exclure la taxonomie personnalisée du type de publication personnalisé. Je voulais juste ajouter le code de boucle de requête pour terminer l'extrait de code: while ($ the_query-> have_posts ()): $ the_query-> the_post ();

Tim Bowen
la source
0

J'ai fait ce qui suit pour exclure les messages d'un certain terme de taxonomie:

$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
la source
0
query_posts( array(
    'post_type' => 'listings',
    'tax_query' => array(
        array(
            'taxonomy' => 'status',
            'field'    => 'slug',
            'terms'    => 'sold',
            'operator' => 'NOT IN'
            ),
        )
    )
);

Ce code exclut le statut => vendu des post_type => annonces

subhash jangid
la source
-1

J'utilise le plugin WordPress "RYO 'Category Visibility'" qui semble assez bien fonctionner.

Vous pouvez décider sur une page d'administration quelles catégories sont visibles ou exclues de diverses zones.

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

-Adam

adamf
la source
4
Il me semble que devoir installer un plugin supplémentaire pour ce faire est exagéré. Je préfère garder mes dépendances au minimum et il doit sûrement y avoir un moyen pour que cela se fasse en boucle.
Thomas