Parlons de sitemaps

Publié dans XML | Marqué avec , , , ,
Share

A vrai dire il y a 2 types de sitemaps, puisque 2 utilisations possible des dites sitemaps :

  • La sitemap pour les visiteurs, plus communément appelée « Plan du Site ». Son but est d’aider le visiteur à se repèrer, elle doit donc être jolie, bien mise en forme, et ne pas contenir trop de liens. Google n’aime pas quand le nombre d’urls sur une page approche les 100, donc une sitemap ne doit afficher que les liens importants, et à la rigueur les articles en vues.
  • La sitemap pour les robots, comme les robots de moteur de recherche. Son but est d’aider les moteurs de recherche à indexer plus rapidement toutes les pages d’un site Internet. Qu’importe la beauté, c’est donc la structure du fichier qui compte puisqu’un protocole a été mise en place pour standardiser tout ça. Une sitemap peut contenir autant d’url que l’on veut, tant que l’on s’y prend bien. (puisqu’en fait on peut créer plusieurs sitemaps que l’on liste avec une sitemapindex)

Je vais m’attarder un tout petit peu sur le deuxième type de sitemaps puisque j’ai dû générer la sitemaps d’un site de plus de 3 millions de pages, ce qui m’a un peu forcé à me pencher sur la question. (j’étais bien guidé cela dit !)

Le protocole Sitemap

Sitemap classique

Deux choix pour les sitemaps classiques * Un fichier texte avec tous les urls à la ligne. Pas top. * Un fichier XML bien mis en page avec possibilité de spécifier certaines options. Bien mieux ! C’est là dessus que je vais m’attarder.
Voici la tête d’une petite sitemap XML avec 3 urls :

 <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>  
      <loc>http://la-bnbox.fr/cahier.html</loc>
      <lastmod>2009-07-10</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.8</priority>
   </url>
   <url>
      <loc>http://la-bnbox.fr/t18-francais.cahier</loc>
      <lastmod>2009-07-25</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.7</priority>
   </url>
   <url>
      <loc>http://la-bnbox.fr/554-Prepa-PSI--Penser-l-Histoire---Introduction.cahier</loc>
      <lastmod>2009-07-25</lastmod>
      <changefreq>yearly</changefreq>
      <priority>0.5</priority>
   </url>
</urlset>

L’entête est assez classique, mais on peut noter que l’encodage est en UTF-8 et qu’il faut qu’il soit en UTF-8.
Et on peut résumer un bloc pour un url de cette manière :

<url>
   <loc>http://lien-de-la-page.fr/</loc>
   <lastmod>AAAA-MM-JJ</lastmod>
   <changefreq>always/hourly/daily/weekly/monthly/yearly/never</changefreq>
   <priority>0.0 à 1.0. Le priorité par défaut étant 0.5</priority>
</url>
  • loc : l’url de la page, seul paramètre obligatoire
  • lastmod : date de la dernière modification du contenu de la page. Cette date doit être au format date et heure du W3C. Si la page change souvent, il peut être utile de préciser les heures et les minutes : AAAA-MM-JJThh:mm:ss+01:00
  • changefreq : donne une idée de la fréquence de mise à jour de cette page.
  • priority : priorité de l’url par rapport aux autres urls de la sitemap. Bien sur, ces informations sont à titre d’information. Vous ne forcerez par Google à crawler votre site tous les jours en mettant toutes vos pages en changefreq always. (héhé)

Attention aussi, on est dans un fichier XML donc vous allez devoir remplacer vos & par &, vos apostrophe par ' , les guillemets doubles par ", > par >, < par <. Un petit parsage des accents avec htmlentities ne ferait pas de mal non plus. (mais en changeant bien les & dans és; par & donc &eacute;)
Une sitemap ne doit pas contenir plus de 50 000 urls et ne doit pas dépasser 10mo (vous pouvez la compresser, mais elle doit peser moins de 10mo décompressée). Un conseil : restez bien en dessous ! Mais comment faire lorsqu'on a 3 millions de pages... éh bien c'est assez simple, il suffit de séparer sa sitemap en plusieurs petites sitemaps et de créer une sitemap qui répertorie les urls de ces sitemaps, une sitemapindex quoi !

Sitemap Index

En voici la structure :

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      <loc>http://url-site-map.xml</loc>
      <lastmod>AAAA-MM-JJ</lastmod>
   </sitemap>
   ...
</sitemapindex>

Cette fois-ci lastmod correspond à la date de dernière modification de la sitemap. (et non des pages qu'elle répertorie, même si en théorie cela va de paire)
A nouveau une sitemapindex ne peut contenir plus de 50 000 liens et ne doit pas dépasser 10mo. Et si on a besoin de plus de 50 000 liens ? 50 000*50 000=2 500 000 000, changez de métier, devenez apiculteur.
Donc on résume :

  • Une sitemapindex répertoriant les sitemaps
  • Plusieurs sitemaps répertoriant toutes les pages du site

Tous ces fichiers doivent être des fichiers XML et on se fiche de leur nom, et ils ne peuvent répertorier des fichiers se trouvant dans un répertoire inférieur que le leur. En gros vos sitemaps doivent se retrouver à la racine de votre site Web. Eh ouais.

Donner à manger aux moteurs de recherches

Pour donner des sitemaps à manger aux moteurs de recherches, il y a plusieurs méthodes possibles, mais le plus simple est surement de rajouter une ligne au fichier robots.txt se trouvant à la racine de votre site :

Sitemap: http://www.example.com/sitemap.xml

Vous précisez ainsi le chemin vers votre sitemap, ou votre sitemapindex. Il est possible de préciser plusieurs sitemaps en ajoutant une nouvelle ligne Sitemap: ..., ce qui évite de faire une sitemapindex pour 2 pauvres sitemaps !

Bien comprendre le protocole

C'est a priori Google qui en est à l'origine du protocole sur les sitemaps ! Cela dit, c'est le site officiel du protocole, disponible en plusieurs langues, qui est une vraie mine d'or pour bien comprendre comment créer une sitemap aux normes. Protocole Sitemaps

Générer des sitemaps

De manière générale, pour un site un peu gros, générer des sitemaps à la main, c'est malsain ! Surtout quand il est si simple de créer une classe PHP qui fait ça rapidement. Un exemple d'une méthode de ma classe PHP SiteMapGenerator :

<?php
function buildSiteMap(&$sitemapindex_items) {
	/* Boucle sur les sitesmaps */
	for($i=0;$i<4000;($i=($i+2000))) {
		$a_kw = mysql_query( 'SELECT cle_kw FROM `motclef` ORDER BY `cle_idt` ASC LIMIT '.$i.',2000' ) ;
		/* Ouverture du fichier */
		$nomFichier = 'msitemap-'.$i.''.($i+2000).'.xml';
		$fp = fopen($nomFichier, 'w') ;
		fputs($fp , '<?xml version="1.0" encoding="UTF-8"?>
		<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">') ;
		/* Boucle sur les mots clefs */
		while($kw = mysql_fetch_array($a_kw))
		{
			fputs($fp, '<url>
				<loc>'.$this->base_front_url.$kw['cle_kw'].'.html</loc>
				<lastmod>'.date('Y-m-d').'</lastmod>
				<changefreq>'.$this->defaultChangeFreq.'</changefreq>
				<priority>'.$this->defaultPriority.'</priority>
			</url>');
		}
		/* Pour la sitemapindex */
		$sitemapindex_items[] = array(
			'loc' => $this->baseFrontUrl.$nomFichier,
			'lastmod' => date('Y-m-d'),
			'changefreq' => $this->defaultChangeFreq,
			'priority' => $this->defaultPriority,
		);
		/* Fermeture du fichier */
		fputs($fp, '</urlset>') ;
		fclose($fp);
	}
	/* Construction de la sitemapindex */
	$this->buildSitemapIndex($sitemapindex_items) ; } function buildSitemapIndex($sitemapindex_items) {
	$nomFichier = 'sitemapindex.xml';
	$fp = fopen($nomFichier, 'w') ;
	fputs($fp , '<?xml version="1.0" encoding="UTF-8"?>
	<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
	foreach($sitemapindex_items as $sitemap)
	{
		fputs($fp, '<sitemap>
			<loc>'.$sitemap['loc'].'</loc>
    			<lastmod>'.$sitemap['lastmod'].'</lastmod>
			</sitemap>');
	}
	fputs($fp , '</sitemapindex>') ;
	fclose($fp);
} 

On pourrait peaufiner et ne changer que les pages qui ont été modifié, et ajouter les nouvelles en fin de fichiers, mais après tout la date n'est pas si importante que ça et ça me demandait de me plonger franchement dans les parser XML ce que je n'ai pas encore le courage de faire !

Conclusion

J'ai envie de dire qu'il ne reste plus qu'à réfléchir et à générer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *