Générer un sitemap xml en PHP
Un sitemap est un fichier XML qui liste toutes les pages d'un site web. Ce fichier est destiné aux moteurs de recherche comme Google, Yahoo ou Bing, qui s'en servent pour indexer un site et le référencer ses pages dans les résultats de recherche.
Attention, il ne faut pas confondre un sitemap XML avec une page web "plan du site" qui liste les principales pages d'un site et présente sa structure, sa navigation...
Ce protocole nommé officiellement Sitemaps a été inventé par Google en 2005 pour permettre aux éditeurs de site web de pouvoir "communiquer" avec les robots d'indexation (crawler) en leur fournissant la liste des URL de toutes les pages d'un site.
Voici à quoi ressemble un sitemap :
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.photoshoptuto.com/</loc> <lastmod>2013-02-08T08:29:01+00:00</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> <url> <loc>http://www.photoshoptuto.com/tuto/epouvantail-effrayant-1018</loc> <lastmod>2013-02-08T08:29:01+00:00</lastmod> <changefreq>monthly</changefreq> <priority>0.2</priority> </url> <url> <loc>http://www.photoshoptuto.com/proposer-un-tuto</loc> <lastmod>2009-12-21T18:19:47+00:00</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> </url> <url> <loc>http://www.photoshoptuto.com/tag/35mm</loc> <changefreq>weekly</changefreq> <priority>0.3</priority> </url> </urlset>
La première ligne est indique le type de document et l'encodage, on appelle cela le prologue (c'est l'équivalent du doctype sur une page xHTML) :
<?xml version="1.0" encoding="UTF-8"?>
Ensuite, il faut créer le noeud racine urlset (c'est comme ça que google l'a nommé). Cette balise doit comporter plusieurs attributs, tout ceci est commun à tous les sitemaps XML, ça fait partie du protocole défini par Google :
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> </urlset>
Maintenant il ne reste plus qu'à créer autant de noeuds <url>
que votre site comporte d'URL. Chaque noeud comporte plusieurs éléments, dont voici les principaux :
- loc : URL absolue de la page web, ce champ est obligatoire.
- lastmod : date de dernière modification de la page.
- changefreq : indique à quelle fréquence la page est mise à jour : always, hourly, daily, weekly, monthly, yearly ou encore never
- priority : il s'agit d'un nombre décimal dont la valeur est comprise entre 0.0 (priorité très faible) et 1.0 (priorité très importante). Ce champ permet aux moteurs de différencier les pages importantes de votre site, celles qui permettent d'accéder à beaucoup d'autres comme les menus, les rubriques principales... Il est inutile de mettre toutes les priorités à 1.0 en espérant obtenir une optimisation SEO, priority est une notion relative, plus cette information est pertinente et représentative, mieux c'est.
La génération de la liste des URL dépend de votre site. Si vous avez développé vous même votre site (from scratch ou avec un framework comme Cake PHP, Symfony ou Zend), alors vous savez comment sont formées vos URL, il suffit alors de récupérer les données en base (MySQL) puis de les afficher dans une boucle.
Voilà par exemple un sitemap qui liste toutes les URL des FAQ sur finalclap :
<?php // Récupération des données dans la base de données (MySQL) $faqs = $db->query("SELECT id, permalien FROM fc_faq WHERE etat = 1"); // Affichage header('Content-Type: text/xml; charset=UTF-8'); echo '<?xml version="1.0" encoding="UTF-8"?>'."\n"; ?> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <?php // Boucle qui liste les URL while($row = mysql_fetch_object($faqs)){ $loc = 'http://'.DOMAINE.'/faq/{$row->id}-{$row->permalien}'; $priority = '0.8'; $changefreq = 'never'; echo ' <url> <loc>'.$loc.'</loc> <changefreq>'.$changefreq.'</changefreq> <priority>'.$priority.'</priority> </url>'; } ?> </urlset>
Méfiez vous de la directive de configuration php short_open_tag
(qui permet d'utiliser une balise d'ouverture PHP raccourcie : <?
au lieu de <?php
), elle pose souvent problème lorsqu'on travaille avec du XML, car l'interpréteur PHP peut confondre le prologue XML avec un tag d'ouverture PHP.
Les sitemaps sont en UTF-8
Les fichiers sitemaps doivent impérativement utiliser l'encodage UTF-8. Si votre site n'est pas en UTF-8 nativement, vous devez utiliser la fonction utf8_encode
pour encoder chacune de vos variables, et aussi encoder tout votre script PHP en UTF-8 (très facile à faire dans Notepad++ via le menu Encodage > Convertir en UTF-8 (sans BOM)).
Header XML utf-8
Idéalement, votre script PHP doit renvoyer un header HTTP indiquant le type MIME du contenu : text/xml
, ainsi que l'encodage : UTF-8, comme on peut le voir dans mon extrait de code ci-dessus. Cela permet d'indiquer à n'importe quel programme (navigateur web, robot d'indexation) qui consulte ce script de l'interpréter correctement, c'est à dire comme un fichier XML, et pas comme une page web HTML.
Allez donc jeter un oeil sur cette page : changer la couleur d'une cellule si la valeur est différente.
Utiliser une feuille de style XSL
Par défaut, un sitemap s'affiche de manière brute dans un navigateur. Mais il est possible de mettre en forme le sitemap avec HTML/CSS, en créant un template XSL (XML Stylesheet). C'est le cas sur le sitemap de photoshoptuto par exemple : http://www.photoshoptuto.com/sitemap.xml.
Si vous utilisez un CMS comme Wordpress, Joomla, Drupal ou phpBB, il existe surement un plugin pour créer des sitemap, dans ce cas vous n'aurez pas à coder cette fonctionnalité vous-même.
Créer un sitemap sur un blog Wordpress
Il existe un excellent plugin Wordpress pour créer des sitemap : Google (XML) Sitemaps Generator for WordPress. De plus, ce plug-in créé une version compressée (avec la compression gunzip : .gz), ce qui diminue le trafic réseau (car les sitemaps sont généralement de gros fichiers qui dépassent facilement 1 Mo).
Sitemap pour forum phpBB
Si vous utilisez un forum phpBB, il existe le mod Google Yahoo MSN Sitemaps & RSS qui permet comme son nom l'indique de générer un sitemap et un flux RSS. Ce mod est également intégré à phpBB-SEO, une version modifiée de phpBB optimisée pour le référencement (qui est d'ailleurs utilisée pour le forum finalclap).
GYM Sitemap créé plusieurs sitemaps réunis au sein d'un sitemap index, le tout mis en forme avec XSL, ce qui rend le sitemap parfaitement lisible et accessible pour un être humain, ex: http://forum.finalclap.com/forum-sitemap.xml.
Pensez aussi à créer un compte Google (si vous n'en avez pas déjà un) qui vous permettra d'accéder à Google Webmaster Tools et d'y enregistrer l'URL de votre sitemap, que Google viendra ensuite consulter régulièrement pour trouver rapidement les nouvelles pages.
Outil de génération automatique de sitemap
Des outils permettent de générer des sitemaps automatiquement en parcourant un site en suivant ses liens internes. Il y a par exemple le logiciel Xenu ou encore des générateur de sitemap en ligne [xml-sitemaps.com], mais ça n'est pas une bonne approche.
Il faut voir le sitemap XML comme un flux de syndication (au même titre que les flux RSS), et pas comme un fichier statique. En écrivant un script PHP pour générer un sitemap automatiquement et en temps réel, vous n'aurez pas besoin de maintenir votre sitemap à jour manuellement.
Découvrez ce tutoriel photoshop : filtre cartoon/bande-dessinée à lire tout de suite !