Exclure une catégorie d’une boucle WordPress

28 commentaires
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 ?

Par Aurélien Denis

Consultant & Développeur WordPress / WooCommerce. Un site à créer, à maintenir ou à débuguer ? Contactez-moi.

28 commentaires
  1. 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 🙂

  2. 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.

  3. 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

  4. 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 !

  5. produit dentaire

    Merci de nous indiquer un plugin qui fait la même chose sans entrer dans le code php de wordpress

  6. Happy Beer Time (@_HBT_)

    Génial le query_post ! Je galérais et voilà une chose de faite en moins de 5 min.

  7. 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.

  8. 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. Aurélien Denis auteur de l’article

      Il existe un plugin Widget Category de mémoire qui permet de choisir les catégories que l’on souhaite afficher. 😉

      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…

  9. 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

    1. Aurélien Denis auteur de l’article

      Sans doute un problème de boucle mal fermée qui fausse l’affichage… 🙂

  10. Rock'n law

    Genial comme article. Merci beaucoup.

    Amicalement.

    Rock’n law

  11. Denny

    Petite question, et si un article a plusieurs catégories, on le verra ou pas?

    1. Aurélien Denis auteur de l’article

      On le verra.

      1. Denny

        Merci pour la réponse 🙂

  12. 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 !

      1. Denny

        Bien je note, merci!

    2. Aurélien Denis auteur de l’article

      Cool super merci de ton partage ! 😎

      1. Djib's

        En plus l’avantage, c’est que la catégorie ne se verra pas non plus dans le flux rss pour la page principale, ni dans les pages qui suivent la Home (page 2, Page 3,…)

  13. 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 !

    1. Aurélien Denis auteur de l’article

      Le WordCamp comment a dater dans ma tête qui a du mal à se remettre du décalage horaire avec Sydney… donc bon. :p

  14. Denny

    comment l’a modifier => comment la modifier

    Sinon tres interessant, ca ouvre quelques possibilités.
    Je vais suivre ce post

  15. 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 🙂

    1. Aurélien Denis auteur de l’article

      Oui je l’oublie souvent le reset… 😉

      Sinon le mieux est de se placer dans l’action parse_query et modifier la query de WP à la base : ça je sais pas faire ! 😀

Laisser un commentaire