J'essaie de sélectionner des publications qui ont la catégorie id 4
mais d'exclure les publications qui possèdent également la catégorie id 2
Voici ce que j'essaye
$query = new WP_Query(array(
"cat__in" => array(4),
"cat__not_in" => array(2),
"post_type" => "post",
"post_status" => "publish",
"orderby" => "date",
"order" => "DESC",
"posts_per_page" => $limit,
"offset" => 0
));
Cependant, il ne fait pas le bon choix. Qu'est-ce que je fais mal?
En fin de compte, cela peut être fait de 4 manières différentes
Utilisation de cat
avec un nombre négatif
$query = new WP_Query(array(
"cat" => "4, -2",
// ...
));
Utilisation de category__in
et category__not_in
J'utilisais par erreur cat__in
et cat__not_in
qui sont non paramètres WP_Query valides
$query = new WP_Query(array(
"category__in" => array(4),
"category__not_in" => array(2),
// ...
));
Utilisation de 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"
),
),
// ...
));
Utilisation du filtre pre_get_posts
(fourni par 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");
Utilisez pre_get_posts
pour exclure les catégories que vous ne souhaitez pas afficher dans la boucle.
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' );
Ou créez un nouveau WP_Query
et utilisez les paramètres de catégorie.
<?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();
Si vous souhaitez uniquement afficher les publications d'une catégorie, utilisez l'archive des catégories. Voir Template Hierarchy
.