Cum să selectezi postări dintr-o categorie, dar să excludi postările din altă categorie?

14 iul. 2014, 12:12:21
Vizualizări: 14K
Voturi: 2

Încerc să selectez postările care au ID-ul categoriei 4, dar să exclud postările care au și ID-ul categoriei 2.

Iată ce încerc:

$query = new WP_Query(array(
  "cat__in"         => array(4),    // Include doar postările din categoria 4
  "cat__not_in"     => array(2),    // Exclude postările din categoria 2
  "post_type"       => "post",
  "post_status"     => "publish",
  "orderby"         => "date",      // Sortează după dată
  "order"           => "DESC",      // Ordine descrescătoare
  "posts_per_page"  => $limit,
  "offset"          => 0
));

Totuși, selecția nu funcționează corect. Unde greșesc?

1
Comentarii

cat__in și cat__not_in nu sunt parametri valizi. Verifică parametrii valizi pentru categorii în WP_Query. Poți pur și simplu să treci 'cat'=>4 în argumentele tale pentru a obține doar postări din categoria 4. Sau, așa cum a sugerat Brad, folosește pre_get_posts și treci aceiași parametri acolo

Pieter Goosen Pieter Goosen
14 iul. 2014 13:09:19
Toate răspunsurile la întrebare 3
3

Se pare că acest lucru poate fi realizat în 4 moduri separate

Folosind cat cu un număr negativ

$query = new WP_Query(array(
  "cat" => "4, -2", 
  // ...
));

Folosind category__in și category__not_in

Eu foloseam greșit cat__in și cat__not_in care nu sunt parametri valizi WP_Query

$query = new WP_Query(array(
  "category__in"     => array(4),
  "category__not_in" => array(2),
  // ...
));

Folosind 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"
    ),
  ),
  // ...
));

Folosind filtrul pre_get_posts (așa cum a fost oferit de 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 iul. 2014 12:20:29
Comentarii

Sau ai putea folosi pre_get_posts

Brad Dalton Brad Dalton
14 iul. 2014 12:29:23

@BradDalton, un răspuns complet ar fi foarte apreciat. Nu sunt sigur cum ar funcționa asta în cazul meu.

User User
14 iul. 2014 12:36:41

Poți modifica o interogare WP_Query existentă folosind pre_get_posts. http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

Brad Dalton Brad Dalton
14 iul. 2014 13:38:57
5

Folosește pre_get_posts pentru a exclude categoriile pe care nu dorești să le afișezi în buclă.

function exclude_posts_din_categorie_specifica( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'cat', '-2' );
    }
}
add_action( 'pre_get_posts', 'exclude_posts_din_categorie_specifica' );

Sau creează o nouă interogare WP_Query și folosește Parametrii de 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();

Dacă dorești să afișezi doar postări dintr-o singură categorie, poți folosi arhiva categoriei. Vezi Template Hierarchy.

14 iul. 2014 13:41:41
Comentarii

Ah, asta a fost problema mea. Foloseam cat__in și cat__not_in. Trebuia să folosesc cuvântul întreg category în fiecare parametru. O să încerc și metoda ta.

User User
14 iul. 2014 21:05:45

Am editat răspunsul meu pentru a compila o listă completă(?) de metode pentru a face asta.

User User
14 iul. 2014 21:34:07

Excelent @naomik. Ai testat și tu codul tău?

Brad Dalton Brad Dalton
15 iul. 2014 00:22:52

te referi la teste unitare? Am rulat rapid un test de fum pentru a verifica că fiecare metodă din postarea mea funcționează.

User User
15 iul. 2014 02:38:20

Să lăsăm comentariile aici deoarece devin prea lungi, dar îți sugerez pur și simplu să testezi toate fragmentele de cod în tema ta.

Brad Dalton Brad Dalton
15 iul. 2014 11:23:42
4
-3

Să presupunem că ai postări cu ID-ul categoriei 4.

query_posts('cat=4');
  while (have_posts()) : the_post();
      the_content();
  endwhile;
14 iul. 2014 12:19:34
Comentarii

Te rog să adaugi o explicație la răspunsul tău: de ce ar rezolva această soluție problema?

fuxia fuxia
14 iul. 2014 12:23:00

Nu ar trebui să folosești niciodată query_posts, niciodată

Pieter Goosen Pieter Goosen
14 iul. 2014 13:04:57

motivul pentru care nu ar trebui să folosești query_posts?

jojo jojo
14 iul. 2014 13:27:10

Acest articol ar trebui să clarifice acest aspect

Pieter Goosen Pieter Goosen
14 iul. 2014 13:49:31