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

  1. 27/02/2010 à 13:50 | #1

    bonjour,
    malgré tout ce que je viens d elire, je n’ai trouvé aucune solution à mon problème : certaines de mes infos, « développées », sont publiées sur la homepage, normalement. Mais je voudrais que certaines infos « brèves », n’apparaissent sur la homepage que dans le sidebar : soit en créant une catégorie « brèves », soit en utilisant seulement l’affichage (proposé par mon thème) des 10 ou 15 derniers articles (dans ces cas les ifos normales seraient mélangées aux brèves, ce qui n’est pas non plus un problème).
    Le souci : j’ai trouvé un petit plugin qui me permet de filtrer, de choisir si un post doit apparaître ou pas sur la homepage. Jusque là pas de problème, seulement si je choisis de filtrer, il n’apparaît pas non plus dans la sidebar (en clair, personne ne sait qu’il existe, à moins d’aller butiner dans la catégorie, mais la majorité se contente de voir les dernières infos depuis la homepage). Comment puis-je faire pour éviter l’affichage sur la colonne principale de la homepage, et créer un affichage de ces posts « filtrés » dansla sidebar ? Merci beaucoup de m’aider

  2. 05/03/2010 à 16:07 | #2

    Bonjour,

    Bravo pour cet article bien détaillé.
    Perso, pour réaliser un site de petites annonces, j’aimerais savoir comment afficher les catégories principales en page d’accueil sans leurs sous-catégories et uniquement les sous catégories de la catégorie cliquée ensuite et enfin les article de cette dernière.
    Merci pour l’aide précieuse que vous pourrez m’apporter.

  3. 24/05/2010 à 00:11 | #3

    Hello, merci pour ce post bien détaillé.
    Cela fait quelques jours que je tourne en rond autour d’un problème de « sorting ». Peut-être je me dirige vers la mauvais fonction.
    En tout cas je souhaiterais laisser la possiblité aux uitlisateur de mon site de pouvoir changer l’affichage du nombre d’article (par ex avec : query_posts( $query_string . ‘&posts_per_page=’ …) via un dropdown de sélection (1632…)
    Avez-vous une idée?
    Merci d’avance.

  4. 01/06/2010 à 12:57 | #4

    Bonjour
    J’ai essayer cela, pour avoir 2 catégories sur une page

    et aussi

    ça ne fontionne pas

Page des commentaires
  1. 18/01/2008 à 19:26 | #1
  2. 28/01/2008 à 07:21 | #2
  3. 11/02/2008 à 13:58 | #3
  4. 11/04/2009 à 17:15 | #4
  5. 26/04/2009 à 14:31 | #5