Come selezionare post da una categoria escludendo quelli di un'altra?
Sto cercando di selezionare i post che appartengono alla categoria con ID 4
ma escludendo quelli che appartengono anche alla categoria con ID 2
.
Ecco quello che sto provando:
$query = new WP_Query(array(
"cat__in" => array(4), // Includi solo post dalla categoria 4
"cat__not_in" => array(2), // Escludi post dalla categoria 2
"post_type" => "post", // Tipo di post
"post_status" => "publish", // Solo post pubblicati
"orderby" => "date", // Ordina per data
"order" => "DESC", // Ordine decrescente
"posts_per_page" => $limit, // Limite di post
"offset" => 0 // Offset
));
Tuttavia, la selezione non funziona correttamente. Cosa sto sbagliando?
Come scoperto, questo può essere fatto in 4 modi separati
Utilizzando cat
con un numero negativo
$query = new WP_Query(array(
"cat" => "4, -2",
// ...
));
Utilizzando category__in
e category__not_in
Stavo erroneamente usando cat__in
e cat__not_in
che non sono parametri validi di WP_Query
$query = new WP_Query(array(
"category__in" => array(4),
"category__not_in" => array(2),
// ...
));
Utilizzando tax_query
$query = new WP_Query(array(
"tax_query" => array(
"relation" => "AND",
array(
"taxonomy" => "category",
"field" => "term_id",
"terms" => array(4)
),
array(
"taxonomy" => "category",
"field" => "term_id",
"terms" => array(2),
"operator" => "NOT IN"
),
),
// ...
));
Utilizzando il filtro pre_get_posts
(come fornito da Brad Dalton)
function exclude_posts_from_specific_category($query) {
if ($query->is_home() && $query->is_main_query()) {
$query->set("cat", "-2");
}
}
add_action("pre_get_posts", "exclude_posts_from_specific_category");

@BradDalton, una risposta completa sarebbe molto apprezzata. Non sono sicuro di come potrebbe funzionare nel mio caso.

Puoi modificare una WP_Query esistente usando pre_get_posts. http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

Utilizza pre_get_posts
per escludere le categorie che non vuoi visualizzare nel loop.
function exclude_posts_from_specific_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-2' );
}
}
add_action( 'pre_get_posts', 'exclude_posts_from_specific_category' );
Oppure crea una nuova WP_Query
e utilizza i parametri delle categorie.
<?php
$args = array(
'category__not_in' => 2 ,
'category__in' => 4
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
echo '<ul>';
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
} else {
}
wp_reset_postdata();
Se vuoi visualizzare solo i post di una categoria specifica, puoi utilizzare l'archivio della categoria. Vedi Template Hierarchy
.

Ah, quello era il mio problema. Stavo usando cat__in
e cat__not_in
. Avevo bisogno di usare la parola completa category
in ogni parametro. Proverò anche a sperimentare con il tuo altro metodo.

Ho modificato la mia risposta per compilare una lista completa (?) di metodi per farlo.

intendi i test unitari? Ho appena eseguito un rapido smoke test per verificare che ogni metodo nel mio post funzioni.

Per favore aggiungi una spiegazione alla tua risposta: perché questa soluzione risolverebbe il problema?

Questo articolo dovrebbe fare luce sull'argomento
