Mise en place des articles par catégorie

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.
La page que nous allons à présent créer doit permettre d'afficher les articles de la catégorie visité. Nous devons donc afficher le titre, une courte description et la date de chaque article. Par ailleurs, une catégorie peut contenir beaucoup d'article et nous devons donc limiter l'affichage pour ne pas avoir une page interminable. Pour ce faire, nous allons mettre en place une pagination.

A partir du fichier "index.php" qui nous sert de modèle, nous créons un nouveau fichier nommé "categorie.php" :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr-fr">
 
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>***</title>
<meta name="Description" content="***" />
<link href="http://<?php echo $_SERVER['HTTP_HOST'];?>/style.css" rel="stylesheet" type="text/css"/>
</head>
 
<body>
 
<div id="moncadre">
<?php include('menu.php');?>
<div class="cadrecentrale">
<?php include('formulaire.php');?>
<h1>***</h1>
</div>
<?php include('footer.php');?>
</div>
 
</body>
</html>
 Comme vous l'avez sans doute remarqué (ou peut être pas), rien n'est renvoyé par l'url (GET) ni par (POST) vers cette page et il faut donc récupérer les informations par un autre moyen pour afficher le contenu de la catégorie. Nous allons utilisé la variable d'environnement $_SERVER["REQUEST_URI"] qui va nous renvoyer le nom du dossier contenu dans l'url sous la forme : /nom-du-dossier/. Pour extraire uniquement le nom du dossier sans les slachs (/), nous allons faire un simple explode() sur cette variable.

Nous commençons notre code avant le DOCTYPE.
<?php
$nom_categorie = explode("/", $_SERVER["REQUEST_URI"]);
Si nous effectuons un print_r(); comme ci-dessous :
echo '<pre>';
print_r($nom_categorie);
echo '</pre>';
nous obtenons le tableau suivant :
Array
(
    [0] => 
    [1] => nom-de-la-categorie
    [2] => ?page=1
)
La variable $nom_categorie[1] nous donne donc le nom du dossier et la variable $nom_categorie[2] nous donne le numéro de la pagination en cours.

Note : à ce stade, il est normal pour vous que la variable $nom_categorie[2] ne retourne rien car la pagination n'est pas encore mise en place mais pour les besoins de ce tutoriel, il est nécessaire que j'indique cette variable qui va de toute façon arriver dans l'acheminement dans ce tutoriel.
 
On place à présent les éléments du tableau dans des variables :
//On à maintenant le nom du fichier sans les /
$nom_du_dossier = $nom_categorie[1];
//Pour l'url canonique, on récupère la pagination en cours (?page=2)
$url_canonique_categorie = $nom_categorie[2];
La pagination des catégories qui va venir dans ce tutoriel va faire apparaitre une nouvelle variable dans l'url qui sera sous la forme ?page=1 soit http://monsite.free.fr/categorie/?page=1. Pour éviter toute forme de duplicate, nous allons récupérer le numéro de la pagination en cours pour l'injecter dans les méta-tags ou effectuer une redirection et pour parvenir à notre fin, nous utilisons la fonction str_replace() :
//On récupère uniquement le numéro de la page
$numero_page = str_replace('?page=' , '' ,$nom_categorie[2]);
On effectue à présent un premier contrôle pour voir si le numéro de la pagination en cours est bien de type numérique :
/* Si le numéro de la page n'est pas de type numérique, c'est qu'un abrutit fait joujou avec l'url ... alors on redirige vers la catégorie en cours */
if(!empty($numero_page) AND !is_numeric($numero_page))
{
    header("Status : 301 Moved Permanently");
    header('location:http://'.$_SERVER['HTTP_HOST'].'/'.$nom_du_dossier.'/');
    exit();
}
Pour éviter toute source de duplicate content (contenu dupliqué), on va injecter le numéro de la page en cours (sous la forme : page 1)  dans le titre, la description, la balise H1 et le fil d’Ariane de la catégorie :
if($numero_page > 1){
    $numero_pagination = ' page '.$numero_page.'';
}
Si la pagination de la catégorie est égal à "?page=1", on redirige vers la catégorie sans pagination pour éviter le duplicate. Ainsi /nom-de-la-categorie/?page=1 est redirigé vers /nom-de-la-categorie/ qui est en réalité la même page :
if($nom_categorie[2]=='?page=1'){
    header("Status : 301 Moved Permanently");
    header('location:http://'.$_SERVER['HTTP_HOST'].'/'.$nom_du_dossier.'/');
    exit();
}
Ceci fait, on se connecte à la base de données :
include('connexion_bd.php');
include('fonctions.php');
connexion_bd();
On va maintenant chercher les éléments de la catégorie en cours. Si la catégorie n'existe pas, on redirige vers l'accueil du site et à l'inverse, on stocke les données dans des variables pour être utilisés plus tard :
$nom_categorie = mysql_query("SELECT id,nom_categorie,description_categorie FROM CATEGORIES WHERE titre_rewrite='".mysql_real_escape_string($nom_du_dossier)."'");
 
//on voie si il y a quelque chose
if(mysql_num_rows($nom_categorie) == 0)
{
    //Il n'y a rien, on redirige vers l'index
    header("Status : 301 Moved Permanently");
    header('location:http://'.$_SERVER['HTTP_HOST'].'');
    exit();
}
else{
    //Il y a quelque chose
    while($cat = mysql_fetch_array($nom_categorie))
    {
        $id_categorie=$cat['id'];
        $titre_categorie=$cat['nom_categorie'];
        $description_categorie=$cat['description_categorie'];
    }
}
?>
Nous pouvons à présent remplir les méta-tags de la catégorie et injecter le numéro de la pagination si besoin :
<title>
<?php
if(isset($titre_categorie)) echo $titre_categorie;
if(isset($numero_pagination)) echo $numero_pagination;
?>
</title>
<meta name="Description" content="<?php if(isset($description_categorie)) echo $description_categorie; if(isset($numero_pagination)) echo $numero_pagination;?>" />
Toujours dans l'optique de diminuer les sources de duplicate lié à la pagination, nous introduisons l'url canonique de la page :
<link rel="canonical" href="http://<?php echo $_SERVER['HTTP_HOST'];?>/<?php echo $nom_du_dossier;?>/<?php echo $url_canonique_categorie;?>" />
On remplit la balise H1 :
<h1><?php echo $titre_categorie;
if(isset($numero_pagination)) echo $numero_pagination;?></h1>
Pour le confort de nos visiteurs, on construit un fil d’Ariane pour leurs indiquer ou ils se situent sur le site. En plus, c'est bon pour le référencement puisque ça permet de lier les pages entre elles!
<p class="fil-ariane">
<a title="Accueil" href="http://<?php echo $_SERVER['HTTP_HOST'];?>">Accueil</a> »
<strong><a title="<?php echo $titre_categorie;?>" href="http://<?php echo $_SERVER['HTTP_HOST'];?>/<?php echo $nom_du_dossier;?>/<?php echo $url_canonique_categorie;?>"><?php echo $titre_categorie; if(isset($numero_pagination)) echo $numero_pagination;?></a></strong>
</p>
A présent, on compte le nombre d'article qu'il y a dans la catégorie pour effectuer la pagination :
<?php
//On compte le nombre de page dans la catégorie
$retour_total=mysql_query("SELECT COUNT(*) AS total FROM CONTENU WHERE id_categorie='".mysql_real_escape_string($id_categorie)."' AND valide = 'oui'");
$donnees_total=mysql_fetch_assoc($retour_total);
$total=$donnees_total['total'];
On calcul le nombre d'article et de pagination à afficher :
$nombreDePages=ceil($total/$messagesParPage);
if(isset($_GET['page']))
{
    $pageActuelle=intval($_GET['page']);
 
    if($pageActuelle>$nombreDePages)
    {
        $pageActuelle=$nombreDePages;
    }
}
else
{
    $pageActuelle=1;
}
 
$premiereEntree=($pageActuelle-1)*$messagesParPage;
Pour rappel, la variable $messagesParPage se situe dans le fichier des fonctions et est modifiable via le panel admin.
Puis on effectue une simple requête pour sortir les résultats tout en prenant en compte la pagination :
$page=mysql_query("SELECT titre,description,titre_rewrite,date FROM CONTENU WHERE id_categorie='".mysql_real_escape_string($id_categorie)."' AND valide = 'oui' ORDER BY id DESC LIMIT ".$premiereEntree." , ".$messagesParPage." ");
On vérifie si il y a quelque chose :
if(mysql_num_rows($page) == 0)
{
    //Si il n'y a rien, on informe le visiteur
    echo '<div class="cadre">Aucun article pour le moment dans la catégorie '.$titre_categorie.'.</div>';
}
Si le numéro de la page récupéré dans l'url est supérieure au numéro de la page trouvé calculé avec la bd, c'est qu'un "kéké" fait joujou avec l'url alors on redirige vers la catégorie initiale :
elseif($numero_page>$nombreDePages)
{
echo '<script type="text/javascript"> window.setTimeout("location=(\'http://'.$_SERVER['HTTP_HOST'].'/'.$nom_du_dossier.'/\');",10) </script>';
}
Tout c'est bien passé, on affiche à présent les articles de la catégorie :
else
{
    //On affiche les pages qui correspondent à la catégorie et en l’occurrence le titre, la description et la date :
    while($affiche = mysql_fetch_array($page))
    {
        echo '<div class="cadre">         <h2 class="h2"><a title="'.$affiche['titre'].'" href="http://'.$_SERVER['HTTP_HOST'].'/'.$nom_du_dossier.'/'.sanspointphp($affiche['titre_rewrite']).'">'.$affiche['titre'].'</a></h2>         <p>'.tronquer(nl2br($affiche['description'])).'<br/><br/><span class="date">'.convertit_date($affiche['date']).'</span></p>         </div>';
    }
}
Pour finir, on inclue le système de pagination :
//On inclue le système de Pagination
include('pagination.php');
?>
La page categorie.php est à présent terminé, on passe à présent à la création du fichier de pagination.

Le code du fichier de pagination (pagination.php) à placer à la racine du site :
<?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;
}
 
//on affiche la pagination
echo '<p class="pagination">' . pagination($pageActuelle, $nombreDePages) . '</p>';
?>
Mise en place des articles par catégorie CMS free.fr
Voir/déposer un commentaire (0) | Signaler un problème