web-dev-qa-db-fra.com

Comment filtrer les publications appartenant à une catégorie spécifique uniquement s'il s'agit de la seule catégorie

Je dois filtrer les publications appartenant à une catégorie uniquement s'il s'agit de la seule catégorie. Par exemple, si mon message A appartient à cat1 et que je ne souhaite pas afficher les messages appartenant à cat1, le message A ne sera pas affiché. Mais si post A appartient à cat1 et cat2, il sera affiché car je ne souhaite pas filtrer cat2.

J'ai essayé de faire quelque chose comme ça:

<?php while (have_posts()) : the_post(); ?>

$category_to_exclude = 11;
while ( have_posts() ) : the_post();
$categories = get_the_category();
if( in_array($category_to_exclude, $categories) && count($categories) > 1 ) {
    the_title();
    the_content();
}
endwhile;

mais bien sûr, cela ne fonctionne pas correctement en tant que messages "coupés" uniquement. Il devrait filtrer directement de la requête utilisée pour obtenir les publications, mais je ne sais pas comment écrire cette requête. Une idée?

1
Randomize

Vous aurez besoin de plus d'une requête car avant d'interroger des publications, vous devez savoir quelles publications exclure.

Personnellement, je ne vois rien de mal dans 'cutoff'. Ce code devrait fonctionner correctement:

Mise à jour : Cela rompt la pagination (voir les commentaires).

<?php
$category_to_filter = 11;
while ( have_posts() ) : the_post();
    $categories = get_the_category();
    if( in_array($category_to_filter, $categories) && count($categories) > 1 ) {
        the_title();
        the_content();
    }
endwhile;

Mise à jour : Le code suivant ne rompt pas la pagination:

<?php
$category_to_filter = 11;
$posts_in = array();
while ( have_posts() ) : the_post();
    $categories = get_the_category();
    if( in_array($category_to_filter, $categories) && count($categories) > 1 ) {
        $posts_in[] = $post->ID;
    }
endwhile;

$my_query = new WP_Query( array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'post__in' => $posts_in
    )
);

while ( $my_query->have_posts() ) : $my_query->the_post();
    // your template stuff here
endwhile;
wp_reset_query();
2
Max Yudin