Exclure une catégorie d’une boucle WordPress

Exclure une catégorie d’article de la boucle principale de WordPress est une demande récurrente sur ce site. Plusieurs méthodes existent car elles dépendent directement de la façon d’afficher la liste d’articles. Attention : pour utilisateurs avertis uniquement.

#1 – Utilisation de la fonction WP_Query

La fonction WP_Query est très utile pour afficher tout type de contenu sur votre site.

<?php
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$loop = new WP_Query( array('paged' => $paged , 'orderby' => 'title' , 'order' => 'ASC' , 'cat' => -5) ); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<?php the_title('<h2>' , '</h2>'); ?>
<?php endwhile; ?>

Dans cet exemple, je définis 2 variables $paged et $loop. La première permet la prise en charge de la pagination – le nombre d’articles étant défini dans votre administration WordPress ou via un paramètre, la seconde définit les arguments de la boucle.

Pour exclure la catégorie, indiquez son ID précédé d’un signe moins pour l’argument cat.

Ensuite, à partir de la ligne 5, on affiche la traditionnelle boucle des articles de WordPress. Ici, seuls les titres des articles sont listés. Libre à vous de la personnaliser en fonction de vos besoins !

#2 – Utilisation de la fonction query_posts

La fonction query_posts est très connue mais rarement utilisée comme il faudrait. Il faut dire que ce n’est pas évident de comprendre quand utiliser la bonne méthode d’affichage…

Dans ce cas de figure, il faut directement agir sur la boucle présente dans votre thème dans le fichier index.php – pour l’accueil par exemple.

En effet, la première méthode vous permet d’afficher les derniers articles n’importe où sur votre site pour tester. La seconde vient altérer une boucle déjà en place. Elle convient mieux aux utilisateurs souhaitant réutiliser l’affichage en place : titre avec permalien, miniature, extrait, etc.

Ainsi, dans le thème par défaut Twenty Eleven, éditez le fichier index.php en rajoutant la fonction query_posts dans la boucle.

<?php /* Start the Loop */ ?>
 <?php query_posts('cat=-1'); while ( have_posts() ) : the_post(); ?>

Pour exclure la catégorie, indiquez son ID précédé d’un signe moins comme précédemment. Ici la catégorie 1 est exclue.

Ces 2 techniques vous permettront de mieux comprendre le fonctionnement de la boucle de WordPress et surtout comment la modifier. Une fois le principe compris, les 2 liens vers le codex vous aideront à faire ce que vous voulez avec ! D’autres méthodes, amis lecteurs ?

28 commentaires

  1. Rahe

    Cool ! Mais il ne faut pas oublier de mettre un wp_reset_postdata() après le endwhile sinon tout le reste de la page sera faussé :).
    Sinon le mieux est de se placer dans l’action parse_query et modifier la query de WP à la base

  2. Julio Potier (BoiteAWeb)

    Ha, je me disais bien que Rahe serait venu dire ça !
    Aurélien ! T’as pas écoute au WordCamp !? haha il a parlé de ça ;p Oui bon, ils ont fait vite
    Perso, j’aimerai bien aussi voir le code proposé par Rahé la dessus
    Merci à vous 2 !

  3. Djib's

    Moi perso, j’utilise ce code dans dans functions.php

    function myFilter($query) {
    if ($query->is_home) {
    $query->set(‘category__not_in’,array(2590));
    }
    return $query;
    }
    add_filter(‘pre_get_posts’,’myFilter’);

    Quel est la meilleure solution selon vous ?

    Merci

    1. Julio Potier (BoiteAWeb)

      La tienne mon ami ! Car avec la tienne, tu ne recrées pas une requête de plus, tu modifies celle de la home, ça c’est opti. Désolé Aurélien !

  4. Fabien Noël

    Bonjour,

    Tout d’abord merci pour ce magnifique blog qui me rend très souvent de grands services. Vive la communauté WordPress et ses blogueurs

    Alors je ne sais pas si c’est le bon endroit pour poster ce commentaire, mais j’ai une question intéressante à poser.

    Comment ce fait-il que, quand on clique sur une sous catégorie dans le menu, les articles affichés ne sont pas que ceux de la catégorie en question?

    C’est à n’y rien comprendre !!!

    Bien à vous,
    Fabien

  5. Emilie

    Merci beaucoup pour cette fonction dont je me sers plusieurs fois!
    Par contre j’aurais voulu exclure ma catégorie de ma sidebar qui appelle le widget catégories car là elles apparaissent.

    Merci pour le tuyau!

      1. Emilie

        Merci beaucoup pour la réponse!
        J’avais télécharger widget logic mais qui est une véritable usine à gaz pour l’utilité que j’ai des widgets. J’ai donc trouvé un autre plugin « simply exclude ». Tout est dans le nom très simple d’utilisation suffit juste de cocher les catégories que l’on veut exclure…

  6. Olabonga

    Salut Aurélien,

    J’ai un vieux wordpress 3.0.4. pour lequel je voudrais exclure les catégories de ma home page. Peux-tu m’aider sur la manière de faire et quel code à insérer ?

    idem pour les flux RSS.

    Merci Aurélien.

  7. Damien Ladurelle

    Hello !

    Alors tout se passe sur ce site : http://aie-tek.com

    Comme vous pouvez le constater, il existe trois espaces pour l’actualité.

    La principale : News fraîches
    La seconde : smartphones
    La troisième : PC/Mac

    Là où ça se complique pour moi, c’est lorsque je publie un article PC ou smartphone. J’aimerai qu’il ne s’affiche que dans PC ou smartphone et pas dans l’actu générale.

    Pour les deux dernières, j’appelle simplement les catégories. Tout va bien.

    Pour la première, je souhaite donc exclure les catégories pcmac et smartphones.

    Merci d’avance !

  8. Joël

    Bonjour,
    Moi j’utilise le plugins Simply Exclude, en tant qu’administrateur, mais je viens de me rendre compte ( ma femme ) qu’il n’est pas utilisable pour les éditeurs. Est que c’est juste ou qui peux me donner le paramètre pour que les éditeurs puissent l’utiliser.
    Merci

  9. Yohan

    Bonjour,
    après quelques recherches sur le net, je viens sur ce superbe blog pour vous demander de l’aide :

    je souhaite savoir si c’est faisable avec des lignes de codes ou plugins :

    – je voudrais sur un ou plusieurs menus de mon site masquer automatiquement des catégories quand elles sont vide (site e-commerce). et enlever un article / produit du site quand le stock est vide.

    Merci beaucoup.

    1. Aurélien Denis auteur de l’article

      Pour le stock, il faut voir avec les options de ton module e-commerce ou si cela n’est pas possible en utilisant du code (à voir dans les documentations officielles). Pour autant, cela va créer des URLs indisponibles en grande quantité… il faut gérer cela pour le SEO !

      Pour les catégories vides, pas d’idées pour le gérer en automatique bien que cela dusse pouvoir se faire.

  10. mouzaia

    Bonjour, 3 ans plus tard ! pour dire que j’ai copié collé la fonction de Djib’s qui n’a jamais voulue marcher chez moi, j’ai cherché partout, essayé de modifier un truc par ci par là, avant de trouver : remplacer les quotes (‘) par des doubles quotes (« ) ! si si !
    En tous les cas, merci Djib’s pour m’avoir mis sur la meilleur méthode

Laisser un commentaire