Cum să selectezi postări dintr-o categorie, dar să excludi postările din altă categorie?
Î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?
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");

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

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

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
.

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.

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

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

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

Acest articol ar trebui să clarifice acest aspect
