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>.
Balise | Définition | Format |
---|---|---|
<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
- Le fichier sitemap.xml.gz doit se trouver à la racine du site.
- Le fichier sitemap.xml doit être encodé en UTF-8 (et pas en ISO 8859-1)
- 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...
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |