WordPress, controler l’affichage de votre liste de billets via query_posts()

Aujourd'hui je vais vous expliquer comment contrôler précisément l'affichage de votre liste de billets WordPress grâce à la fonction query_posts().

Tout d'abord, à quoi celà peut-il vous servir ?

Et bien grâce à query_posts(), vous allez pouvoir très facilement:

  • Retirer une ou plusieurs catégories de votre liste de billets
  • N'afficher qu'une ou deux catégories
  • Afficher uniquement les billets qui ont un certain tag
  • Afficher tous les billets rédigés par un même auteur
  • Afficher une page ou un billet précis via son nom ou son ID
  • Contrôler le nombre de billets à afficher
  • Choisir l'ordre de tri des billets (par date, catégorie, titre, auteur)
  • Inverser l'ordre
  • Appliquer un offset sur la liste, pour commencer à afficher la liste en excluant un nombre X de premiers billets
  • Afficher les billets qui ont été publiés à un moment précis (secondes, minutes, heures, jours, mois, années)
  • Choisir le nombre de billets par page à afficher

Voilà, je pense que vous avez compris tout l'intérêt de cette fonction, qui en une seule ligne peut vous rendre bien des services !

Prèt ? C'est parti !

Comment on utilise la fonction query_posts() ?

C'est très simple, il faut placer la fonction juste au dessus du début de votre boucle, dans votre template.

<?php
query_posts("....");
while (have_posts()) : the_post();
...
endwhile;
?>

Donc on place query_posts() juste avant le while.

Exclure ou afficher uniquement les billets d'une ou plusieurs catégories

query_posts("cat=4"); //Affiche uniquement les billets de la catégorie avec une ID=4
query_posts("cat=-4"); //Affiche tout sauf les billets de la catégorie avec une ID=4
query_posts("category_name=Categorie1"); //Affiche uniquement les billets de la catégorie "Categorie1"
query_posts("cat=1,2,4,5,7"); //Affiche uniquement les billets des catégories 1,2,4,5 et 7

Vous pouvez donc cumuler les catégories sans soucis, par contre l'exclusion de fonction qu'avec les ID, pas les noms.

Afficher uniquement les billets d'un ou plusieurs tags

query_posts("tag=google"); //Affiche uniquement les billets qui ont le tag "google"
query_posts("tag=google,yahoo"); //Affiche uniquement les billets qui ont le tag "Google" OU ""yahoo"
query_posts("tag=google+yahoo+msn"); //Affiche uniquement les billets qui contiennent les 3 tags !

Comme les tags n'ont pas de ID, il n'est pas encore possible d'en exclure, dommage. Par contre le choix entre OU et ET est assez intéressant !

Exclure ou afficher uniquement les billets d'une ou plusieurs Auteurs

query_posts("author_name=k-ny,admin"); //Affiche uniquement les billets des auteurs "k-ny" et "admin"
query_posts("author=2"); //Affiche uniquement les billets de l'auteur avec une ID=2
query_posts("author=-4"); //Exclu les billets de l'auteur avec une ID=4

Donc ici ça fonctionne exactement comme pour les catégories, on peut cumuler et exclure par ID

Afficher un billet ou une page précise

query_posts("p=1"); //Affiche uniquement le billet avec une ID=1
query_posts("name=first-post"); //Affiche uniquement le billet nommé "first-post"
query_posts("page_id=7"); //Affiche uniquement la page avec une ID=7
query_posts("pagename=about"); //Affiche uniquement la page nommée "about"
 

Ici on pourrait se demander l'intérêt de n'afficher qu'un seul billet ou page ? Et bien c'est simple, de cette façon vous pouvez attribuer le contenu d'un encart de votre site à une page ou un billet (comme sur l'accueil de webinventif, le petit message de bienvenue est en fait un page unique). Ou alors pour simplement mettre en évidence un billet particulier.

Choisir le nombre de billets à afficher

query_posts("showposts=10"); //Affiche uniquement les 10 premiers billets

Choisir la façon de trier les billets, et choisir le sens de tri

query_posts("orderby=post_date&order=desc");//Tri les billets par date. Prend aussi "category", "title", "author", "name". Ici le sens est descendant, pour ascendant il faut mettre order=asc, qui est la valeur par défaut

Commencer l'affichage en excluant un certain nombre des premiers billets

query_posts("offset=10");//On exclu les 10 premiers billets demandés

Afficher uniquement les billets postés à un moment précis

query_posts("hour=01"); //Afficher uniquement les billets qui ont été publiés pendant l'heure 1
query_posts("minute=30"); //Afficher uniquement les billets qui ont été publiés pendant la 30ème minute (*:30)
query_posts("second=07"); //Afficher uniquement les billets qui ont été publiés pendant la 7ème seconde (*:*07)
query_posts("day=1"); //Afficher uniquement les billets qui ont été publiés pendant le 1er jour de la semaine (1)
query_posts("monthnum=2"); //Afficher uniquement les billets qui ont été publiés pendant le 2ème mois (2)
query_posts("year=2005"); //Afficher uniquement les billets qui ont été publiés pendant l'année 2005

Bon là j'avoue que seules l'année et le mois peuvent être intéressant, le reste ne servira quasiment jamais.

Choisir le nombre de billets par page

query_posts("posts_per_page=10"); //Affiche 10 billets par page

Cumuler les paramètres

query_posts("cat=-1,-2,-3&page_id=7&tag=google,yahoo"); //On affiche les billets qui ne sont pas dans les catégories 1, 2, 3 ... on inclus d'office la page avec une Id=7 ... on selectionne uniquement ceux qui ont le tag "google ou yahoo

Voilà, pour cumuler il suffit donc de lier les paramètre avec une esperluette "&"

Conclusions

Il faut aussi savoir que vous pouvez très bien cumuler les boucles sur votre page d'accueil ! Ainsi vous pouvez afficher plusieurs listes de billets avec des paramètres de sélection très différents. C'est mon cas sur webinventif, la page d'accueil comporte 5 boucles différentes 😉

Edit: Pour garder votre pagination intact, il faut rajouter le paramètre $query_string à la requête ...

query_posts("$query_string&cat=-4")

(Merci Christèle)

Inspiré de l'article de Andrés Nieto Porras, que j'ai traduit, détaillé et complété ...

-----

Articles relatifs

  • Extra, j’étais justement en train de faire des expérimentations de tout ça ces jours pour un nouveau thème… Bah plus besoin d’expérimenter et plus qu’à appliquer avec ton mémo. Merci ! 😉

  • Charliend

    Article vraiment intéressant et complet. Merci beaucoup! Je vais pouvoir modifier mon thème avec plus de compréhension désormais.

  • Olivier Galluchot

    Merci pour ce tutorial très intéressant et très utile!

    Olivier

  • jbj

    Article très intéréssant pour tout créataur de thème WP! D’ailleurs, j’ai appris grâce à toi quelques trucs qui me serviront certainement lors de la création de mes prochains thèmes. merci 🙂

  • Pingback: Hot Links for 18/01/08 | Nowhere Else 2.0()

  • Merci pour ton explication je la met en pratique dès demain… j’était en train d’essayer de comprendre le codex en anglais de wordpress… avec grande difficulté, tes explications sont claire, dynamique, un bonheur…

  • Pingback: Wordpress : query_posts | css-xhtml()

  • Pingback: Thèmes Wordpress | css-xhtml()

  • pierre

    merci pour ce script super…
    mais mon thème n’affiche pas la boucle comme indiqué ci-dessus hélas…

    voici le début de ma boucle :

    j’ai donc écrit :

    mais hélas ça ne marche pas..
    Une bonne âme peut-elle m’aider ??

    SOS !

    Merci de votre aide…

  • Slt,
    J’ai mis le code suivant :

    Dans le modèle de la page principal.

    La fonction marche : sur la page d’accueil, je n’ai que l’actualité. Mais le bug vient lorsque l’on clique sur les catégories… Le lien de la catégorie s’affiche dans la barre d’adresse, mais je reste sur l’affichage de ma catégorie actualité

    Pouvez-vous me dire où je me suis trompé ?

    D’avance merci

  • voici mon code
    ?php if (have_posts()) : query_posts(« category_name=actualite »); while (have_posts()) : the_post(); ?

  • k-ny

    @pierre
    Met nous un bout de code que l’on y voit plus clair.

    @jerome
    Tout dépend. Tu utilise le même fichier de template pour ta page d’accueil et pour tes catégories ?
    (index.php / category.php)

    Car si tu n’as pas de category.php, c’est normal. Dans ce cas, a toi de mettre une condition en php …

  • pierre

    Oups, je me rends compte que les bouts de code de mon premier message sont restés vides…
    Je recommence donc.
    Voci le début de ma boucle :
    $i = 1; if (have_posts()) : while (have_posts()) : the_post(); if ( $i == 1 ) {

    Comment appliquer votre code avec cette boucle ??

    En fait, j’ai trouvé un plugin qui gère très bien tout ça : Adavanced Category Excluder : http://advanced-category-excluder.dev.rain.hu/

    Néanmions, je n’arrive toujours pas au résultat souhaité.. à savoir :

    sur la home : comment ne pas afficher le contenu d’une catégorie dans l’espace principal (main) mais l’afficher qand même dans la sidebar ?

    Exemple avec une rubrique « brèves » : vous voulez les afficher dans un bloc de sidebar à droite mais pas dans le flux central…

    Quelqu’un a une idée ??

  • Bonjour,
    J’ai le même problème. Dans l’éditeur de thème, je peux modifier les fichiers suivants : Feuille de style
    Commentaires
    Pied de page
    functions.php
    En-tête
    Modèle de l’index principal
    Modèle de page
    Colonne latérale
    Article seul

    Mon code est le suivant :
    ?php if (have_posts()) : while (have_posts()) : the_post(); ?

    Je voudrai afficher uniquement les articles de l’actualité en homepage… mais je voudrai que les liens sur les catégories de la sidebar marche (que l’on n’arrive pas toujours sur la page actualité lorsqu’on clique dessus)…

    J’ai donc le même problème que toi Pierre…

    Je vous remercie d’avance pour votre aide… Je ne sais plus trop quoi faire…

  • k-ny

    Bon, pour ceux qui ont leur boucle qui commence comme ceci:

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

    Il faut que vous le changiez par ça:

    <?php if (have_posts()) : 
    query_posts("….");
    while (have_posts()) : the_post(); ?>

    Donc vous inserer le query_post entre have_posts et while

    ———————–

    @Pierre

    Exclure une cat de l’accueil:

    <?php if (have_posts()) : 
    query_posts("cat=-4");
    while (have_posts()) : the_post(); ?>

    Et pour inclure les billets d’une cat dans la sidebar:

    <?php if (have_posts()) : 
    $the_query = new WP_Query('category_name=Categorie1&showposts=10');
    while ($the_query->have_posts()) : $the_query->the_post(); ?>

    A mettre en dur dans le fichier sidebar.php

  • willy.ten

    Bonjour et merci pour cet article.
    J’ai exclu une catégorie de l’affichage comme précisé dans ton post et cela marche nickel. En revanche, depuis, les liens articles préc. et suivants ne fonctionnent plus ! Si je retire mon query, les liens refonctionnent ! Une idée pour résoudre ce problème ? Merci !

  • Bonjour,
    Merci pour votre réponse. J’ai regardé et je n’ai pas de fichier categorie.php dans mon thème graphique.
    Si je met ça

    ?php if (have_posts()) :
    query_posts(« …. »);
    while (have_posts()) : the_post(); ?

    ça met bien uniquement les posts de l’actualité mais la sidebar ne répond plus (on a beau cliquer, on reste sur la même page)

    J’ai donc essayé de mettre
    ?php if (have_posts()) :
    $the_query = new WP_Query(‘category_name=Categorie1&showposts=10’);
    while ($the_query->have_posts()) : $the_query->the_post(); ?

    dans la sidebar… mais les liens de la sidebar ne fonctionnent toujours pas 🙁

  • k-ny

    @jerome

    Bon comme tu n’as pas de category.php, tu va devoir utiliser le « marqueur conditionnel » is_category() (plus d’infos).

    Pour ton soucis de sidebar, c’est assez étrange, tu as bien mis le bon nom de catégorie ? Et tu as bien fermé ta boucle ?

    @willy.ten

    Hum, essai de rajouter posts_per_page=10

    query_posts("cat=-4&posts_per_page=10");

    Si ça ne passe toujours pas, regarde si tu as le plugin « Permalink-redirect », et désactive-le (pourquoi ?)

  • pierre

    merci, je vais tester ce code..
    MAIS, j’ai trouvé un plugin qui fait encore mieux le travail..!!

    http://wordpress.org/extend/plugins/awsom-news-announcement/#post-2121

    ou encore (mais non testé)
    http://wordpress.org/extend/plugins/accessible-news-ticker/

    merci les potes 🙂

  • Christ

    Super le code… le seul probleme que j’ai c’est que je change la date du post pour pouvoir trier des évènement par date mais les dates qui ne sont pas encore arrivé ne sont pas affiché dans ma liste même si je met l’affihcage de toute l’année 2008

  • willy.ten

    Bonjour,
    mes excuses pour ce retour si tardif. J’ai essayé la méthode proposée mais rien n’y fait… Je n’ai pas le plugin non plus. Je me demande bien quoi faire ! Mille merci pour ton attention

  • willy.ten

    Bon,
    j’ai utilisé une condition dans « The Loop » comme expliqué ici :
    http://codex.wordpress.org/The_Loop#Exclude_Posts_From_Some_Category

    Plus de query post mais les liens précédents/suivants fonctionnent. Mon seul problème est que la catégorie cachée est tout de même comptée dans la liste de billets mais ce souci est moins génant. Voilà voilà je voulais expliquer comment je m’en suis sorti 😉
    Merci encore d’avoir pris du temps pour me répondre et pour ce site aussi.

  • moi je ne m’en suis pas sortis 🙁

  • Christèle

    Bonjour,

    Je viens d’utiliser la fonction de tri ascendant des articles sur le blog que je met en place, mais j’ai un problème lorsque je clique sur le lien « suivant » en bas de page pour voir le suite des articles. La page 2 applique ce même filtre et donc affiche à nouveau les articles en partant du premier. Je n’arrive donc pas à voir la suite.
    Une idée sur ce qu’il faut faire ?
    Merci par avance de votre aide !

  • SebyRollins

    Christèle >>
    J’ai exactement le même problème sur des pages que j’ai créées : Impossible de passer à la page suivante et au x posts suivant.
    J’ai désactiver le bout de code en attendant de touver une solution.
    Sinon, merci pour cet article interressant !

  • Christèle

    SebyRollins >>

    J’ai soumis cette question dans le forum WordPress français et un membre m’a proposé la solution suivante :

    Il faut utiliser cette syntaxe query_posts(« $query_string&orderby=post_date&order=asc »); pour conserver les paramètres passés par l’URL, notamment le paged=x ajouté par WordPress pour afficher les pages suivantes.

    Et c’est vrai que ça marche comme ça. J’espère que ça aidera tout ceux qui ont ce problème. 🙂

  • k-ny

    Et bien un grand merci Christèle pour la solution de la pagination ! 😉

  • SebyRollins

    Christèle,
    j’ai essayé cette méthode sans résultat. J’ai essayé d’afficher la variable $query_string, elle contient pourtant bien les infos d’id de ma nouvelle page wp ainsi que le numéro de page, mais elle ne semble pas être prise en compte dans la boucle d’affichage des posts ???

  • Christèle

    Je suis étonnée que cela ne fonctionne pas. Moi j’ai placé cette syntaxe query_posts(”$query_string&orderby=post_date&order=asc”); en lieu et place de celle proposée plus haut, sans la modifier, sur la page index et le résultat a été immédiat.
    Je ne suis pas très douée en PHP et comme je l’ai dit c’est un membre du forum WordPress français qui m’a proposé cette solution. Peut être devrais-tu essayer de poser ta question sur ce forum ?

    Désolé de ne pas être d’une très grande aide. 🙂

  • hawkidoki

    Merci pour ce post c’ est parfait !!!!!!!!!

  • merci de supprimer mon commentaire précédant
    Je n’arrive pas à afficher le code 🙁

    Pour résumer, voici mon problème :
    – je n’ai pas de fichier category.php
    – je voudrai afficher une seule quatigorie
    – jutilise le permanent link
    – lorsque je met la balise query post pour afficher une seule catégorie, cela fonctionne mais ça désactive les liens des catégories qui sont dans la sidebar

    Le plus simple, ce serait de vous montrer le code. Comment ?

    Merci d’avance pour votre aide…. je galère dur dur…

  • kiwiboo

    bjr

    j’ai placé cette fonction dans ma sidebar:

    <a href= » » rel= »bookmark » title= »VOIR »>

    mais cela ne m’affiche que les 15 posts déterminés dans l’admin…

    comment faire pour forcer l’affiche ( + ou – que celui déterminé pour la page principale)

    merci

  • kiwiboo

    en bref j’ai mis ça dans le code:
    query_posts(« cat=119,showposts=20 »);
    mais ça en affiche 15…

  • aSKer

    Salut,
    je suis en train d’essayer d’utiliser cette fonction avec le plugin wp-postviews pour faire une liste en fonction du postviews mais ca ne marche pas avec sortby=views ni orderby=views , une petite idée de comment faire ?

  • yannos

    Bonjour et merci pour ce billet qui m’a résolu en partie mon problème.
    J’ai utilisé la fonction (query_posts(« posts_per_page=1 »); //Affiche 1 billets par page) pour n’afficher que le dernier billet sur la page d’accueil.
    Mais un lien apparait en bas du billet et link une page vide sans lien de retour avec l’adresse : http://monsite.com?paged=2
    Ce que je voudrai, c’est que ce lien an bas de billet n’apparaisse pas.
    Merci.

  • Bonjour à tous.

    merci pour les explications. j’ai néanmoins un soucis.

    j’apelle le code suivant :
    query_posts($query_string . « &cat=-21&order=ASC »);

    pour exclure une categorie de mes news. le $query_string permet de ne pas avoir les meme news répétées dans chaque page (anciens, récents).

    le soucis est que quand j’exclu une categorie, le critere de l’ordre d’affichage (asc ou desc) n’est plus pris en compte par wordpress. Comme si il sautait l’information. Tandis que si je fait quelques chose du style :

    query_posts($query_string . « &cat=21&order=ASC »);

    donc sans exclusion, le critere de l’ordre marche bien.

    Quelqu’un pourrait til me dire comment je peux conciler les deux?

    merci d’avance

  • Franck

    Bonjour,

    Merci pour les explications, est il possible de selectionner avec inferieur et supérieur à ?

    voila ce que j’aimerais faire avec deux champs personnalisés :

    date-debut = $_GET[‘d’]

    D’avance merci.

  • Pingback: Plug-in Simple Tags et solution query_posts pour la navigation « Saiko_Sama, geekette malgré elle (ou pas ? )()

  • Pingback: Advanced Category Excluder : l’exclusion a parfois du bon ! | Job Alternative()

  • Anne-Estelle

    Hello Hello,

    Juste mortel!! Ça faisait des heures que je bidouillais mon code pour trouver une solution. J’étais franchement EXASPEREE!! Après lecture de ce post, tout coule de source!!!!! MERCI BCP, j’ai enfin l’impression de maitriser qque chose 😉

  • Excellent post, simple mais complet et efficace. Merci !

  • iconico

    Merci pour les infos: je cherchais justement à avoir plus de souplesse dans l’affichage de mes posts!
    😉

  • Fred

    Bonjour à tous,
    J’utilise cette fonction pour la page d’accueil de mon site est tout marche très bien, en revanche ça ne fonctionne plus une fois sur une page intérieure ??!

    Le contenu de la page se répète dans les différentes zones ou je souhaitais afficher d’autres articles…

    Le code est-il valable uniquement pour les 1er pages du site ?

    Merci d’avance

  • Bonsoir

    je veux utiliser cette fonction pour afficher une catégorie bien précise (id=1) mais aucune info n’arrive
    par contre la suppression (cat=-1) elle fonctionne mais pas sur les id de sous catégories
    quelqu’un a t’il une idée
    merci

  • reno

    Bonjour,

    Dans mon thème,dans la partie « content » il y a 2 colonnes pour 2 catégories,j’aimerai savoir si mon code est bon,enfin plutôt où est l’erreur car au lieu de m’afficher les 2 catégories,cela m’affiche 2 fois la même catégorie,merci
    colonne de gauche
     »


     »
    colonne de droite
     »


    « 

  • Exatropic

    Bonjour,

    J’aimerais savoir s’il est possible de sélectionner l’affichage de certaines sous-catégories en fonction de la catégorie choisie.
    ex.:

    Sur mon site on affiche des infos pour un département et une ville choisi. Comment faire pour que en choisissant « Morbihan » seules la sous-catégorie ville de Morbihan n’apparaissent comme choix et que ce soit maintenu jusqu’au choix d’un autre département?

    Merci pour votre aide qui me serait bien utile.

  • thomasa

    Bonjour,

    Est-il possible de faire une jointure de catégorie. Pour afficher seulement les articles qui se situe dans 2 catégories différentes

  • sakura

    salut tous le monde,

    intéressant le site , encore merci.
    Voila, je souhaite réaliser un menu déroulant sous forme de :
    * Titre catégories1
    *** titre article1 catégorie1
    *** titre article2 catégorie1
    :
    * Titre catégories2
    *** titre article1 catégorie2
    *** titre article2 catégorie2
    *** titre article3 catégorie2
    :
    et j’ai essayer pas mal de truc mais rien!
    si quelqu’un peut m’aider ça sera super sympa de sa part

    merci

  • pamgui

    Bonjour, je rencontre un soucis.
    J’ai un site avec 3 colonnes, dans la colonne de gauche, je fait appelle à une article de la manière suivante query_posts(« showposts=1&cat=2 »); Sauf que lorsque je veux afficher un article avec single.php, il m’affiche toujours le même c’est à dire l’article de la catégorie 2.
    Quelqu’un aurai une idée?

  • kevin

    Omg, juste ce sur quoi je me tirais les cheuveux depuis 1h. Super merci, tout tourne.