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
.
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.
Merci pour le bout de code. Il me semble que la structure de base de WordPress est plutôt bien optimisé niveau pagination. Après, il est toujours possible de l’améliorer. La plupart du temps, le problème vient surtout du thème.
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.
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 ! 🙂
Salut Aurélien,
Je viens d’avoir un problème de pagination sur un de mes sites, voici ce qui a fonctionné :
C’est ce qu’il faut faire lorsque la page d’accueil est une page statique (http://codex.wordpress.org/Pagination#static_front_page)
J’espère que ça pourra aider quelqu’un 🙂
A+
Alex
Bonjour,
Moi aussi, cela m’a sauvé la vie :
http://codex.wordpress.org/Pagination#static_front_page
if ( get_query_var(‘paged’) ) { $paged = get_query_var(‘paged’); }
elseif ( get_query_var(‘page’) ) { $paged = get_query_var(‘page’); }
else { $paged = 1; }
query_posts(‘cat=-38,-39&paged=’.$paged );
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 !
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();
….
….
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.
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. 🙂
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
Désolé code non fonctionnel…
Comme ça peux être que ça marche
<?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(); ?>
Super
Merci pour ce bout de code. très simple mais encore faut-il le savoir.
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).”); ?>
>
je ne peux malheureusement pas offrir un support technique pour des thèmes premium. Pour cela, merci de contacter l’auteur du thème ou d’utiliser un forum approprié. 😉
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
Merci , ça marche parfaitement 🙂
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="” />.
Vu que tu n’utilises pas la fonction
query_posts
, je pense qu’en insérant une fonction de pagination cela devrait fonctionner. Passes par le plugin WP Page-navi.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 🙂
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
oucode
.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. 🙂
Salut Aurélien,
J’ai aussi ce problème, mais j’ai pas su où mettre ton bout de code.
Merci d’avance de ta réponse 🙂
Il faut que tu localises ton fonction query_posts et que tu y ajoutes le paramètre posts_per_page. 🙂
Salut aurélien,
mais de rien 😉
Bizarrement, ta méthode et celle de Francis ne marche pas pour moi. Si vous êtes dans le même cas, je vous invite à utiliser les query strings comme expliqué ici : http://www.wordpress-fr.net/support/sujet-17260-aide-query-post
Merci du lien ! Ça devrait aider d’autres personnes. 😉
email envoyé mais pas reçu ? Pour info c’est la première ligne du code que j’ai supprimé pour que cela fonctionne.
Encore merci 🙂
C’est bon je viens d’éditer le commentaire.
Je n’avais pu que tu m’avais envoyé un e-mail… faut que j’améliore mon système de messagerie ! 😉
A bientôt !
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.
Malheureusement, le bout de code n’est pas passé dans ton commentaire. Pourrez-tu me l’envoyer par e-mail pour que je puisse le publier ?
Merci ! 😎