picture picture
avril 8, 2009 MySQL, PHP 15 Commentaires

Réalisation dynamique d’un fichier sitemap pour Google en PHP4/MySQL

Le protocole Sitemaps, proposé par Google et ensuite adopté par Live Search, Yahoo, Ask et Exalead, permet de spécifier un plan de site dans un format lisible par les robots d’indexation, en texte brut ou en XML.
Par défaut, les outils pour développeurs de Google proposent une création en Python… Pour les amoureux de PHP, voici quelques explication pour créer ce plan du site en PHP4 – MySQL : efficacité garantie en matière de référencement des sites et d’amélioration des page-rank !

1. Créer la table sitemap (voir sitemap.sql) :
sitemap.sql
CREATE TABLE `sitemap` (
`id` int(11) NOT NULL auto_increment,
`url` varchar(100) NOT NULL default '',
`date` date NOT NULL default '0000-00-00',
`nb` int(11) NOT NULL default '0',
UNIQUE KEY `id` (`id`),
KEY `url` (`url`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

2. Personnaliser les paramètres de configuration de connect.inc.php selon le serveur :
connect.inc.php
<?php
/* ##################################################################
###### CONFIGURATION DES ACCES A LA BASE DES DONNEES DU SITE ########
###################################################################*/
// à placer dans le dossier /inc/ sur du site, puis à appeler en include
$db_link = mysql_connect ("localhost", "root", "") or die ('Je ne peux pas me connecter à la base parceque : ' . mysql_error()); // exemple en local
mysql_select_db ("nom_de_la_base");
?>

3. Déposer sur la racine du site le dossier ../inc/ avec les 3 fichiers PHP :
sitemap.inc.php
<?php
/* #################################################
###### REMPLISSAGE DE LA TABLE SITEMAP.SQL ########
###################################################*/
// à mettre au même niveau que le fichier connect.inc.php dans un dossier ../inc/
$url_ = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

if($url_) {
include("connect.inc.php");
$req = mysql_query("SELECT COUNT(*) FROM sitemap WHERE url='$url_'") or die(mysql_error());
$quant_r = mysql_fetch_row($req);

if($quant_r[0] >= 1){
$req1 = "UPDATE sitemap SET nb=nb+1 where url='$url_'";
$result = mysql_query($req1) or die('Erreur SQL !<br />'.$req1.'<br />'.mysql_error());
}
else {
$date_=date("Y-m-d",time());
$req1 = "INSERT INTO `sitemap` ( `id` , `url` , `date` ) VALUES ('', '$url_', '$date_' )";
$result = mysql_query($req1) or die('Erreur SQL !<br />'.$req1.'<br />'.mysql_error());
}
}
// effacement des pages non visitées depuis plus de 3 mois
// on donne l'intervalle en jours
$interval = 90;
// on ramène en intervalle UNIX en secondes
$tablodatemini = getdate(mktime()-($interval*24*3600));
// formatage SQL
$date_del = $tablodatemini['year'].'-'.$tablodatemini['mon'].'-'.$tablodatemini['mday'];
$requete = "DELETE FROM sitemap WHERE date < '$date_del'";
$result = mysql_query($requete) or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
mysql_close();
?>

smgen_dyn.php
<?php
/* #################################################
###### GENERATION DU SITEMAP.XML POUR GOOGLE #######
###################################################*/
// à placer dans le dossier ../inc/
$fichier = 'sitemap.xml';
$path = '../'; // pour placer le fichier xml en racine
$fp=fopen($path.$fichier,"w");
$sitemap="<?xml version=\"1.0\" encoding=\"UTF-8\"?> ";
$sitemap.="<urlset xmlns=\"http://www.google.com/schemas/sitemap/0.84\"> ";

include("connect.inc.php");
$requete = "SELECT url,date FROM `sitemap` order by id limit 0,50000";
$liste = mysql_query($requete) or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
while(list($a,$b) = mysql_fetch_array($liste)) {
$a = ereg_replace('&','&amp;',$a);
$a = ereg_replace(',','%2C',$a);
$a = ereg_replace(' ','%20',$a);
$sitemap.="\t<url> ";
$sitemap.="\t\t<loc>$a</loc> ";
$sitemap.="\t\t<lastmod>$b</lastmod> ";
//$sitemap.="\t\t<changefreq>monthly</changefreq> ";
//$sitemap.="\t\t<priority>0.5</priority> ";
$sitemap.="\t</url> ";
}

$sitemap.="</urlset> ";

fwrite($fp,$sitemap);

mysql_close();
mysql_free_result($liste);
?>

4. Insérer include(« ../inc/sitemap.inc.php »); en haut de chaque page à indexer (à personnaliser selon le path de chaque fichier).
Cela va permettre de remplir la table sitemap.sql lors de chaque accès visiteur sur une page, avec un compteur de visites par page.

5. Pour créer le fichier-racine sitemap.xml, puis le mettre à jour depuis la table sitemap.sql :
soit insérer include(« inc/smgen_dyn.php »); sur la page d’index du site pour une génération automatique à chaque visite,
soit executer manuellement ../inc/smgen_dyn.php quand on veut, depuis le back-office par exemple.
– NB : il peut être nécéssaire, selon le serveur, de modifier le CHMOD de sitemap.xml et smgen_dyn.php (666 > accessible en lecture-écriture)

6. Créer un compte Google Tools pour Développeurs, puis déclarer et valider le site + le sitemap.xml (voir mode d’emploi sur Google)

7. Il est également possible de déposer un fichier robots.txt sur la racine du site pour fermer certains dossiers à l’indexation (à personnaliser par raport au fichier d’exemple)
robots.txt
User-agent: *
Disallow: /backoffice/
Disallow: /error/
Disallow: /statistiques/

Télécharger les fichiers d’exemple

That’s All Folk :)

15 Responses to “Réalisation dynamique d’un fichier sitemap pour Google en PHP4/MySQL”

15 Commentaires

  1. webtolosa dit :

    merci Christian de ton partage !

  2. christian dit :

    Bonjour,

    Et voilà la solution.

    Dans le fichier sitemap.inc.php
    Remplacer:

    if($quant_r[0] >= 1){
    $req1 = « UPDATE sitemap SET nb=nb+1 where url=’$url_' »;
    $result = mysql_query($req1) or die(‘Erreur SQL !’.$req1. ».mysql_error());
    }

    Par:

    if($quant_r[0] >= 1){
    $req1 = « UPDATE sitemap SET nb=nb+1 where url=’$url_' »;
    $date_=date(« Y-m-d »,time());
    $req2 = « UPDATE sitemap SET date=’$date_’ where url=’$url_' »;
    $result = mysql_query($req1) or die(‘Erreur SQL !’.$req1. ».mysql_error());
    $result = mysql_query($req2) or die(‘Erreur SQL !’.$req2. ».mysql_error());
    }

    Cela permet de modifier le nombre de consultation ET de remplacer la date du sitemap par la date du jour.
    Ainsi cette annonce en reprends pour 90 jours avant d’être supprimée du sitemap.

    A+

  3. christian dit :

    Re

    Pour compléter mon précédent mail je pense qu’il faut intégrer après nb=nb+1 $date_=date(« Y-m-d »,time())

    if($quant_r[0] >= 1){
    $req1 = « UPDATE sitemap SET nb=nb+1 ICI where url=’$url_' »;
    $result = mysql_query($req1) or die(‘Erreur SQL !’.$req1. ».mysql_error());
    }

    Plusieurs tentatives d’écriture restées infructueuses mon encore une fois démontré mon peu de connaissance SQL (Et c’est peu dire)

    Merci pour votre aide à la compréhension.

  4. christian dit :

    Bonjour,

    J’ai une interrogation

    Lorsqu’on consulte les pages la date « Lastmost » dans le fichier sitemap n’est pas modifiée.

    Comment le contrôle pour l’effacement va s’effectuer?

    Exemple:


    http://unebonneoccasion.fr/viewlisting.php?view=1663
    2011-11-09

    Cette page peut-être consultée plusieurs fois la date reste au 2011-11-09

    Merci pour votre éclairage

  5. christian dit :

    Parfait
    Il fonctionne à merveille

    Une solution pour les Url rewriting?

    Merci pour ce partage

  6. Loran dit :

    Script très intéressant après lui avoir apporté qqs modifs, notamment au niveau de la présentation du fichier sitemap.xml.
    En tous cas bravo ! :smile:

  7. webtolosa@helene dit :

    helene, c’est le chemin vers le fichier de connexion a ta base des données qui ne va pas… regarde ton message d’erreur, tu as fait un copier-coller de mon code mais il faut que tu mettes le personnalises selon l’architecture de ton site.
    Dans mon exemple, ce fichier connect.inc.php est dans un dossier inc, lui même créé sur la racine.
    OK ?

  8. helene dit :

    bonjour,

    j’ai le message d’erreur ci-dessous lorsque j’ajoute : include("../inc/sitemap.inc.php");

    Message :
    Warning: mysql_query() [function.mysql-query]: Access denied for user ‘ODBC’@’localhost’ (using password: NO) in C:\wamp\www\monsite\mapage.php on line 63

    Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\wamp\www\monsite\mapage.php on line 63

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\wamp\www\monsite\mapage.php on line 64

    Merci de votre aide, je débute et je n’y arrive pas du tout !!!

  9. webtolosa dit :

    la base sert a stocker les pages visitées avec le nombre des visites en mémoire pour pouvoir les incrémenter et signaler a Google les pages les plus vues :)

  10. Dimix dit :

    Je ne comprend pas trops a koi sa sert la bdd dans le dite map ton script ne génère pas un sitemap directement ?
    faut-il entrent toute les pages dans la bdd ? sa ce fait automatiquement ? ??? ??? ??? ??? ???

  11. fubu dit :

    Bonjour

    Moi j’utilise les url rewriting alors comment générer le sitemap?
    Merci d’avance

  12. JP47 dit :

    :)) clair et ça marche. Merci

  13. weblover dit :

    thx merci

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: