Formation WordPress

Pagination WordPress sans plugin

WordPress n’a pas que des qualités.
Oui la réalité est difficile et l’un de ses plus grands défauts est son système de pagination classique (bouton suivant et précédent).

Sans plugin et avec seulement quelques lignes de codes, nous allons créer un système de pagination facilement intégrable à votre thème.

Pour l’exemple de notre tutoriel, le plugin recommandé par les « experts » WordPress est WP-Pagenavi. Ce plugin va installer deux dossiers et plus de 15 fichiers ! Un peu lourd pour un plugin censé proposer une navigation simple.


[Mise à jour] Le code a été modifié et utilise la fonction native de WordPress paginate_links().

Placer le code suivant dans le fichier functions.php présent à la racine de votre thème  :

function theme_pagination()
{

global $wp_query, $wp_rewrite;
	$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

	$pagination = array(
		'base' => @add_query_arg('page','%#%'),
		'format' => '',
		'total' => $wp_query->max_num_pages,
		'current' => $current,
                'show_all' => false,
                'end_size'     => 1,
                'mid_size'     => 2,
		'type' => 'list',
		'next_text' => '»',
		'prev_text' => '«'
		);

	if( $wp_rewrite->using_permalinks() )
		$pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );

	if( !empty($wp_query->query_vars['s']) )
		$pagination['add_args'] = array( 's' => get_query_var( 's' ) );

	echo str_replace('page/1/','', paginate_links( $pagination ));
}

Maintenant, tout ce que vous devez faire est d’ajouter la fonction vers le bas des pages où vous voulez que votre pagination doit apparaître. Si votre thème utilise le fichier loop.php, tout ce que vous devez faire est d’ajouter le code ci-dessous à la fin de votre boucle. Sinon, vous pouvez l’ajouter à index.php, archive.php et autres fichiers qui nécessitent la pagination.

<?php theme_pagination(); ?>

Explication sur les réglages :

  • end_size : détermine le nombre de liens a afficher en début et fin de la pagination
  • mid_size : détermine le nombre de pages a afficher avant et après la page courante

Si vous avez choisi une valeur de 3 pour mid_size, cela signifie que vous aurez toujours 3 pages (ou chiffres) de chaque côté de la page courante.

Pour plus d’informations sur les réglages de la fonction paginate_links(), cliquez sur ce lien.

Auteur : Jonathan
Actuellement en Master 1 Information Communication à Ingémédia, je m’intéresse depuis quelques années à différents aspects du milieu informatique qui m’ont vraiment séduits tels que la gestion de projet et la création de sites Internet.
Avatar de jonathan
Les commentaires 39 commentaires sur cet article
  1. jonathan le

    Attention ligne 8, il y a une erreur d’interprétation, le code a mettre est :
    if( empty( $paged ) ) et non pas if( emptyempty( $paged ) )

    Avatar de
  2. Ademus le

    line 8 :  if( emptyempty( $paged ) ) should be =>  if( empty( $paged ) )

    Avatar de
  3. Jérémy le

    Je suis moi aussi étonné par la lourdeur excessive de certains plugins par rapport aux fonctionnalités qu’ils sont censés ajouter. La même chose s’observe également avec les thèmes.

    Avatar de
  4. kiwii le

    Hello, merci pour le plugin, je suis d’accord avec la lourdeur de certains plugins…mais ce morceaux de code on le mets ou? bonne l’idée mais sans un minimum d’explications on zappe votre site..

    Avatar de
    • jonathan le

      Le contenu de la fonction theme_pagination se met dans le fichier functions.php.

      Ensuite, pour afficher la pagination dans un template, il suffit d’appeler la fonction !

      Avatar de
  5. Kam le

    j’aimerais savoir dans quelle partie on insère ce code, car il me provoque une erreur dès que je l’intègre dans la page function.php

    Avatar de
    • jonathan le

      Je viens de mettre à jour l’article en apportant des explications sur la mise en place du code et j’ai aussi simplifié le code de la pagination.

      Avatar de
  6. Amaury le

    La taille du code et le nombre de fichiers pour un plugin ne veut absolument pas dire qu’il aura de mauvaises performances… ou qu’il consommera de la mémoire, ça ne veut rien dire…

    On peut consommer énormément de mémoire avec 1 fichier, et 3 lignes de PHP…

    Bref, tout ça pour dire que WP-PageNavi est plugin, et donc contrairement à une fonction du thème, il propose des options dans la console d’administration, il supporte l’internationalisation et différents modes d’affichage.

    Et puis pagenavi reste le plugin de référence, utilisé par un nombre incroyable de thèmes… pourquoi se faire du mal à alourdir son thème avec une fonction en plus :)

    Avatar de
    • jonathan le

      Après réflexion, je suis d’accord que ma remarque sur la performance n’est pas pertinente.

      Par contre répondre à votre dernière phrase, je suis programmeur et quand j’ai une alternative simple à ma disposition qui permet de faire la même chose qu’un plugin, je la choisirai.

      Pourquoi ? J’économiserai de la place dans ma base de données sans les paramètres pour ce plugin. Alors oui, on économise qu’une ligne dans notre table, mais c’est mon côté trop perfectionniste (ou chiant ^^) qui parle.

      Par contre, si nous ne sommes pas programmeur et qu’on a peur d’aller mettre les mains dans le code, il faut utiliser les plugins :)

      PS : je n’ai rien contre les plugins (oui, je disais le contraire dans mon article ^^) et j’ai réalisé il y a quelques jours un plugin de pagination car je trouvais WP-PageNavi incomplet sur quelques points.

      http://wordpress.org/extend/plugins/simple-pagination/

      Avatar de
  7. marco le

    Merci pour le tuto.

    comment fait on pour installer un système de pagination pour les commentaires quand on a plusieurs pages.

    Avatar de
  8. blh le

    bonjour,

    aucun de ces codes -celui-ci et la colorisation des articles – ne fon,ctionne: j’ai cette erreur, traduite en french :

    Impossible de redéclarer theme_pagination () (précédemment déclarés dans …/wp/wp-content/themes/mandigo/functions.php: 187) in …/wp/wp-content/themes/mandigo/functions.php sur la ligne 185.
    Même style d’erreur sur la colorisation.
    D’où celà vient-il ?
    Bonne journée.

    Avatar de
    • jonathan le

      C’est erreur indique que vous avez deux fonctions qui s’appelent theme_pagination dans votre fichier functions.php

      Hors deux fonctions ne peuvent pas avoir le même nom sinon ça fait l’erreur que vous indiquez.

      Avatar de
      • blh le

        Merci jonathan, mais je viens de vérifier et il n’y a rien en double.
        Peut-être est-ce ailleurs ?

        Avatar de
        • jonathan le

          Regardez les indications de votre erreur, tout est détaillé.

          Vous avez deux fois la déclaration de la fonction theme_pagination, ligne 185 et 187 dans votre fichier functions.php

          Avatar de
  9. Bruno le

    Bonjour,

    J’ai bien fait la manip, mais ma pagination n’apparait pas.

    J’ai mis dans les fichiers index.php archive.php le code
    Puis dans fonction le code que tu donnes plus haut.

    J’ai le thème Mystique 3.2.1 si ca peut te donnéer un idée.

    Merci

    Avatar de
    • jonathan le

      L’appel de la fonction est bien à l’intérieur de la loop ?

      Avatar de
      • Bruno le

        Bonjour jonathan,

        Je n’ai pas de fichier loop.php dans mon thème.
        Je l’ai donc inséré dans mon fichier index.php de mon thème et ainsi que archive.php. et rien.

        Par contre j’ai 3 fichiers dans un dossier du thème qui ce nome :

        loop-forums.php
        loop-replies.php
        loop-topics.php

        Et c’est tout.

        Merci pour ton aide.

        Avatar de
        • jonathan le

          Quand je parle de la « loop » WordPress, je parle en fait de boucle qui permet d’afficher les différentes informations.

          Il y a toutes les explications à son sujet sur le codex WordPress : http://codex.wordpress.org/fr:La_Boucle

          Avatar de
          • Bruno le

            Dans le fichier index.php
            J’ai seulement ceci :

            Avatar de
  10. Buymeadonut le

    il y a un double !emptyempty ligne 23 de ton code, il faut juste !empty ;)

    merci en tout cas ca m’evite de reflechir :D

    Avatar de
  11. Yann le

    Cool, merci

    A tout hasard, vu que l’affichage des pages est chronologique, j’aurais aimé inverser la pagination pour obtenir ceci

    << précédente 9 8 7 … 3 2 1

    Avatar de
  12. jonathan le

    @Yann : Oula, je ne pense pas que ce soit possible d’obtenir ce genre de pagination :/

    Avatar de
  13. Yann le

    Mauvaise réponse :-D

    Je n’ai pas l’impression que ce soit faisable simplement, peut être en utilisant le résultat sous forme de tableau et en inversant tout mais …. pas pour moi ça

    Merci

    Avatar de
  14. slowflex le

    Bonsoir,
    j’ai utilisé 2 systèmes de pagination sans plugin et les 2 me donnent la même « erreur ».
    Sur mon index.php la pagination fonctionne mais pas sur mes catégories.
    C’est à dire que monsite.com/page/2 fonctionne et monsite.com/wordpress/page/2 ne fonctionne pas.
    J’ai mis en préfixe de catégorie dans les permaliens « . » afin de ne pas avoir /category/ Serait ce lié à cela ?
    Merci d’avance :)

    Avatar de
  15. jonathan le

    « J’ai mis en préfixe de catégorie dans les permaliens « . » afin de ne pas avoir /category/ Serait ce lié à cela ? »

    Il faut tester pour être sûr :)

    Avatar de
  16. slowflex le

    lol :D
    Je viens de le faire et ça ne fonctionne pas :(

    Avatar de
  17. Théo le

    Court et efficace, nickel !
    Merci

    Avatar de
  18. Christophe Chaudey le

    Ca ne marche pas lorsque je mets ça query_posts( ‘cat=-1′ );
    Si je l’enlève ça fonctionne bien, sauf que là je veux exclure une catégorie de la page d’accueil, je fais comment pour paginer du coup ?

    Avatar de
  19. jonathan le

    @Chirstophe : C’est que tu as mal configurer query_posts ou que tu n’as pas assez d’articles pour avoir une pagination.

    Avatar de
  20. Julie le

    Bonjour Jonathan
    J’ai installé ton plugin Simple Pagination qui est vraiment très bien. La liste des pages s’affiche bien là où je veux, toutefois quand je clique pour aller à la page suivante ou changer de page, il ne se passe rien, ça reste sur la première page. Tu as une idée ?
    Merci, Julie

    Avatar de
  21. Jonathan le

    @Julie : Avez-vous configuré la loop avec le numéro de la page courante ?

    Avatar de
  22. 202 ecommerce le

    La fonction paginate_links ne fait pas d’exception pour la première page, qui devient donc accessible par deux URLs. Pas très propre + Duplicate Content pour Google. Exemple /ma_premiere et /ma_premiere/page/1/

    Ci-dessous la manière dont j’ai contourné le problème, si quelqu’un a une solution plus smart, je suis preneur !

    $tmp = paginate_links( $pagination );
    $tmp = str_replace("page/1/", "", $tmp);
    echo $tmp;
    
    Avatar de
  23. Jonathan le

    @202 Ecommerce : C’est une très bonne remarque ! En effet, on se retrouve avec un Duplicate Content :/

    J’ai modifié le code de l’astuce. On peut simplifier directement le code par

    echo str_replace('page/1/','', paginate_links( $pagination ));
    
    Avatar de
  24. Ana le

    Bonjour,
    j’ai tout bien fait, je n’ai pas d’erreur, j’ai même personalisé les numéros de pages… Par contre quand je clique sur la page 2 par exemple, il me rafraichit juste la page… Pour info, j’utilise un thème que j’ai développé de A à Z donc il manque peut-être des fonctions, ou je ne sais pas! La fonction est bien appelée dans le loop (avant le endwhile et le endif). Merci d’avance pour votre aide!

    Avatar de
  25. Jonathan le

    @Ana : Avez-vous configuré la loop pour prendre en compte le numéro de la page courante ?

    Avatar de
  26. Ana le

    @jonathan Alors je ne sais même pas de quoi tu parles donc je pense que je ne l’ai pas fait! :) Peux tu me guider ou me dire comment faire? Merci!

    Avatar de
  27. Ana le

    Personne pour m’aider? :(

    Avatar de
  28. 202 ecommerce le

    @Ana Difficile de débugger à distance ! Dans le source de la page, la cible du lien (a href=) est-elle correcte ? Une fois cliqué, l’URL intègre-t-elle le /page/2 ?

    Avatar de
Laisser un commentaire
Balises autorisées dans les commentaires: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Suivre les commentaires de cet article par E-mail