Come escludere una tassonomia personalizzata dal loop dei post
Esiste un modo semplice per escludere tutti i post di una tassonomia personalizzata dal loop? Ho cercato ovunque, ma né Stack Exchange, Stack Overflow o Google sembrano avere una risposta diretta.
So che può essere fatto tramite una query WPDB, ma sembra un approccio troppo complesso per qualcosa che dovrebbe essere relativamente semplice.

La soluzione a questo problema non è molto pubblicizzata, ma dovrebbe esserlo.
Puoi fare quanto segue:
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'terms' => array('cat', 'dog'),
'field' => 'slug',
'operator' => 'NOT IN',
),
);
query_posts($args);
L'argomento operator può accettare altri termini, ma il codice sopra sta sostanzialmente dicendo di ottenere tutti i post dalla tassonomia 'category' che non hanno i termini 'cat' o 'dog'.

Furbo. Ma poi dovrei comunque inserire manualmente ogni termine in quella tassonomia, giusto?

Mi sa che non ti sto seguendo, scusa. Nell'array dei termini, definisci i valori dei termini che vuoi escludere dalla tua query del loop. Se volessi che fossero dinamici, potresti forse aggiungere un meta valore personalizzato a ogni post e poi controllare il valore di quella meta key nella tua query e impostarlo in quel modo, se è questo che intendi.

Dovresti utilizzare l'operatore NOT EXISTS
insieme al passaggio dello slug della tassonomia, che indica alla query di non includere alcun post di una determinata categoria dalla tua tassonomia personalizzata all'interno del loop.
Per escludere tutti i post che si trovano nella tassonomia "fruit" (indipendentemente dal tipo di frutto), ecco lo snippet:
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'fruit',
'operator' => 'NOT EXISTS'
)
)
);
$query = new WP_Query( $args );

Sembra che questo dovrebbe essere più efficiente che usare NOT IN
con un numero XX di terms
. Questa lista di termini potrebbe diventare molto lunga, ma questo metodo dovrebbe coprire tutti i termini con quel nome di tassonomia.

Anche se questa è la risposta alla domanda dell'OP (ho votato positivamente), la maggior parte di noi probabilmente vuole escludere un termine specifico o un insieme di termini. Per quello, ti consiglio questa risposta.

Ecco come farlo per i custom post type e le tassonomie personalizzate:
$happening = new WP_Query(
array(
'post_type' => 'news', // query solo il post type News
'tax_query' => array(
array(
'taxonomy' => 'news-cat',
'field' => 'slug',
'terms' => 'media', // esclude gli elementi media nella tassonomia personalizzata news-cat
'operator' => 'NOT IN')
),
)
);
Questo ha funzionato perfettamente per escludere una tassonomia personalizzata da un custom post type.. Vorrei solo aggiungere il codice del loop di query per completare lo snippet: while ( $the_query->have_posts() ) : $the_query->the_post();

Ho implementato quanto segue per escludere post da un determinato termine di tassonomia:
$argos = array(
'tax_query' => array (
array(
'taxonomy' => 'topics', // La mia tassonomia personalizzata
'terms' => 'college', // Il termine di tassonomia che volevo escludere
'field' => 'slug', // Specifica se passo lo Slug del termine o l'ID del termine
'operator' => 'NOT IN', // Operatore di selezione - usa IN per includere, NOT IN per escludere
),
),
'post_type'=>'page', // Tipo di post che voglio mostrare, può essere anche un custom post type
'posts_per_page' => -1,
'orderby' => 'title',
'order'=>'ASC',
'post_parent' =>$post->ID // mostra post o pagine figlie della pagina/post corrente
);
$query = new WP_Query( $args );

Utilizzo il plugin WordPress "RYO 'Category Visibility'" che sembra funzionare piuttosto bene.
Puoi decidere su una pagina di amministrazione quali categorie sono visibili o escluse da varie aree.
http://ryowebsite.com/wp-plugins/category-visibility/
-Adam
