vendredi 25 septembre 2026

À propos

Contact

SEO & GEO

Un sitemap XML qui dépasse la limite de 50 000 URL : diagnostiquer et scinder

Un sitemap monolithique qui franchit la barre des 50 000 URL devient invalide silencieusement. Voici comment repérer le dépassement et scinder proprement.

Par Clément Hadrot • 15 mars 2023 • 4 min de lecture • Aucun commentaire
Un sitemap XML qui dépasse la limite de 50 000 URL : diagnostiquer et scinder

Un site d’annonces immobilières générait son sitemap XML via une fonction maison écrite plusieurs années auparavant, avant que le catalogue n’atteigne son volume actuel. Le script listait toutes les annonces actives dans un unique fichier sitemap-annonces.xml, sans aucune logique de pagination. Le jour où le nombre d’annonces actives a dépassé 50 000, personne ne s’en est rendu compte immédiatement : le fichier continuait à se générer sans erreur PHP visible.

Symptôme : des annonces récentes absentes de l’index

Le signal d’alerte est venu d’un développeur qui cherchait à vérifier pourquoi une annonce publiée la veille n’apparaissait pas dans le rapport de couverture de Search Console alors que d’autres annonces du même jour y figuraient bien. Après vérification manuelle du fichier sitemap, il est apparu que celui-ci s’arrêtait net à une annonce précise, sans balise de fermeture </urlset> à l’endroit attendu par rapport au nombre total d’annonces en base.

Diagnostic : compter les URL réellement présentes

L'essentiel à retenir : La limite du protocole sitemap est de 50 000 URL ou 50 Mo non compressés, au premier seuil atteint ; Un sitemap natif WordPress se scinde automatiquement, un sitemap sur mesure non ; Un dépassement silencieux tronque les dernières URL sans avertissement visible

Un comptage simple des balises <url> dans le fichier généré a confirmé le dépassement :

curl -s https://exemple.fr/sitemap-annonces.xml | grep -c "<url>"
# 50000

Exactement 50 000, pas une de plus : ce n’était pas une coïncidence. Le protocole sitemaps.org fixe la limite à 50 000 URL par fichier ou 50 Mo non compressés, la première limite atteinte l’emportant sur l’autre. La fonction maison du site, écrite avec une simple boucle foreach sur toutes les annonces actives sans limite de pagination, générait un flux XML qui dépassait cette limite depuis plusieurs semaines. Le comportement observé dépend du parseur XML utilisé par Google : dans ce cas, Googlebot semble avoir traité les 50 000 premières entrées puis ignoré silencieusement le reste, sans erreur remontée dans Search Console puisque le fichier restait un XML syntaxiquement valide jusqu’à ce seuil.

Correctif : passer à un index de sitemaps scindés

La solution standard consiste à transformer le fichier unique en un index de sitemaps, chacun restant sous la limite, avec un fichier sitemap-index.xml qui les référence tous :

function generer_sitemap_annonces_paginé( int $page ): string {
    $par_page = 45000; // marge de sécurité sous la limite de 50 000
    $annonces = get_posts( array(
        'post_type'      => 'annonce',
        'posts_per_page' => $par_page,
        'offset'         => ( $page - 1 ) * $par_page,
        'post_status'    => 'publish',
    ) );

    $xml = '<?xml version="1.0" encoding="UTF-8"?>';
    $xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    foreach ( $annonces as $annonce ) {
        $xml .= '<url><loc>' . esc_url( get_permalink( $annonce ) ) . '</loc></url>';
    }
    $xml .= '</urlset>';
    return $xml;
}

Avec une marge de sécurité fixée à 45 000 URL par fichier plutôt que 50 000 pile, pour absorber une éventuelle croissance du catalogue entre deux régénérations sans risquer un nouveau dépassement silencieux.

Le sitemap natif ne connaît pas ce problème

Il vaut la peine de noter que le sitemap natif introduit en WordPress 5.5 gère nativement cette pagination via la classe WP_Sitemaps_Provider, avec une limite par défaut de 2 000 URL par sous-sitemap, filtrable via wp_sitemaps_max_urls. Le problème rencontré ici tenait précisément au fait que le site utilisait un générateur maison antérieur à cette fonctionnalité, jamais migré vers le système natif faute de temps.

Prévention : une alerte automatique sur le seuil

Depuis cet incident, une vérification est ajoutée à la tâche planifiée de génération du sitemap : si le nombre d’URL d’un lot dépasse 40 000, une alerte est envoyée par e-mail à l’équipe technique, bien avant d’atteindre la limite réelle.

if ( count( $annonces ) > 40000 ) {
    wp_mail( 'technique@exemple.fr', 'Sitemap proche de la limite', 'Lot actuel : ' . count( $annonces ) );
}

En résumé

Un dépassement de la limite de 50 000 URL par sitemap ne génère aucune erreur visible côté serveur : le fichier reste un XML valide jusqu’au seuil, puis s’arrête, et les moteurs ignorent silencieusement le reste. Seul un comptage explicite des balises <url> ou une bascule vers un index de sitemaps scindés avec marge de sécurité permet d’éviter ce piège sur un catalogue en croissance continue.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi