Sitemap Google

All contributions published for previous SPIP versions

Créer un plan de votre site utilisable par Google sous la forme d’un fichier XML.

Présentation du Sitemap Google

Dans le cadre de son projet de bibliothèque mondiale de sites, Google vous propose de créer un plan du site [1] au format XML compressé en .gz. Voir à cette adresse. Ce fichier n’a aucune influence sur le classement de votre site. En voici les avantages selon Google :

-  faciliter la recherche de pages dans votre site,
-  présenter une version plus récente de votre site,
-  offrir des informations spécifiques sur vos pages, comme la dernière mise à jour ou leur fréquence de mise à jour.

Comment créer un sitemap ?

Il y a plusieurs façons de créer un sitemap Google. En particulier l’utilisation du générateur de sitemap Google, à condition que votre hébergement puisse exécuter le langage Python. Comme SPIP sait faire un plan du site et générer du XML, on utilisera des boucles SPIP et du PHP.

Ca doit se faire en 3 étapes :
-  création du fichier XML
-  compression en .gz
-  soumission du sitemap à Sitemap Google.

Pour soumettre le sitemap à Google on doit faire une requête HTTP :

http://www.google.com/webmasters/sitemaps/ping?sitemap=http://www.monsite.fr/url_sitemap

où “http://www.monsite.fr/url_sitemap” est l’URL complète du fichier sitemap compressé.

On peut donner n’importe quel nom au fichier sitemap. Dans le cadre de cet article, j’ai choisi le nom de sitemap, avec sitemap.xml.gz pour le fichier XML compressé [2] qui sera transmais à Google.

Puis il faudra refaire ces 3 étapes à chaque modification du site.

Spécifications

Ce fichier sitemap.xml.gz est le fichier compressé d’un fichier sitemap.xml, donc au format XML.

Notre fichier sitemap.xml doit se présenter ainsi :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
   <url>
      <loc>http://www.votresite.com/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
   </url>
   <url>
      <loc>http://www.votresite.com/rubrique.php3?id_rubrique=1</loc>
      <changefreq>weekly</changefreq>
   </url>
   <url>
      <loc>http://www.yoursite.com/article.php3?id_article=1</loc>
      <lastmod>2004-12-23</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.2</priority>
   </url>
   <url>
      <loc>http://www.yoursite.com/article.php3?id_article=2</loc>
      <lastmod>2005-01-06</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.6</priority>
   </url>
   ...
</urlset>

Soit un en-tête XML, puis une balise <urlset> qui englobe tout le reste. Et pour chaque page, une balise <url> englobant les balises <loc>, <lastmod>, <changefreq> et <priority>.

BaliseDéfinitionFormat
<loc> l’URL de la page (la seule balise obligatoire) URL
<lastmod> la date de modification de la page ISO 8601 [3] ou AAAA-MM-JJ
<changefreq> la fréquence de mise à jour doit prendre une de ces valeurs : “always”, “hourly”, “daily”, “weekly”, “monthly”, “yearly” ou “never”
<priority> priorité de la page relative aux autres pages du site entre 0 et 1 (valeur par défaut : 0.5)

Précisions

-  La fréquence de mise à jour est une indication et non pas une obligation pour les moteurs de recherche. Indiquez “always” (toujours) pour une page mise à jour à chaque accès et “never” (jamais) pour une page d’archive.

-  La priorité est une indication relative aux autres pages du site, et non par rapport aux autres sites.

Contraintes

  1. Le fichier sitemap.xml.gz doit se trouver à la racine du site.
  2. Le fichier sitemap.xml doit être encodé en UTF-8 (et pas en ISO 8859-1)
  3. Le fichier sitemap.xml ne peut pas contenir plus de 50 000 pages ou ne pas dépasser 10 Mo.

Si votre sitemap contient plus de 50 000 pages ou dépasse les 10 Mo, vous trouverez comment faire sur Sitemap Google. En gros, il faut créer plusieurs sitemaps et un fichier qui les indexe.

Etape 1 : Création du fichier sitemap.xml

On va créer un plan du site avec les balises imposées par Google. Il nous faudra un fichier sitemap.php3 et un fichier sitemap.html.

Fichier sitemap.php3

Comme tous les fichiers xxx.php3 :

<?php
$fond = "sitemap";
$delais = 0;
include ("inc-public.php3");
?>

Le délais est à 0, car en principe chaque fois que vous accéder à cette page c’est pour envoyer un sitemap différent à Google.

Fichier sitemap.html : les boucles SPIP

Ce fichier doit générer un plan du site sous forme de fichier XML. L’ordre des URLs importe peu, mais on utilisera ici la structure d’un plan du site.

Vous pouvez (devez ?) l’adapter ce squelette à votre site.

<?php echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>'; ?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">

<url>
  <loc>#URL_SITE_SPIP/</loc>
  <changefreq>daily</changefreq>
</url>

<BOUCLE_secteurs(RUBRIQUES) {id_parent=0}>
<url>
  <loc>#URL_RUBRIQUE</loc>
  <lastmod>[(#DATE|affdate{'Y-m-d'})]</lastmod>
  <changefreq>daily</changefreq>
</url>

    <B_rubriques>
    <BOUCLE_rubriques(RUBRIQUES) {id_parent}>
    <url>
        <loc>#URL_RUBRIQUE</loc>
        <lastmod>[(#DATE|affdate{'Y-m-d'})]</lastmod>
        <changefreq>daily</changefreq>
    </url>
    
        <B_articles_rubriques>
        <BOUCLE_articles_rubriques(ARTICLES) {id_rubrique}>
        <url>
            <loc>#URL_ARTICLE</loc>
            <lastmod>[(#DATE_MODIF|affdate{'Y-m-d'})]</lastmod>
            <changefreq>weekly</changefreq>
            <priority>[(#POPULARITE|pourcent)]</priority>
        </url>
        </BOUCLE_articles_rubriques>
        </B_articles_rubriques>
        
        <BOUCLE_recursive(boucle_rubriques)></BOUCLE_recursive>
        
    </BOUCLE_rubriques>
    </B_rubriques>
    
    <B_breves>
    <BOUCLE_breves(BREVES) {id_rubrique}>
    <url>
        <loc>#URL_BREVE</loc>
        <lastmod>[(#DATE|affdate{'Y-m-d'})]</lastmod>
        <changefreq>weekly</changefreq>
    </url>
    </BOUCLE_breves>
    </B_breves>

    <B_articles>
    <BOUCLE_articles(ARTICLES) {id_rubrique}>
    <url>
        <loc>#URL_ARTICLE</loc>
        <lastmod>[(#DATE_MODIF|affdate{'Y-m-d'})]</lastmod>
        <changefreq>weekly</changefreq>
        <priority>[(#POPULARITE|pourcent)]</priority>
      </url>
    </BOUCLE_articles>
    </B_articles>
    
</BOUCLE_secteurs>

</urlset>

Commentaires sur les balises

La première ligne utilise l’astuce du fichier backend.html pour afficher l’en-tête XML.
La 2e ligne ouvre la balise générale <urlset> qui contient la référence au schéma Google pour ce fichier

Ces 2 lignes sont indispensables.

Les boucles génèrent des balises <url>, avec leurs balises <loc>, <lastmod>, <changefreq> et <priority>, que nous allons détailler.

-  La balise <loc> contient l’URL de la rubrique, de la brève ou de l’article. Si votre base de données n’a pas été générée en UTF-8, il faut lui appliquer le filtre utf8_encode, qui est une fonction PHP.
-  La balise <lastmod> doit être au format ISO 8601 ou AAAA-MM-JJ. On a choisi ce dernier format généré par le filtre affdate{'Y-m-d'}.
-  La balise <changefreq> est en fonction de la fréquence de modification de vos pages. Les articles changent très peu, par contre les rubriques changent assez souvent. Mais si vos articles ont des forums, la modification est plus fréquente.
-  Pour la balise <priority>, je me suis servi (arbitrairement) de la popularité relative des articles, ce qui correspond assez bien au critère de relativité de Google. Comme cette popularité prend des valeurs entre 1 et 100, il faut la diviser par 100 pour avoir une priorité entre 0 et 1 : d’où le filtre pourcent.

Voici ce filtre pourcent. A mettre dans votre fichier mes_fonctions.php3.

function pourcent($valeur) {
    return $valeur / 100;
}

Enfin la dernière ligne ferme la balise générale <urlset>.

Notes

1. Filtre affdate{'Y-m-d'}. Si votre site utilise une version inférieure à SPIP 1.8 (y compris certaines versions 1.8 alpha-bêta), il vous faudra créer votre propre filtre (à mettre dans mes_fonctions.php3) :

function affdateYmd($date) {
    return date("Y-m-d", strtotime($date));
}

et donc remplacer les [(#DATE|affdate{'Y-m-d')] par [(#DATE|affdateYmd)]

2. Le sitemap.xml doit être encodé en UTF-8. Si toutes vos URLs sont de type “xxx.php3?id_xxx=YY” ou “xxxYY.html” ou “xxx_yyy_zzz”, ça ne pose aucun problème. Par contre, si elles contiennent des caractères tels que “&”, il faut les encoder avec le filtre ut8_encode, qui est une fonction PHP (donc inutile de créer ce filtre dans mes_fonctions.php3) : [(#URL_XXX|utf8_encode)].

Si vous avez un doute, utilisez le couple sitemap_affichage.php3/sitemap_affichage.html, contenu dans le document joint à cette contrib, pour tester votre fichier XML.

3. Si vous utilisez des forums dans vos articles, et que ces forums sont importants pour le contenu, il serait intéressant d’indiquer la date du dernier message à la place de la date des articles (sauf s’il n’y a pas de forum) ainsi :

<lastmod>
    <B_forum_article>
    <BOUCLE_forum_article(FORUMS){id_article}{par date}{inverse}{0,1}>
    [(#DATE|affdate{'Y-m-d'})]
    </BOUCLE_forum_article>
    </B_forum_article>
    [(#DATE|affdate{'Y-m-d'})]
    <//B_forum_article>
</lastmod>

Etapes 2 et 3 : compression et soumission à Google Sitemap

Pour compresser le résultat des boucles ci-dessus, on utilisera du PHP qui lira ce résultat, puis le compresse et stocke le tout dans un fichier sitemap.xml.gz à la racine du site. Enfin, si tout est OK, le script soumet le fichier à Google.

Voici donc la version modifiée de sitemap.html (vous trouverez le fichier sitemap.html complet dans le document joint) :

<?php 
// charge le fichier "sitemap_inc.php"
require("sitemap_inc.php");

// creation d'un objet Sitemap
$sitemap = new Sitemap();

// teste si rechargement de la page  
if (!$sitemap->envoyerSitemap()) {
    // si ce n'est pas le cas :
    // stocke le contenu de la page dans le buffer et empeche son affichage a l'ecran 
    ob_start(); 
    echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>'; 
?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">

... boucles deja vues plus haut

</urlset>

<?php 
    // lit le XML dans le buffer
    $chaine = ob_get_clean();
    // le compresse et puis affiche 2 boutons pour affichage ou pour envoi a Google
    $sitemap->compresserXML($chaine);
}

?>

Fonctionnement

L’essentiel du script se trouve dans le fichier sitemap_inc.php, qui est fourni dans le documnent joint à l’article.

-  On commence à créér un objet Sitemap. On va le voir plus en détails plus loin.
-  On teste avec la méthode envoyerSitemap si on doit envoyer le sitemap.
-  Si ce n’est pas le cas (1er chargement de la page), la méthode compresserXML. :

  • stocke le contenu XML généré par les boucles SPIP dans une chaîne,
  • vérifie si cette chaîne ne dépasse pas 10 Mo et 50 000 URLs,
  • puis compresse le XML dans le fichier sitemap.xml.gz,
  • enfin elle affiche 2 boutons “Voir le XML”, qui permet d’afficher le XML [4], et un bouton “Envoyer le sitemap à Google”, permettant d’envoyer l’URL complète du sitemap.xml.gz à Google, plus quelques infos (taille du contenu XML et nombre d’URLs).

-  Sinon (rechargement de la page) on envoie l’URL du fichier compressé à Google, après avoir vérifié que le fichier sitemap.xml.gz existe bien.

Le fichier sitemap_inc.php et l’objet Sitemap

Le fichier commence par la définition de 2 séries de constantes, qu’on peut modifier :

-  Les URLs Google, au cas où celles-ci changeraient,
-  Les styles du formulaire.

Le constructeur de l’objet Sitemap accepte 2 arguments facultatifs :

-  Le sous-répertoire des fichiers (sitemap_inc.php et sitemap.xml.php), vide s’ils sont à la racine du site,
-  Le nom du fichier XML compressé : “sitemap.xml.gz” par défaut.

Exemples :

$sitemap = new Sitemap("squeletttes"); // les fichiers sont dans le sous-repertoire "squelettes"
$sitemap = new Sitemap("squeletttes", "sitemap.gz"); // idem et le fichier final s'appelle "sitemap.gz" au lieu de "sitemap.xml.gz"
$sitemap = new Sitemap(null, "sitemap.gz"); // les fichiers sont a la racine et et le fichier final s'appellera "sitemap.gz"

De plus, on peut modifier la propriété $dluo avec :

$sitemap->setDluo(nombre);

A quoi sert cette $dluo ? Elle est fixée à 10mn (600 secondes) par défaut.

Exemple. Vous avez créé avec succès un sitemap.xml.gz la semaine dernière. Vous recommencez cette semaine, mais pour une raison inconnue, ça a foiré. Le script constate que le fichier a une ancienneté supérieure à 10 mn, et indiquera une erreur.

Envoi final

Enfin, lorsque vous cliquez sur le bouton “Envoyer le sitemap à Google”, c’est l’URL du fichier qui est communiquée à Google (et non pas le fichier lui-même). Et vous aurez ce message de Google :

Sitemap Notification Received

Your Sitemap has been successfully added to our list of Sitemaps to crawl. Please note that we do not add all submitted URLs to our index, and we cannot make any predictions or guarantees about when or if they will appear.

Soit en français :

Notification de sitemap réceptionnée

Votre sitemap a bien été ajouté à notre liste de sitemaps à inspecter. Veuillez noter que nous n’ajoutons pas toutes les URLs à notre index, et nous ne pouvons ni prévoir ni garantir si et quand elles apparaîtront.

Document joint

Il contient 5 fichiers, dont 4 seulement sont nécessaires.

-  Le couple de fichier sitemap.php3 / sitemap.html
-  Le fichier sitemap_inc.php contenant le script (à mettre où vous voulez, du moment que vous l’indiquez dans le “include” en début de sitemap.html)
-  Le fichier sitemap.xml.php, permettant d’afficher le XML pour vérification (à mettre dans le répertoire indiqué dans le constructeur de l’objet Sitemap, à la racine du site par défaut),
-  De plus, si votre version de SPIP est antérieure à 1.8.1, il faut utiliser le fichier sitemap_17.html (à renommer sitemap.html) où le filtre affdate{'Y-m-d'} a été remplacé par le filtre affdateYmd (ajouter ce filtre dans mes_fonctions.php3).

Aller plus loin...

On pourrait faire une tâche automatisée pour soumettre le sitemap régulièrement. Si ça vous dit...

Footnotes

[1Sitemap veut dire “plan du site” pour les non-anglophones

[2J’ai opté pour le double suffixe .xml.gz, parce qu’il me permettait d’obtenir directement un fichier sitemap.xml, en le décompressant à la main, pour vérification

[3Date ISO 8601 : exemple 2004-02-12T15:19:21+00:00. Peut être générée par un filtre affdate{'c'} (uniquement avec PHP5)

[4L’affichage XML se fait dans un fichier sitemap.xml.php, qui affiche le XML directement sous Internet Explorer, mais sous Firefox, il faut le voir dans le source

updated on 30 November 2012

Discussion

29 discussions

  • 1

    pourquoi avoir mis le délais du squelette à 0??? ça ne sert à rien de le recalculer sans raisons.

    • Bonjour,

      Euh... A priori quand on appelle "sitemap.php3, c’est parce qu’on a besoin d’envoyer à nouveau son plan à Google, non ? Il paraît logique de le faire recalculer à chaque fois.

      Bien cordialement,

    Reply to this message

  • 1

    bonjour,
    merci pour cette contribution bien pratique. la génération du fichier et des urls de ce fichier ne pose pas de problème.
    cependant, spip est installé dans un répertoire /spip/ sur mon site: http://www.monurl.com/spip/
    quand le sitemap.php3 traite cette url, il retourne http://www.monurl.com//spip
    de fait les boutons ne fonctionnent pas. voir xml renvoie http://www.monurl.com//spipsitemap.xml.php
    et l’envoi google retourne: http://www.google.com/webmasters/sitemaps/ping?sitemap=http://www.monurl.com//spipsitemap.xml.gz
    j’ai regardé rapidement (et de manière novice) le fichier sitemap_inc.php mais j’ai pas vraiment trouvé comment remédier à cela.

    Reply to this message

  • Lorsque google vérifie votre fichier, il teste aussi le comportement de vos pages sur l’erreur 404.

    si vous utilisez une page 404 personnalisée avec SPIP, ne pas oublier d’ajouter le header HTTP correspondant en début de page:

    <?php header("HTTP/1.0 404 Not Found"); ?>

    ... sinon google risque de ne pas valider la vérification de votre site.

    Reply to this message

  • Petit soucis rencontré avec le fichier sitemap.xml.php.
    Message d’erreur : “Undefined variable: fichier in .. (le nom du script)”.

    Après modif de la ligne 3 :

    echo decompresser($fichier);

    en :

    echo decompresser($_POST[’fichier’]);

    ca passe.

    Reply to this message

  • Salut, j’ai eu quelques problèmes avec le fichier sitemap.xml.php. L’utilisation de la mémoire pour lire le fichier et trop élevé.

    Fatal error : Allowed memory size ...

    J’ai donc modifier entièrement ce fichier pour donner ceci :

    <?php
    if (isset($_POST["fichier"]) && $_POST["fichier"]) {
    	$gz = gzopen($fichier, "r");
    	$r = '';
    
    	if ($gz)
    		header('Content-Type: text/xml; name="'.$fichier.'"');
    		$r = readgzfile($fichier);
    
    	if ($gz === false || $r === false)
    		header('Content-Type: text/html');
    		echo "<strong>Erreur :</strong> impossible de lire dans le fichier $fichier";
    
    	gzclose($gz);
    } else
    	echo "Pas de fichier sitemap envoyé !";
    ?>

    Reply to this message

  • 1

    Bonjour à tous, en appliquant ces scripts sur mes sites spip j’obtiens cette réponse :

    “Erreur : impossible d’écrire dans .”

    est-ce que quelqu’un sait comment résoudre ce problème ? Merci d’avance

    • il faut que le serveur ait les droits d’écriture dans le répertoire racine pour creer le fichier sitemap.xml.gz

      pour ne pas avoir à donner les droits sur tout le répertoire, tu peux juste creer un fichier sitemap.xml.gz vide, le transferer à la racine et donner des droits d’écriture pour tous dessus.

    Reply to this message

  • En fait tu utilises #DATE_MODIF pour les articles, donc si ce champ est vide Google ne lira pas le fichier sitemap.

    Reply to this message

  • Bonjour et merci pour cette contrib.

    Il me semble que la boucle récursive qui traite les sous rubriques n’affiche que les articles.
    Il suffit d’ajouter une boucle brève et le tour est joué.

    Reply to this message

  • Merci pour cette contrib ! C’est très utile de générer un sitemap notamment pour les nouveaux sites afin de référencer rapidement les pages de son site.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom