SEO & Référencement

Comment créer un sitemap XML et le soumettre à Google

13 دقائق للقراءة

Prérequis

  • Niveau : bases SEO + accès admin du CMS / hébergement.
  • Outils : Search Console, plugin Yoast/Rank Math (WordPress), ou Node.js / Next.js pour générer manuellement.
  • Temps estimé : 30 min à 1 h.

Pourquoi un sitemap ?

Le sitemap est la liste de courses que vous donnez à Google : « voici toutes les URLs de mon site ». Sans lui, Google peut louper des pages profondes ou récentes. Avec lui, l’indexation est plus rapide et plus complète, surtout pour les sites volumineux ou récents.

Ce que vous saurez faire

  1. Créer sitemap XML valide
  2. Sitemap index pour gros sites
  3. Soumettre à Google Search Console
  4. Automatiser génération

Vue d’ensemble 1 — Structure XML minimale

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.sn/</loc>
    <lastmod>2026-04-22</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://example.sn/blog/article</loc>
    <lastmod>2026-04-20</lastmod>
    <priority>0.8</priority>
  </url>
</urlset>

Vue d’ensemble 2 — Sitemap index

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.sn/sitemap-pages.xml</loc>
    <lastmod>2026-04-22</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.sn/sitemap-articles.xml</loc>
    <lastmod>2026-04-22</lastmod>
  </sitemap>
</sitemapindex>

Limite: 50 000 URLs ou 50 MB non compressé par fichier.

Vue d’ensemble 3 — Générer avec Node.js

import { SitemapStream, streamToPromise } from "sitemap";
import { createWriteStream } from "fs";
import fetch from "node-fetch";

const urls = await fetch("https://api.example.sn/v1/seo/urls").then(r => r.json());

const stream = new SitemapStream({ hostname: "https://example.sn" });
urls.forEach(u => stream.write({
  url: u.path, changefreq: u.freq, priority: u.priority, lastmod: u.lastmod
}));
stream.end();

const xml = await streamToPromise(stream);
createWriteStream("public/sitemap.xml").write(xml);

Vue d’ensemble 4 — Next.js natif

// app/sitemap.ts
import type { MetadataRoute } from "next";

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const articles = await fetch("https://api.example.sn/v1/articles").then(r => r.json());
  return [
    { url: "https://example.sn", lastModified: new Date(), changeFrequency: "weekly", priority: 1 },
    ...articles.map((a: any) => ({
      url: `https://example.sn/blog/${a.slug}`,
      lastModified: new Date(a.updated_at),
      priority: 0.7,
    })),
  ];
}

Vue d’ensemble 5 — WordPress natif ou Yoast

WordPress 5.5+: /wp-sitemap.xml natif
Yoast SEO: /sitemap_index.xml
RankMath: /sitemap_index.xml

Custom via functions.php:
add_filter('wp_sitemaps_posts_query_args', function($args){
  $args['post_type'] = ['post','product','evenement'];
  return $args;
});

Vue d’ensemble 6 — Déclarer dans robots.txt

User-agent: *
Allow: /
Disallow: /wp-admin/

Sitemap: https://example.sn/sitemap.xml
Sitemap: https://example.sn/sitemap-articles.xml

Vue d’ensemble 7 — Soumettre à GSC

search.google.com/search-console → propriété → Sitemaps
Coller URL: https://example.sn/sitemap.xml
Submit → statut "Opération réussie" sous 24-72h
Onglet Couverture: URLs découvertes, indexées, erreurs

Vue d’ensemble 8 — API Indexing (accélérer)

# Google Indexing API (pages emploi, live streams)
curl -X POST "https://indexing.googleapis.com/v3/urlNotifications:publish" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.sn/nouvel-article","type":"URL_UPDATED"}'

# IndexNow (Bing, Yandex)
curl -X POST "https://api.indexnow.org/indexnow" \
  -H "Content-Type: application/json" \
  -d '{"host":"example.sn","key":"YOUR_KEY","urlList":["https://example.sn/url1"]}'

Vue d’ensemble 9 — Validation

# Validation XML
curl -s https://example.sn/sitemap.xml | xmllint --schema sitemap.xsd - --noout

# Nb URLs
curl -s https://example.sn/sitemap.xml | grep -c '<loc>'

# Monitoring quotidien
#!/bin/bash
count=$(curl -s https://example.sn/sitemap.xml | grep -c '<loc>')
if [ $count -lt 100 ]; then
  curl -X POST https://hooks.slack.com/$SLACK -d "{\"text\":\"Sitemap $count URLs\"}"
fi

Vue d’ensemble 10 — Bonnes pratiques

✓ Régénérer à chaque build/modif
✓ Exclure 301/404/noindex
✓ 1 sitemap par locale (hreflang)
✓ Compresser > 10 MB (.xml.gz)
✓ Submit dans GSC pour suivi

Erreurs fréquentes

URLs noindex / 404 / redirigées dans le sitemap

Cause : sitemap statique non régénéré.
Solution : votre générateur doit exclure ces statuts. Sur WordPress, Yoast/Rank Math le font automatiquement.

Sitemap > 50 Mo non compressé ou > 50 000 URLs

Cause : on met tout dans un seul fichier.
Solution : utilisez un sitemap index qui pointe vers plusieurs sitemaps (un par type de contenu : pages, articles, produits, catégories).

Sitemap absent du robots.txt

Cause : on déclare uniquement dans Search Console.
Solution : ajoutez Sitemap: https://example.sn/sitemap.xml à la fin de robots.txt. Bing, Yandex et autres le découvrent ainsi.

Mauvaises balises <changefreq> / <priority>

Cause : on met priority=1.0 partout.
Solution : Google ignore largement ces deux balises depuis 2017. Concentrez-vous sur <loc> et <lastmod> (vraiment exploité).

Sur un angle proche

Pourquoi un sitemap XML reste indispensable en 2026

Dans une agence du Plateau a Abidjan, un developpeur junior se demandait pourquoi son nouveau site corporate n’apparaissait pas sur Google malgre trois semaines en ligne. Le diagnostic etait simple : aucun sitemap, aucun lien externe, et un robots.txt vide. Le sitemap XML reste le canal le plus direct pour signaler aux moteurs l’inventaire complet de vos URLs canoniques, leur date de derniere modification et leur priorite relative. Le protocole sitemaps.org 0.9, maintenu conjointement par Google, Bing et Yandex, encadre la structure attendue.

Concretement, un sitemap accelere la decouverte des pages orphelines, renseigne lastmod pour prioriser le recrawl, et evite que Googlebot ne gaspille son budget sur des URLs parametrees. Pour un site WordPress de 200 articles heberge a Dakar, l’ecart d’indexation entre avec et sans sitemap soumis se chiffre en semaines.

Etape 1 : Choisir entre sitemap statique et sitemap dynamique

Avant d’ecrire la moindre ligne, decidez du mode de generation. Un sitemap statique (fichier sitemap.xml manuel) convient aux sites de moins de 50 URLs qui changent rarement : portfolio, landing page, brochure d’entreprise. Un sitemap dynamique, genere par votre CMS ou un script, est obligatoire des que le contenu evolue chaque semaine.

Sur WordPress, Rank Math, Yoast et le sitemap natif de WP 5.5+ generent automatiquement le fichier a /sitemap_index.xml ou /wp-sitemap.xml. Sur un site Next.js ou Astro, on genere via next-sitemap ou @astrojs/sitemap. Pour un site statique pur, le bloc-notes suffit le premier mois, puis on automatise.

Etape 2 : Ecrire un sitemap XML conforme au protocole 0.9

Le protocole exige une declaration UTF-8, une racine urlset avec le namespace officiel, et au minimum la balise loc pour chaque URL. lastmod, changefreq et priority sont optionnelles. Voici un sitemap minimal valide :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://exemple.sn/</loc>
    <lastmod>2026-05-01</lastmod>
  </url>
  <url>
    <loc>https://exemple.sn/contact</loc>
    <lastmod>2026-04-22</lastmod>
  </url>
</urlset>

Si la validation XML reussit dans un editeur comme VS Code, vous pouvez passer a l’envoi. Une erreur de namespace est la cause numero un de rejet par la Search Console.

Etape 3 : Respecter les limites techniques

Un sitemap unique ne doit pas depasser 50 000 URLs ni 50 Mo non compresses. Au-dela, segmentez en plusieurs fichiers et reliez-les via un sitemap d’index. Un atelier e-commerce a Sandaga avec 80 000 fiches produits utilise typiquement un sitemap-products-1.xml, un sitemap-products-2.xml, et un sitemap_index.xml qui les agrege.

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://exemple.sn/sitemap-posts.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://exemple.sn/sitemap-pages.xml</loc>
  </sitemap>
</sitemapindex>

Le fichier d’index doit lui-meme respecter la limite de 50 000 entrees. La compression gzip est acceptee et recommandee pour reduire la bande passante.

Etape 4 : Reference le sitemap dans robots.txt

La directive Sitemap dans robots.txt est lue par tous les robots conformes au protocole. C’est le canal de decouverte universel, independant des consoles webmaster. Editez votre robots.txt a la racine du domaine et ajoutez la ligne suivante :

User-agent: *
Allow: /
Sitemap: https://exemple.sn/sitemap_index.xml

Apres deploiement, ouvrez https://exemple.sn/robots.txt dans un navigateur depuis Yopougon ou Cotonou et verifiez que la ligne s’affiche bien. C’est aussi le moment de tester l’URL du sitemap directement : un acces 200 OK confirme que le fichier est servi avec le bon Content-Type application/xml.

Etape 5 : Soumettre le sitemap dans Google Search Console

Connectez-vous a search.google.com/search-console avec le compte qui possede la propriete verifiee. Dans le menu de gauche, ouvrez Sitemaps. Saisissez le chemin relatif du sitemap (par exemple sitemap_index.xml) et cliquez sur Envoyer. Le statut passe d’abord a En attente, puis a Reussite des que Google a parse le fichier.

Sous le tableau, vous verrez le nombre d’URLs decouvertes. Si ce nombre est nul, votre fichier est mal forme ou bloque par robots.txt. Si Reussite s’affiche avec le bon compteur, le sitemap est integre au planning de crawl.

Etape 6 : Soumettre dans Bing Webmaster Tools et IndexNow

Ne negligez pas Bing : 8 a 12 % du trafic francophone d’Afrique de l’Ouest passe par Bing, Ecosia ou DuckDuckGo qui s’appuient sur l’index Bing. Sur bing.com/webmasters, ajoutez le site, puis utilisez Sitemaps > Soumettre un sitemap. Le format de soumission est identique a Google.

Pour acceleration extreme, activez IndexNow. Le protocole, ouvert et soutenu par Microsoft et Yandex, ping en temps reel les moteurs des qu’une URL change. Sur WordPress, l’extension Rank Math integre IndexNow nativement : il suffit de generer une cle dans Tableau de bord > General Settings > IndexNow et de cocher Activer.

Etape 7 : Surveiller la couverture et corriger les erreurs

Une semaine apres soumission, retournez dans Search Console > Pages. Le rapport distingue Indexees, Decouvertes non indexees, Explorees non indexees et Bloquees. L’objectif est que le ratio URLs du sitemap / URLs indexees depasse 80 %.

Si le ratio reste sous 50 %, plusieurs causes possibles : balise canonical pointant vers une autre URL, contenu trop mince (sous 500 mots), absence de liens internes, ou redirections en cascade. Corrigez par groupes de 20 URLs et resoumettez le sitemap. Dans la continuité sur la sante technique du site, consultez notre tutoriel d’audit SEO technique en 10 etapes et notre guide sur l’optimisation de la vitesse de chargement.

Etape 8 : Automatiser le rafraichissement et le ping

Un sitemap n’est utile que s’il reflete l’etat reel du site. Sur WordPress, les extensions SEO regenerent automatiquement le fichier a chaque publication ou modification. Sur un site custom, ajoutez un hook dans votre pipeline CI/CD qui regenere et redepose le fichier apres chaque deploy.

Pour pinger Google a la demande, vous pouvez aussi appeler l’URL https://www.google.com/ping?sitemap=https://exemple.sn/sitemap_index.xml depuis un script cron mensuel. Cette pratique reste utile en complement, meme si IndexNow couvre desormais l’essentiel des cas urgents. Une routine bien huilee, c’est en moyenne 3 a 5 jours d’avance sur le crawl par rapport a un site qui attend passivement.

Sitemap index multi-sites pour groupes editoriaux ouest-africains

Quand un groupe edite plusieurs sites WordPress (un blog tech a Dakar, une boutique WooCommerce a Abidjan, un portail RH a Cotonou), declarer un sitemap par site n’est pas suffisant. Google et Bing recommandent un sitemap index racine qui pointe vers chaque sitemap enfant. Ce fichier index respecte le meme schema XML que le sitemap classique mais utilise la balise sitemapindex en racine et chaque sitemap enfant est declare par une balise sitemap contenant loc et lastmod.

L’avantage operationnel est concret : un seul fichier a soumettre a la Search Console et a Bing Webmaster Tools, et un suivi consolide des erreurs. Pour un groupe qui publie 30 a 50 articles par mois sur trois proprietes distinctes, le gain de temps est reel. La regle de Google reste 50 000 URL maximum et 50 Mo decompresses par sitemap individuel. Au-dela, il faut decouper par section (sitemap-articles.xml, sitemap-pages.xml, sitemap-produits.xml) et tous les regrouper sous un sitemap-index.xml racine.

Pour les sites WooCommerce qui vendent a Yopougon ou aux Almadies, separez les sitemaps produits et categories. Cela permet de prioriser le crawl des nouvelles fiches produits sans diluer le budget de crawl sur des pages d’archives moins critiques. Rank Math et Yoast generent ces sitemaps decoupes automatiquement, mais beaucoup d’admins oublient de les fusionner dans un index racine quand ils gerent un reseau multisite. Le fichier robots.txt doit pointer vers le sitemap-index.xml racine, pas vers chaque sitemap enfant individuellement.

Concernant la frequence et la priorite, Google a annonce officiellement en 2023 ne plus tenir compte des balises priority et changefreq. Vous pouvez les laisser pour Bing et Yandex qui les utilisent encore partiellement, mais ne perdez pas de temps a les optimiser pour Google. La balise lastmod en revanche reste critique : elle doit refleter la vraie date de modification du contenu, sinon Google la considere comme un signal non fiable et ignore l’ensemble du sitemap. Un piege courant est d’avoir lastmod qui change a chaque deploiement WordPress alors que le contenu n’a pas bouge, ce qui detruit la confiance du robot.

Automatisation IndexNow pour Bing et Yandex depuis WordPress

IndexNow est un protocole pousse par Microsoft Bing et Yandex qui permet d’avertir instantanement les moteurs quand une URL est creee ou modifiee. Le principe est simple : un POST HTTP vers une API publique avec une cle d’authentification stockee dans un fichier texte a la racine du domaine. Google ne participe pas officiellement, mais Bing relaie les pings vers son propre index et le delai d’indexation passe typiquement de plusieurs jours a moins de 12 heures sur les blogs tech francophones que nous suivons.

Sur WordPress, l’integration la plus simple passe par le plugin Rank Math qui inclut IndexNow nativement depuis la version 1.0.117. Activez le module dans Tableau de bord Rank Math, generez la cle API, et chaque publication ou mise a jour declenche automatiquement le ping. Pour les sites qui n’utilisent pas Rank Math, le plugin officiel IndexNow de Microsoft fait le travail en moins de 30 secondes d’installation.

POST https://api.indexnow.org/indexnow
Content-Type: application/json

{
  "host": "itskillscenter.io",
  "key": "votre-cle-api-32-caracteres",
  "keyLocation": "https://itskillscenter.io/votre-cle-api-32-caracteres.txt",
  "urlList": [
    "https://itskillscenter.io/article-nouveau-1/",
    "https://itskillscenter.io/article-nouveau-2/"
  ]
}

La reponse attendue est un code HTTP 200 ou 202. Un 422 signale une cle invalide ou un fichier de verification absent. Verifiez systematiquement que le fichier cle.txt est accessible publiquement avec un curl direct avant de pousser le ping. Vous pouvez batcher jusqu’a 10 000 URL par requete, ce qui est utile pour les migrations massives ou les corrections de slugs en masse.

Le tarif est gratuit, sans quota officiel publique, mais Microsoft applique un throttling implicite si vous depassez quelques milliers de pings par heure depuis une seule IP. Pour un site de taille moyenne avec 5 a 50 publications par jour, vous etes tres en dessous des limites. Combinez IndexNow avec une soumission manuelle hebdomadaire du sitemap a la Search Console Google et vous couvrez les trois principaux moteurs sans effort. Voir aussi notre guide sitemap XML pour les fondamentaux.

مشاركة