Sept sites sur neuf gérés par la même équipe technique ont vu leur index de sitemaps renvoyer une page blanche la même nuit, à quelques minutes d’intervalle les uns des autres. Aucune intervention manuelle n’avait eu lieu sur ces sites cette nuit-là : seule une mise à jour automatique d’un composant mutualisé, un plugin utilitaire installé sur l’ensemble du parc, s’était déclenchée pendant la fenêtre de maintenance habituelle.
Ce type d’incident illustre un risque propre à la gestion mutualisée de plusieurs sites : un correctif ou une évolution introduite dans un composant partagé peut se propager identiquement partout où il est installé, avec un effet démultiplié par rapport à un incident isolé sur un site unique.
Le symptôme observé, site par site
Sur cinq des sites touchés, l’URL du plan de sitemaps renvoyait un code 200 mais un contenu vide, sans structure XML exploitable. Sur les deux autres, l’URL renvoyait directement une erreur 500, révélant une erreur PHP fatale plutôt qu’un simple problème de génération de contenu.
- Cinq sites avec un sitemap vide mais un code de statut 200 trompeur.
- Deux sites avec une erreur serveur 500 explicite sur l’URL du sitemap.
- Deux sites, sur les neuf du parc, restés indemnes malgré la même mise à jour installée.
Identifier la cause commune
Le point commun entre les sites touchés n’était ni l’hébergeur, ni le thème utilisé, mais bien la présence du même plugin utilitaire, mis à jour automatiquement la même nuit sur l’ensemble du parc. Un examen du journal d’erreurs PHP sur l’un des sites en erreur 500 a permis d’identifier la ligne fautive : une fonction interne au plugin, appelée par un filtre accroché à wp_sitemaps_posts_query_args, tentait d’accéder à une propriété d’objet qui n’existait plus dans la nouvelle version du composant.

PHP Fatal error: Uncaught Error: Attempt to read property "post_type_object"
on null in /wp-content/plugins/composant-mutualise/class-sitemap-extra.php:142
Les deux sites épargnés avaient, par coïncidence, désactivé l’option concernée du plugin quelques mois plus tôt pour un autre motif, ce qui les mettait involontairement à l’abri du chemin de code défaillant.
Pourquoi les deux symptômes différaient
Les cinq sites en sitemap vide utilisaient un cache de page qui avait servi une version tampon antérieure à l’erreur, masquant temporairement le problème réel derrière un code 200. Les deux sites en erreur 500 n’avaient pas ce cache actif sur cette URL spécifique, révélant directement l’erreur fatale sous-jacente.
Le correctif appliqué en attendant la mise à jour amont
Plutôt que d’attendre un correctif du composant mutualisé, l’équipe a neutralisé le filtre fautif directement depuis les fonctions du thème sur l’ensemble des sites concernés, en retirant l’action problématique avant qu’elle ne s’exécute.
add_action( 'init', function () {
remove_filter( 'wp_sitemaps_posts_query_args', 'composant_mutualise_filtrer_sitemap', 10 );
}, 20 );
Ce correctif temporaire a rétabli un plan de sitemaps fonctionnel sur les sept sites en quelques heures, en attendant la publication d’une version corrigée du composant par son éditeur.
Ce que cet incident a changé dans la procédure de mise à jour
| Avant l’incident | Après l’incident |
|---|---|
| Mises à jour automatiques sur l’ensemble du parc | Mise à jour testée sur un site pilote avant déploiement général |
| Vérification visuelle ponctuelle du sitemap | Contrôle automatisé du code de statut et du contenu XML après chaque mise à jour |
Un composant partagé entre plusieurs sites multiplie le gain de temps au quotidien, mais multiplie tout autant le rayon d’un incident le jour où il en provoque un.
En résumé
Une régression touchant plusieurs sites en même temps se repère plus vite qu’un incident isolé, à condition de disposer d’un point de comparaison entre plusieurs environnements similaires. Introduire un site pilote avant tout déploiement mutualisé, et surveiller automatiquement le contenu réel du sitemap plutôt que le seul code de statut HTTP, aurait permis de détecter ce problème avant qu’il ne touche l’ensemble du parc.