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 !
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('&','&',$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
merci pour votre sujet
merci Christian de ton partage !
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+
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.
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
oui…
https://www.webtolosa.com/2011/04/28/reecriture-url-ou-url-rewriting-petit-tutoriel/
Parfait
Il fonctionne à merveille
Une solution pour les Url rewriting?
Merci pour ce partage
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 !
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 ?
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 !!!
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
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 ? ??? ??? ??? ??? ???
Bonjour
Moi j’utilise les url rewriting alors comment générer le sitemap?
Merci d’avance
:)) clair et ça marche. Merci
thx merci