Come selezionare post da una categoria escludendo quelli di un'altra?

14 lug 2014, 12:12:21
Visualizzazioni: 14K
Voti: 2

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?

1
Commenti

cat__in e cat__not_in non sono parametri validi. Vai a controllare i parametri validi per le categorie in WP_Query. Puoi semplicemente passare 'cat'=>4 ai tuoi argomenti per ottenere solo i post dalla categoria 4. Oppure, come suggerito da Brad, usa pre_get_posts e passa gli stessi parametri a quella funzione

Pieter Goosen Pieter Goosen
14 lug 2014 13:09:19
Tutte le risposte alla domanda 3
3

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");
14 lug 2014 12:20:29
Commenti

Oppure potresti usare pre_get_posts

Brad Dalton Brad Dalton
14 lug 2014 12:29:23

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

User User
14 lug 2014 12:36:41

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

Brad Dalton Brad Dalton
14 lug 2014 13:38:57
5

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.

14 lug 2014 13:41:41
Commenti

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.

User User
14 lug 2014 21:05:45

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

User User
14 lug 2014 21:34:07

Fantastico @naomik. Hai anche testato il tuo codice?

Brad Dalton Brad Dalton
15 lug 2014 00:22:52

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

User User
15 lug 2014 02:38:20

Lasciamo i commenti qui perché si sta prolungando un po', ma ti suggerisco semplicemente di testare tutti gli snippet di codice nel tuo tema.

Brad Dalton Brad Dalton
15 lug 2014 11:23:42
4
-3

Supponi di avere articoli con l'ID della categoria 4.

query_posts('cat=4');
  while (have_posts()) : the_post();
      the_content();
  endwhile;
14 lug 2014 12:19:34
Commenti

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

fuxia fuxia
14 lug 2014 12:23:00

Non dovresti mai usare query_posts, mai

Pieter Goosen Pieter Goosen
14 lug 2014 13:04:57

motivo per non usare mai query_posts?

jojo jojo
14 lug 2014 13:27:10

Questo articolo dovrebbe fare luce sull'argomento

Pieter Goosen Pieter Goosen
14 lug 2014 13:49:31