Cette « solution » dans la catégorie Les tutoriels du site va faire un peu tâche, car je ne vais pas réellement expliquer tout le fonctionnement du code. D’où le rangement de l’article dans la catégorie Ressources. Vous allez me dire que ça fait le deuxième présenté ainsi, et… oui en effet.
Mais l’avantage du blog, c’est que si vous ne comprenez pas tout le contenu de l’article, vous pouvez toujours me demander des explications en guise de commentaires (et moi ça me fait gagner un peu de temps).

L’idée

WordPress propose une gestion de la pagination assez basique avec un lien « précédent » et un lien « suivant ».
C’est déjà ça me direz-vous.
Cependant, une pagination un peu plus évoluée permet tout de même une meilleure navigation sur un site.

En naviguant sur quelques bons blogs (cf. sources et liens utiles de cet article), j’ai trouvé des codes intéressants mais pas toujours adaptés à ce que je souhaitais obtenir.
D’ailleurs, même ce code n’est pas encore assez bien, je souhaiterais pouvoir limiter le nombre de liens affichés. En effet, vous imaginez un blog avec plus de 30 pages d’articles, si tous les liens devaient s’afficher, ça serait un peu envahissant.

Le code

Je vous invite à placer ce code à la suite de votre fichier functions.php qui doit normalement se trouver à la racine de votre thème WordPress. Si ce n’est pas le cas, créez simplement le fichier.

function pagination($query) {  
	
	$baseURL="http://".$_SERVER['HTTP_HOST'];
	if($_SERVER['REQUEST_URI'] != "/"){
		$baseURL = $baseURL.$_SERVER['REQUEST_URI'];
	}
 
	// Suppression de '/page' de l'URL
	$sep = strrpos($baseURL, '/page/');
	if($sep != FALSE){
		$baseURL = substr($baseURL, 0, $sep);
	}
 
  // Suppression des paramètres de l'URL
	$sep = strrpos($baseURL, '?');
	if($sep != FALSE){
	// On supprime le caractère avant qui est un '/'
		$baseURL = substr($baseURL, 0, ($sep-1));
	}	
	
	$page = $query->query_vars["paged"];  
	if ( !$page ) $page = 1;  
	$qs = $_SERVER["QUERY_STRING"] ? "?".$_SERVER["QUERY_STRING"] : "";  
	
	// Nécessaire uniquement si on a plus de posts que de posts par page admis 
	if ( $query->found_posts > $query->query_vars["posts_per_page"] ) {  
		echo '<ul class="pagination">'; 
		// lien précédent si besoin
		if ( $page > 1 ) { 
			echo '<li class="next_prev prev"><a title="Revenir à la page précédente (vous êtes à la page '.$page.')" href="'.$baseURL.'/page/'.($page-1).'/'.$qs.'">« précédente</a></li>'; 
		} 
		// la boucle pour les pages
		for ( $i=1; $i <= $query->max_num_pages; $i++ ) { 
			// ajout de la classe active pour la page en cours de visualisation
			if ( $i == $page ) { 
				echo '<li class="active"><a href="#pagination" title="Vous êtes sur cette page '.$i.'">'.$i.'</a></li>'; 
			} else { 
				echo '<li><a title="Rejoindre la page '.$i.'" href="'.$baseURL.'/page/'.$i.'/'.$qs.'">'.$i.'</a></li>'; 
			} 
		} 
		// le lien next si besoin
		if ( $page < $query->max_num_pages ) { 
			echo '<li class="next_prev next"><a title="Passer à la page suivante (vous êtes à la page '.$page.')" href="'.$baseURL.'/page/'.($page+1).'/'.$qs.'">suivante »</a></li>'; 
		} 
		echo '</ul>';  
	}  
}

Une image présentant une paginationCe code considère que vous avez déjà utilisé l’url-rewriting de WordPress pour « enjoliver » vos permaliens. Si ce n’est pas le cas, je vous invite à le faire dans vos réglages de blog (Admin > Réglages > Permaliens) et à choisir la forme qui vous semble la plus adaptée à vos besoins (personnellement j’utilise /%category%/%postname%, mais nous nous écartons du sujet).

Une fois que cette fonction est enregistrée, il vous suffit de l’appeler à l’emplacement même où vous souhaitez voir apparaître la pagination :

<?php 
   pagination($wp_query);
?>

$wp_query permet d’obtenir des informations qui définissent une requête en cours. C’est elle qui va nous permettre de savoir sur quelle page on se trouve, et combien de pages il y a en tout.
À ne pas omettre donc !

Suggestions d’amélioration

Des améliorations sont envisageables pour éviter la surabondance de liens de pagination. L’une d’elles serait de planquer les liens en trop avec JavaScript (les cacher et les faire défiler ?).
Une autre serait de limiter le nombre de liens affichés dans la pagination en affichant par exemple la première, la dernière, et les deux pages (p+1 et p-1) avoisinant la page active (affichée).

J’y travaille et vous livre cela dès que j’ai un résultat probant ;)

Amusez-vous bien !