Résoudre les problèmes de pagination avec la fonction Query Posts

La fonction query_posts() est utile pour contrôler quels articles doivent être affichés dans la boucle de WordPress. Malgré les nombreux paramètres disponibles, un problème récurent concerne la pagination qui ne fonctionne pas… les articles se répétant d’une page sur l’autre.

Problème constaté

Si on utilise la fonction query_posts() pour, par exemple, lister l’ensemble des articles de votre blog sur une page d’archives, un problème gênant survient. Les articles listés sur la première page sont les mêmes sur la seconde page et ainsi de suite : la pagination ne fonctionne plus !

Solution fonctionnelle

Le codex de WordPress n’est pas très clair à ce sujet. Or, il faut ajouter un paramètre supplémentaire dans votre requête pour obtenir une pagination de nouveau opérationnelle.

Ainsi, les lignes de code suivantes permettent de lister 50 articles par pages via l’argument posts_per_page.

<?php if (have_posts()) : ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  query_posts("posts_per_page=50&paged=$paged"); ?>
<?php while (have_posts()) : the_post(); ?>

<ul>
<li><a href="<?php the_permalink() ?>" rel="bookmark"  title="<?php the_title(); ?>"><?php the_title();  ?></a></li>
</ul>

<?php endwhile; ?>

Ce bout de code peut être utilisé pour lister vos articles sur une page de catégorie à raison de 50 par page dans cet exemple.

Notez que le lignes comprises entre <?php while (have_posts()) : the_post(); ?> et <?php endwhile; ?> contiennent la boucle. En termes simples, il s’agit de déterminer la façon dont seront affichés les éléments de la requête.

Dans cet exemple, j’utilise une liste à puces pour afficher chaque titre d’articles conformément à ma requête consistant à lister 50 articles par pages.

Une autre solution m’a été proposée par Francis Chouquet sur son blog Fran6art. Elle fait le lien avec le plugin WP-pagenavi. Les 2 approches sont normalement fonctionnelles avec le plugin de pagination… mais 2 méthodes valent toujours mieux qu’une !

La fonction query_posts() est décidément très puissante et il n’est pas aisée de la manipuler. Grâce à ce bout de code, vous ne devriez plus rencontrer de problèmes avec la pagination.

Crédits photo : amortize

32 commentaires

  1. kuroneko

    Bonjour,
    Merci pour ce tutoriel qui m’a été bien utile pour créer la page d’archives de mon photoblog.
    Par contre, pour que cela fonctionne j’ai du enlever cette ligne : <?php if (have_posts()) : ?>
    sinon j’avais une erreur PHP.

  2. Driss Slaoui

    Mon index.php est totalement vide (si si), c’est pour ça que j’ai galéré à trouver..

    Mais le comble, c’est que j’ai trouvé:

    Déja fait.. mais ça ne marche toujours pas..
    Pas d’idées?

    Driss.Slaoui sur Skype si tu peux m’aider pour 5 petites minutes

    1. Aurélien Denis auteur de l’article

      A priori, le code n’est pas passé… mais je trouve bizarre que ton index.php soit vide. Le code doit être inséré en HTML converti pour qu’il passe correctement ou entre des balises pre ou code.

      Deuxièmement, ce tutoriel s’applique aux personnes qui rencontrent des problèmes avec la fonction query_posts au sujet de la pagination. Est-ce vraiment ton cas ?

      Pour Skype, désolé mais je l’utilise uniquement à but professionnel et non pour faire du dépannage gratuit. Il y a le forum de WordPress francophone pour cela. Je ne cherche pas à m’y substituer.

  3. Info2tele

    Bonjour
    Sur la home de info2tele.com, je fait apparaitre les 10 derniers post et je voudrais installer une pagination (page suivante – page précédente).
    Malheureusement, je ne comprends pas comment mettre en place cette fonction.
    Est-ce que pourrais m’aider ? Je place ci-dessous le code index.php
    Merci pour ton aide.

    have_posts()) : $recent->the_post();?>

    <a class="left_posts_link" href=" » rel= »bookmark »>

    <a href=" » class= »left_posts_link » rel= »bookmark »> <?php
    $files = get_children("post_parent=$id&post_type=attachment&post_mime_type=image");
    if ($files) {
    $keys = array_keys($files);
    $num=$keys[0];
    $thumb=wp_get_attachment_url($num);
    $blogurl = get_bloginfo('template_url');
    $permalink = get_permalink();
    $title = get_the_title();
    print ' ‘;
    }
    ?>

    <?php
    $excerpt = get_the_excerpt();
    echo string_limit_words($excerpt, 15);
    echo "… lire la suite »;
    ?>

    <a href=" »>

    have_posts()) : $recent->the_post();?>

    <a class="left_posts_link1" href=" » rel= »bookmark »>

    <a href=" » class= »left_posts_link1″ rel= »bookmark »> <?php
    $files = get_children("post_parent=$id&post_type=attachment&post_mime_type=image");
    if ($files) {
    $keys = array_keys($files);
    $num=$keys[0];
    $thumb=wp_get_attachment_url($num);
    $blogurl = get_bloginfo('template_url');
    $permalink = get_permalink();
    $title = get_the_title();
    print ' ‘;
    }
    ?>

    <?php
    $excerpt = get_the_excerpt();
    echo string_limit_words($excerpt, 15);
    echo "… lire la suite »;
    ?>

    <a href=" »>

    have_posts()) : $recent->the_post();?>

    <a title="Permanent Link to  » href= » » rel= »bookmark »><a href=" » class= »left_posts_link » rel= »bookmark »>

    <?php
    $files = get_children("post_parent=$id&post_type=attachment&post_mime_type=image");
    if ($files) {
    $keys = array_keys($files);
    $num=$keys[0];
    $thumb=wp_get_attachment_url($num);

    print " »;
    }
    ?>

    <div class="photogallery_title" id="post-« >
    <a title="Permanent Link to  » href= » » rel= »bookmark »>

    have_posts()) : $recent->the_post();?>

    <a class="titleshome" title="Permanent Link to  » href= » » rel= »bookmark »>

    <?php
    $files = get_children("post_parent=$id&post_type=attachment&post_mime_type=image");
    if ($files) {
    $keys = array_keys($files);
    $num=$keys[0];
    $thumb=wp_get_attachment_url($num);
    $blogurl = get_bloginfo('template_url');
    $permalink = get_permalink();
    $title = get_the_title();
    print ' ‘;
    }
    ?>

    <?php
    $excerpt = get_the_excerpt();
    echo string_limit_words($excerpt, 30);
    echo "… lire la suite »;
    ?>

    <a href=" » />.

  4. sebastien lavisse

    J’ai choisi un thème un peu particulier  » original premium news « . Je ne parviens pas à faire fonctionner pagenavi,la fonction query_posts() prend toujours le dessus en faveur de la page archives.

    voilà le code de la page blog qui est appelée par l’index:

    have_posts()) : $the_query->the_post(); $do_not_duplicate = $post->ID;
    ?>

    <div class="post-alt blog" >

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

    <?php the_content('’.__(‘à suivre’,woothemes). »); ?>

    >

    Merci de votre aide

  5. sebastien lavisse

    Oups.. je me suis trompé de code, l’autre c’est ma page index, voilà la page Blog:

    have_posts()) : $the_query->the_post(); $do_not_duplicate = $post->ID;
    ?>

    <div class="post-alt blog" >

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

    <?php the_content('’.__(‘à suivre’,woothemes). »); ?>

    >

  6. mickael

    Salut,
    merci pour cette astuce qui n’a pas marcher pour moi, mais avec l’aides des commentaires plus bas, voci le résultat qui fonctionne dans mon cas.

    </code

    1. mickael

      <?php
      $paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1; query_posts("cat=4&posts_per_page=5&order=DESC&orderby=date&paged=$paged");
      while (have_posts()) : the_post(); mystique_post();
      endwhile;
      ?>
      <?php mystique_pagenavi(); ?>

  7. NeoSting

    Plutôt que de bêtement passer par un plugin, la pagination peut se faire très facilement avec la fonction pagination_links, (notamment). Quant au thème de mon blog principal, je n’utilise même pas ce type de pagination.

    J’ai préféré une autre méthode : global $query_string; query_posts($query_string . ‘&posts_per_page=50’)… Voili, voilou. Visitez une page d’archives de mon blog, et vous verrez que je l’utilise même plusieurs fois, avec la valeur offset. Est-ce la meilleure méthode ? Je ne sais pas, mais elle fonctionne vraiment comme je le voulais.

    1. Aurélien Denis auteur de l’article

      Tu peux m’indiquer une page de ton site avec la pagination en action ?

      Je viens de regarder ton article et je me demande comment j’ai pu passer à côté de cette fonction pendant autant de temps… j’aimerais donc tester pour identifier les avantages et les inconvénients par rapport à WordPress PageNavi.

  8. macko

    Bonsoir j’ai un petit souci que je n’arrive pas à régler j’ai un custom type « blog » mais impossible d’afficher plus de 3 article je sais que si je remplace 3 par -1 tout s’affiche mais je voudrais ajouter une pagination mais la rien à faire rien s’affiche :s a la base sur le site la ligne 1 et 4 existé pas je l’ai ai rajouté mais je séche pour faire appel a ma pagination

    $paged = ( get_query_var( ‘paged’ ) ) ? get_query_var(‘paged’) : 1;
    $args = array(
    ‘post_type’ => ‘post’,
    ‘posts_per_page’ => 3,
    ‘paged’ => $paged
    );
    if($theme != null)
    $args[‘category_name’] = $theme;
    ?>

    have_posts()) : while ( $the_query->have_posts() ) : $the_query->the_post();
    ….
    ….

  9. Eric

    Deux ans et demi après publication, cet article est encore très fortement utile et m’a sorti d’un sacré pétrin !
    Peut être une fonctionnalité qui sera native sur la version 3.5 de wordpress … ?

    Merci !

  10. Tony

    Merci pour cet astuce vraiment utile !

    Pour ma part, j’ai remplacé cette ligne de mon code :
    query_posts(« posts_per_page=5 »);

    par :
    $paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1; query_posts(« posts_per_page=5&paged=$paged »);

    et ça a parfaitement fonctionné… Merci encore !

  11. Tumla

    Bonjour et merci pour ce tuto très clairement expliqué.
    J’ai cependant un problème. J’utilise cette méthode dans ma page « archive.php » qui est censée m’afficher tous les posts du blog. J’ai au total 52 posts. Lorsque j’ai « posts_per_page=52 » tout s’affiche, lorsque je diminue à 25, la pagination fonctionne bien et affiche 25+25+2 posts par page. Mon soucis vient quand je met 10 par exemple, la pagination fonctionne pour afficher les 3 pages suivantes mais quand je souhaite aller plus loin, je reviens automatiquement à l’index.

    CODE SUPPRIME PAR LE WEBMASTER

    Merci pour votre aide.

Laisser un commentaire