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

  • badr

    tres bon sujet merci je vais l’essayé merci encore une fois

  • Yes_Papa

    Bonjour,

    Y a t’il un moyen de fqire la même chose avec un meta que l’on aurait créé ?

    J’ai essayer pas mal de truc mais je suis même plus sur que cela peut être possible.

    Merci.

  • Ninoochat

    Bonjour, sur mon blog je voudrais une page avec une catégorie et le tout du plus ancien au plus récent. J’ai donc mis ce code :
    php if (have_posts()) : ?>

    <?php while (have_posts()) : the_post();
    mais rien ne s'affiche ! si je retire query strings ça marche mais la pagination revient toujours au début Ooo ! Comment faire ?

  • Ninoochat

    il manque le milieu php query_posts(« $query_string&cat=11&showposts=2&order=asc »);

  • Serge

    Bonsoir (ou bonjour) à tous 😀

    Merci pour votre article et aussi, bravo aux commentateurs d’apporter leurs propres lumières quand ils le peuvent 😀
    Dans mon cas, la ligne de code :
    query_posts(« $query_string&orderby=post_date&order=asc »);
    fonctionne correctement.

    Toutefois, mon intention n’était pas de mettre tous les articles de mon blog en ordre « desc » mais seulement une catégorie (en l’occurrence, la 6, qui nécessite une lecture de textes numérotés, qui se suivent et se complètent)

    J’ai donc essayé, en bon débutant à zéro que je suis, de placer mon &cat=6 où je pouvais (lol) mais sans succès (toutes les catégories affichaient les mêmes articles, comme beaucoup d’autres commentateurs)

    Par exemple, j’ai essayé ces deux combinaisons, sans succès :
    query_posts(« $query_string&cat=6&orderby=post_date&order=asc »);
    Et aussi :
    query_posts(« $query_string&orderby=post_date&cat=6&order=asc »);
    Mais sans succès.

    Un petit conseil ou coup de main serait le bienvenu, car je galère depuis ce matin sur le sujet et j’ai fini par agacer, par mon ignorance, des « helpers » d’un forum français (lol)

    Toute aide est d’ailleurs la bienvenue !

    Merci et bonne continuation à votre Blog 😀

    Serge.

  • laeti

    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

  • Exatropic

    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.

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

  • greg

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

    et aussi

    ça ne fontionne pas

  • Pingback: Solution pour faire cohabiter Query Posts et votre pagination Wordpress()

  • Pingback: July 23rd : Cette semaine sur le net…()

  • webby

    Hello,

    SOS, j’ai vu déjà a plusieur endroit ce genre de code, je veux afficher que les 4 ou 5 derniers post et plustard les triée selon la catégorie, mais je n’arrive pas a réduire le nombre d’article ! voici le code !

    Merci pour cette article instrucif !

  • Amaury

    Bonjour,
    Sous vos conseil j’ai bien ajouté $query_string mais la pagination ne fonctionne toujours pas. Elle m’affiche toujours les mêmes articles sur chaque page …

  • Pingback: Solution pour faire cohabiter Query Posts et votre pagination Wordpress | davidlouis.fr()

  • Bonjour a tous
    j’ai trouvé la correction a mon problème ici
    http://codex.wordpress.org/Function_Reference/query_posts

    Je voulais juste inversé l’ordre de trie et garder le reste de fonctionnement.

    donc dans mon theme / loop.php

    j’avais oublié la récupération de $query_string;

    Yto

  • toutenphoton

    Ma configuration WP actuelle :WordPress 3.0.1
    – Thème utilisé : Tomorrow
    – Extensions en place : Lightbox 2, Comment Image, Subscribe2, Subscribe2 Counter Widget,
    – Nom de l’hebergeur : ovh
    – Adresse du site : http://serge-sautereau.com/WordPress

    Bonjour,

    J’ai divisé mon blog en différents épisodes (1 épisode = 1 catégorie). L’ordre des articles dans chaque épisode y est antechronologique et cela me convient. Mais je voudrais pouvoir afficher la totalité des articles dans un ordre chronologique
    (voyez ce que ça donne actuellement : http://serge-sautereau.com/WordPress/ca … tegorized/).

    J’ai fait différents essais : je suis arrivé à afficher les articles dans un ordre chronologique, malheureusement du même coup il y a un hic : quand on clique sur « épisode 1 » ou « épisode 2″(…) le résultat n’est plus l’affichage des articles contenus dans chaque épisode mais, quel que soit l’épisode sur lequel on clique, tous les articles de tous les épisodes (donc c’est exactement le même résultat que quand on clique sur « tous les épisodes ») …

    Avant ma modif le code était (page « index.php ») :

    Et maintenant le code est :

    Quelqu’un peut-il m’aider ?
    Merci beaucoup par avance

  • stanza

    Bonjour
    Ma configuration WP actuelle :WordPress 3.1
    -Thème utilisé : Vidéa

    j’aimerais limiter le nombre d’article sur ma page d’accueil du cous j ai décidé de virer les articles qui date de plus de 3 mois
    voila mon code :
    j ai placer sa dans loop.php

    function filter_where($where =  ») {
    $month= date(‘n’);
    $year= date(‘Y’);
    $month3= $month – 3 ;
    $date= »2011-0$month3-01 « ;
    $where .=  » AND post_date >= ‘$date’ « ;
    echo $where;
    return $where;
    }
    add_filter(‘posts_where’, ‘filter_where’);
    query_posts($query_string);

    mais sa fonctionne pas quand je clic su la pagintion pour voir les articles je par exemple http://www.monsite.com/page/2 reste toujours sur la page d’accueil.

    SVP aider moi ou renseigner moi sur d’autre méthode.

  • Malupeca

    Merci pour le tutoriel clair

  • Yannick Altuna

    Bonjour à tous,

    Déjà merci pour cet article qui comme le mentionne beaucoup est clair et instructifs.
    J’ai tenter la query_post pour afficher mes archives. En effet, j’ai limité les pages de mon blog à 5 articles par pages, je voulais utilisé la query_post pour contourné cet limitation et affiché tout les articles de la période demandé.
    Le problème c’est qu’il m’affiche les articles demandé mais en rajoute jusqu’à atteindre le nombre mentionné sur la query_post :

    même si j’ai que 10 article sur le mois de Juin, il m’affiche les 10 +40 autres.
    Comment faire? Il y à t-il une autre astuces pour géré les archives (sans plugins)?

    Cordialement,
    Yannick

  • Merci pour ce tutoriel très clair. Pour moi qui ne connait rien au php, j’ai réussi à mettre en place un filtre 🙂

    Je bute sur sur un petit problème que je n’arrive pas à résoudre et peut être quelqu’un pourra m’aider. J’ai intégré sur une page la fonction query post : query_posts( ‘showposts=5&cat=8&order=DESC&orderby=date’ );

    Cela fonctionne correctement et les articles sont filtrés sur leur catégories mais j’aimerais afficher uniquement le résumé des articles sur ma page (placé avant la balise « more ») et pas la totalité de l’article. Comment faire?

  • amoric69

    Bonjour,
    j’essai de me servir de query post pour ordonner une liste de billets par ordre de taxonomy, créé auparavent dans function.php et qui a pour nom ‘type’. J’ai fais plusieurs tentatives mais sans résultats..

    Quelqu’un a une idée ?

  • vraiment c’est un beau tuto ,il plein de beaucoup de requette plus utilisée merci merci,;)

  • richard

    @stephane
    il faut mettre ca

  • LightToMe

    Bonjour,

    En cherchant à trier dans un ordre bien précis, je suis tombé sur votre site. Ma question est: Vous dites que ces boucles sont cumulables mais comment faire pour trier dans un ordre numérique où chaque article aurait ça propre valeur (ou tag)?

  • Anaïs

    merci ! je calais depuis un moment sur une histoire d’affichage du dernier message d’une catégorie précise et j’ai enfin compris quoi faire grâce à ce billet ! merci ça faisait trop longtemps que j’étais bloquée !

  • guillaume

    Merci pour ce très bon tuto mais qui m’a laissé tourné en rond un bon moment. (thème YOKO)
    J’ai réussi à trouver la solution ici :
    http://www.fran6art.com/webdesign/wordpress-query_posts-la-requete-a-tout-faire/

    Il suffisait dans mon cas de mettre juste avant la loop tout simplement…
    Merci !