« Duplicate structured data type detected for the same page » — ce message dans le rapport Google Search Console est le symptôme qui déclenche généralement ce diagnostic. Deux blocs <script type="application/ld+json"> distincts décrivent le même produit sur la même page, chacun avec ses propres valeurs de prix, de disponibilité et d’avis, parfois légèrement incohérentes entre elles.
Symptôme : deux schémas Product sur une seule fiche
En inspectant le code source d’une fiche produit avec l’outil de test des résultats enrichis de Google, on trouve effectivement deux occurrences du type Product dans le JSON-LD généré. Le premier vient de WooCommerce lui-même, qui injecte des données structurées basiques pour chaque produit dès l’activation du plugin, sans qu’aucun réglage explicite ne soit nécessaire. Le second vient de Rank Math, qui génère également un schéma Product complet dès lors que son module « Schema » est activé sur les types de contenu produit — ce qui est le comportement par défaut de l’extension.
Diagnostic : qui génère quoi, précisément
Le schéma WooCommerce natif est injecté via le hook woocommerce_single_product_summary et le filtre woocommerce_structured_data_product, avec des champs limités : nom, prix, devise, disponibilité, image. Le schéma Rank Math, lui, passe par son propre système de blocs de schéma configurables depuis l’écran d’édition du produit, avec davantage de champs disponibles (marque, GTIN, avis agrégés) mais construit indépendamment, sans lire ni fusionner les données déjà exposées par WooCommerce.
// Vérifier la présence du filtre WooCommerce actif
add_action( 'wp_footer', function () {
if ( has_filter( 'woocommerce_structured_data_product' ) ) {
error_log( 'WooCommerce structured data actif sur ce produit.' );
}
} );

Correctif : désactiver l’un des deux générateurs
La solution n’est pas de fusionner manuellement les deux sorties, mais de choisir un seul générateur et de désactiver proprement l’autre. Rank Math étant généralement plus riche en champs de schéma configurables (marque, GTIN, avis), le choix courant consiste à désactiver l’injection native de WooCommerce via le filtre dédié :
add_filter( 'woocommerce_structured_data_product', '__return_null' );
Une alternative, si l’équipe préfère conserver le schéma natif WooCommerce pour sa simplicité et sa fiabilité éprouvée, consiste à désactiver le type de schéma Product dans les réglages de Rank Math (« Schema » → « Product » → désactivé), en conservant les autres types de schéma (organisation, fil d’Ariane) que WooCommerce ne génère pas.
Vérifier la correction
- Recharger la fiche produit et compter le nombre d’occurrences
"@type": "Product"dans le code source : un seul bloc doit subsister. - Repasser la page dans l’outil d’inspection d’URL de Google Search Console pour confirmer que le doublon a disparu du rapport.
- Contrôler que les champs riches attendus (avis, prix, disponibilité) restent bien présents dans le schéma conservé, faute de quoi la désactivation a supprimé plus que prévu.
Prévention pour les projets futurs
Ce conflit se reproduit systématiquement dès qu’une extension SEO tierce (Rank Math, mais le même principe vaudrait pour un autre outil équivalent) est installée sur un site WooCommerce sans audit préalable des schémas déjà générés nativement. La bonne pratique consiste à documenter, dans le cahier des charges de configuration SEO d’un projet e-commerce, quel plugin est responsable de chaque type de donnée structurée, pour éviter qu’un futur intervenant réactive par erreur un générateur déjà neutralisé.
Sur ce type de diagnostic, l’astuce qui fait gagner du temps : chercher directement
"@type": "Product"dans le code source affiché par le navigateur plutôt que de deviner quelle extension est en cause à partir des seuls réglages visibles dans l’administration.
En résumé
Un doublon de schéma produit n’indique pas un bug dans WooCommerce ni dans Rank Math pris isolément, mais une superposition non arbitrée de deux fonctionnalités qui remplissent le même rôle. Le correctif est rapide une fois le diagnostic posé : couper l’un des deux générateurs via un filtre ou un réglage, puis vérifier que les données enrichies utiles au référencement restent bien exposées par le générateur conservé.