Pagination des catégories

Attention, depuis PHP 5.5.0, certaines extensions SQL sans doute utilisées dans ce tutoriel peuvent être obsolètes et seront supprimées dans le futur, vous devez donc adapter les codes! Exemples ici.
Suite à une question posé par un dénommé David concernant la pagination des catégories, ce tutoriel vous montrera comme réaliser cette étape (du moins je l'espère ).
 
Étape 1 :

On créé une fonction "pagination()" dans une fichier que l'on va nommer "pagination.php" et qui va nous permettre d'automatiser tout cela :
<?php
function pagination($current_page, $nb_pages, $param = FALSE, $link='?page=%d', $around=6, $firstlast=1) {
    $pagination = '';
    $link = preg_replace('`%([^d])`', '%%$1', $link);
    if (!preg_match('`(?<!%)%d`', $link))
    $link .= '%d';
    if ($nb_pages > 1) {
        // Lien précédent
        if ($current_page > 1)
        if(!isset($param))
        $pagination .= '<a class="prevnext" href="'.sprintf($link, $current_page-1).'" title="Page précédente">&laquo; Précédent</a>';
        else
        $pagination .= '<a class="prevnext" href="'.sprintf($link, $current_page-1). $param .'" title="Page précédente">&laquo; Précédent</a>';
        else
        $pagination .= '<span class="prevnext disabled">&laquo; Précédent</span>';
 
        // Lien(s) début
        for ( $i=1 ; $i<=$firstlast ; $i++ ) {
            $pagination .= ' ';
            if(!isset($param))
            $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a title="Page '.$i.'" href="'.sprintf($link, $i).'">'.$i.'</a>';
            else
            $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a title="Page '.$i.'" href="'.sprintf($link, $i). $param .'">'.$i.'</a>';
        }
 
        // ... après pages début ?
        if (($current_page-$around) > $firstlast+1)
        $pagination .= ' &hellip;';
 
        // On boucle autour de la page courante
        $start = ($current_page-$around)>$firstlast ? $current_page-$around : $firstlast+1;
        $end = ($current_page+$around)<=($nb_pages-$firstlast) ? $current_page+$around : $nb_pages-$firstlast;
        for ( $i=$start ; $i<=$end ; $i++ ) {
            $pagination .= ' ';
            if ( $i==$current_page )
            $pagination .= '<span class="current">'.$i.'</span>';
            else
            if(!isset($param))
            $pagination .= '<a title="Page '.$i.'" href="'.sprintf($link, $i).'">'.$i.'</a>';
            else
            $pagination .= '<a title="Page '.$i.'" href="'.sprintf($link, $i). $param .'">'.$i.'</a>';
        }
 
        // ... avant page nb_pages ?
        if ( ($current_page+$around) < $nb_pages-$firstlast )
        $pagination .= ' &hellip;';
 
        // Lien(s) fin
        $start = $nb_pages-$firstlast+1;
        if($start <= $firstlast)
        $start = $firstlast+1;
        for ( $i=$start ; $i<=$nb_pages ; $i++ ) {
            $pagination .= ' ';
            if(!isset($param))
            $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a title="Page '.$i.'" href="'.sprintf($link, $i).'">'.$i.'</a>';
            else
            $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a title="Page '.$i.'" href="'.sprintf($link, $i). $param .'">'.$i.'</a>';
        }
 
        // Lien suivant
        if ($current_page < $nb_pages) {
            if(!isset($param))
            $pagination .= ' <a class="prevnext" href="'.sprintf($link, ($current_page+1)).'" title="Page suivante">Suivant &raquo;</a>';
            else
            $pagination .= ' <a class="prevnext" href="'.sprintf($link, ($current_page+1)).$param.'" title="Page suivante">Suivant &raquo;</a>';
        } else {
            $pagination .= ' <span class="prevnext disabled">Suivant &raquo;</span>';
        }
    }
    return $pagination;
}
?>
Cette fonction est issue d'un tutoriel trouvé sur le site seebz.net dont l'article est : "Pagination 2, comme avant ... en mieux". Pour toute question relative à cette fonction, merci d'utiliser le système de commentaire du site de l'auteur qui sera à même de vous répondre bien mieux que moi.
 
Juste avant la fermeture du fichier ci-dessus (?>), ajoutez :
//On récupère la variable ainsi que l'identifiant de la catégorie pour l'injecter dans la fonction
$variable_categorie = '&id='.$id_transmit.'';
//on affiche la pagination
echo '<p class="pagination">' . pagination($pageActuelle, $nombreDePages, $variable_categorie) . '</p>';
Enregistrez le fichier et placez celui-ci à la racine de votre site.
 
Étape 2 :

Ouvrez votre fichier "style.css" et placez y le code ci-dessous pour styler la pagination :
.pagination {
    line-height:2em;
}
.pagination a,
.pagination span {
    padding:0.2em 0.5em;
}
.pagination a {
    border:1px solid #9AAFE5;
    color:#105CB6;
    text-decoration:none;
}
.pagination a:hover {
    border:1px solid #296BB5;
    color:#000031;
}
.pagination .prevnext {
    font-weight:bold;
}
.pagination span.disabled {
    border:1px solid #DDDDDD;
    color:#999999;
}
.pagination span.current {
    border:1px solid #2E6AB1;
    background-color:#2E6AB1;
    color:#ffffff;
    font-weight:bold;
}
Étape 3 :

Dans le fichier "categorie.php", cherchez la ligne :
//On va chercher tout ce qui rentre dans cette catégorie
$page = mysql_query("SELECT id,titre,description FROM CONTENU WHERE id_categorie='".
mysql_real_escape_string($id_transmit)."' ORDER BY id ASC");
Remplacez par :
//--------------Début requête de pagination----------------------
//Nombre d'article à afficher par page
$messagesParPage = 5;
//On compte le nombre de page dans la catégorie visé
$retour_total=mysql_query("SELECT COUNT(*) AS total FROM CONTENU WHERE id_categorie='".mysql_real_escape_string($id_transmit)."'");
$donnees_total=mysql_fetch_assoc($retour_total);
$total=$donnees_total['total'];
 
$nombreDePages=ceil($total/$messagesParPage);
if(isset($_GET['page']))
{
    $pageActuelle=intval($_GET['page']);
 
    if($pageActuelle>$nombreDePages)
    {
        $pageActuelle=$nombreDePages;
    }
}
else
{
    $pageActuelle=1;
}
$premiereEntree=($pageActuelle-1)*$messagesParPage;
 
//On va chercher tout ce qui rentre dans cette catégorie
$page=mysql_query("SELECT id,titre,description FROM CONTENU WHERE id_categorie='".mysql_real_escape_string($id_transmit)."' ORDER BY id ASC LIMIT ".$premiereEntree." , ".$messagesParPage." ");
//---------------Fin de requête pagination--------------------------
La variable $messageParPage correspond au nombre d'article à afficher par page...à vous de choisir le nombre d'article qui vous convient!
 
Cherchez ensuite la ligne :
//On ferme les else
}
}
Ajoutez en dessous :
//On inclue le système de Pagination
if($nombreDePages>1){
    echo '<div style="text-align:center">';
    include('pagination.php');
    echo '</div>';
}
 
Voila, vous avez maintenant un système de pagination complet .
 
Petit plus ...

Le soucis des systèmes de pagination c'est qu'ils créés ce que l'on appel du duplicate content...c'est à dire que vous allez vous retrouvez avec plusieurs pages ayant les mêmes méta-tags (titre+description) et pour pallier à ça, je vous propose d'injecter le numéro de la page directement dans les métas. Par la même occasion, je vous propose de rediriger également la première page de pagination pour les mêmes raisons..
 
Cherchez le code suivant dans la page "categorie.php" :
if (!isset($_GET["id"]) OR !is_numeric($_GET['id'])){
    //Si la variable n'existe pas ou qu'elle n'est pas de type numérique, on redirige
    header('location:http://'.$_SERVER['HTTP_HOST'].'');
}
C'est en dessous de ce code que nous allons commencer...
 
Dans un premier temps, on parse l'url de la page en cours :
$url = parse_url($_SERVER["REQUEST_URI"]);
Si on effectue un print_r() de $url comme ci-dessous :
echo '<pre>';
print_r($url);
echo '</pre>';
On obtient à quelque chose près le résultat suivant :
Array
(
    [path] => /categorie.php
    [query] => page=2&id=3
)
Ce qui nous intéresse se trouve dans le tableau [query] car il contient entre autre le numéro de la page en cours qui correspond donc à la pagination. Pour obtenir uniquement le numéro de la page, on créé dans un premier temps un tableau vide :
$tableau=array();
Ensuite, on parse la variable $url['query'] pour la "ranger" dans $tableau :
parse_str($url['query'],$tableau);
Si on effectue un print_r() de $tableau comme ci-dessous :
echo '<pre>';
print_r($tableau);
echo '</pre>';
On obtient :
Array
(
    [page] => 2
    [id] => 3
)
Ce qui signifie que la variable $tableau['page'] correspond au numéro de la pagination en cours ..reste plus qu'à l'utiliser pour effectuer une redirection :
if(isset($tableau['page']) && $tableau['page']==1){
header("Status : 301 Moved Permanently");
header('location:/categorie.php?id='.$id_transmit.'');
}
Ce code permet donc de rediriger la pagination de la première page categorie.php?page=1&id=3 vers /categorie.php?id=3 qui sont en réalité une même page.
 
Le code au complet :
$url = parse_url($_SERVER["REQUEST_URI"]);
$tableau=array();
parse_str($url['query'],$tableau);
if(isset($tableau['page']) && $tableau['page']==1){
header("Status : 301 Moved Permanently");
header('location:/dynamique/categorie.php?id='.$id_transmit.'');
}
Ceci fait, il nous reste plus qu'à injecter le numéro de la page en cours dans les méta-tags voir même dans le titre (h1) pour limiter le duplicate content :
<?php if(isset($tableau['page'])){ echo 'page '.$tableau['page'].'';}?>
Soit :
    <title><?php echo $titre_categorie;?> <?php if(isset($tableau['page'])){ echo 'page '.$tableau['page'].'';}?></title>
    <meta name="Description" content="<?php echo $description_categorie;?> <?php if(isset($tableau['page'])){ echo 'page '.$tableau['page'].'';}?>" />
Et éventuellement la balise h1 :
<h1>Cat&eacute;gorie "<?php echo $titre_categorie;?>"  <?php if(isset($tableau['page'])){ echo 'page '.$tableau['page'].'';}?></h1>
Si vous utilisez un fil d'ariane, pensez également à injecter le numéro de la page en cours comme ci-dessous :
<p>Vous êtes ici : <a title="Accueil" href="index.php">Accueil</a> » <a title="<?php echo $titre_categorie;?>" href="categorie.php?<?php if(isset($tableau['page'])){echo 'page='.$tableau['page'].'&';}?>id=<?php echo $id_transmit;?>"><?php echo $titre_categorie;?></a></p>
Voir/déposer un commentaire (25) | Signaler un problème