Des balises canonical dupliquées en anglais et en espagnol, constatées par un client éditeur sur un site en quatre langues, le jour où Yoast SEO et WPML ont été mis à jour simultanément : c’est cette régression précise qui a motivé la construction d’une suite de tests dédiée à cette combinaison d’extensions.
Le problème ne venait pas d’un bug isolé mais d’une régression apparue après une mise à jour mineure de Yoast SEO, qui avait changé la façon dont le titre SEO était généré pour les traductions gérées par WPML. Sans suite de tests automatisée, ce genre de régression ne se voit qu’en production, souvent après plusieurs jours d’indexation erronée par les moteurs de recherche.
Reproduire la configuration multilingue en environnement de test
La première étape consiste à recréer, dans l’environnement de test, une structure multilingue représentative : un contenu original en français, avec des traductions en anglais, espagnol et allemand liées via wpml_add_translation. Ce fixture est chargé une seule fois grâce à une factory PHPUnit dédiée, réutilisable par tous les tests de la suite.
class WPML_Fixture {
public static function create_translated_post( $lang = 'fr' ) {
$post_id = wp_insert_post( array(
'post_title' => 'Article de test',
'post_status' => 'publish',
'post_type' => 'post',
) );
do_action( 'wpml_set_element_language_details', array(
'element_id' => $post_id,
'element_type' => 'post',
'language_code' => $lang,
) );
return $post_id;
}
}
Ce fixture permet ensuite de générer les mêmes contenus dans chaque langue pour comparer le comportement de Yoast SEO sur chacun d’eux, sans dépendre d’une saisie manuelle qui varierait d’un test à l’autre.
Vérifier l’unicité des métadonnées par langue

Le cœur du test consiste à récupérer les métadonnées générées par Yoast SEO pour chaque traduction et à s’assurer qu’elles ne se recopient pas telles quelles d’une langue à l’autre. La fonction WPSEO_Meta::get_value permet de lire la valeur stockée pour un champ donné, comme le titre SEO ou la meta description.
- Le titre SEO ne doit jamais être identique entre deux langues différentes du même contenu
- La balise canonical doit pointer vers l’URL de la langue courante, jamais vers l’original
- Les balises
hreflanggénérées par WPML doivent référencer toutes les traductions publiées, sans doublon
Un test qui échoue sur le deuxième point est souvent révélateur d’un souci de configuration plus profond : une confusion entre l’URL canonique portée par Yoast et celle attendue par WPML pour la même page traduite.
Simuler une mise à jour d’extension avant qu’elle n’arrive en production
Pour anticiper les régressions, la suite de tests tourne dans une matrice qui installe systématiquement la dernière version stable de Yoast SEO et de WPML avant chaque exécution en intégration continue. Cette matrice utilise WP-CLI pour forcer la mise à jour dans l’environnement éphémère.
wp plugin update wordpress-seo --version=latest
wp plugin update sitepress-multilingual-cms --version=latest
wp plugin update wpml-string-translation --version=latest
Ce choix délibéré de tester contre la dernière version, plutôt que contre une version figée dans le fichier de dépendances, permet de détecter une régression le jour même de sa publication plutôt qu’au moment où un client s’en aperçoit sur le site en production.
Gérer les faux positifs liés au cache
Yoast SEO met en cache certaines données de sitemap et de metabox, ce qui peut faire échouer un test si le cache n’est pas invalidé entre deux exécutions. La fonction WPSEO_Utils::clear_cache doit être appelée explicitement dans la méthode setUp des classes de test concernées pour repartir d’un état propre à chaque fois.
Étendre la couverture à Polylang plus tard
Cette suite se concentre volontairement sur la combinaison Yoast SEO et WPML, qui reste la plus courante chez les clients éditoriaux suivis par l’agence. Polylang fonctionne différemment sur la gestion des taxonomies de langue et mériterait sa propre suite de tests, tant les points de friction avec Yoast SEO ne sont pas les mêmes.
Tester une combinaison d’extensions n’a de sens que si le test reproduit fidèlement la configuration réelle du client, y compris ses langues et ses réglages SEO spécifiques.
En résumé
Une suite de tests centrée sur la compatibilité entre deux extensions tierces demande un effort de mise en place plus lourd qu’un test unitaire classique, mais elle rembourse cet investissement dès la première mise à jour cassante détectée avant la mise en production. Sur ce projet, la matrice a intercepté deux régressions en huit mois, chacune aurait coûté plusieurs jours de réindexation SEO si elle était passée inaperçue.