Sitemap Google

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

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...

Notes

[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

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom