# Fil d’Ariane multilingue : traduire les libellés sans casser le Schema.org

> Un fil d'Ariane développé sur mesure affichait des libellés de catégorie non traduits sur les pages en langue étrangère, tout en gardant un balisage BreadcrumbList techniquement valide. Voici le correctif complet.

- Auteur : Clément Hadrot
- Publié le : 2023-04-02
- Mis à jour le : 2023-04-02
- Catégorie : Multilingue
- URL : https://wpmoderne.dev.wordpress-developpement.fr/multilingue/fil-ariane-multilingue-schema-org/

## L’essentiel

- Un libellé de fil d'Ariane non traduit reste souvent invisible en relecture rapide
- BreadcrumbList doit refléter les mêmes libellés traduits que le fil affiché à l'écran
- La hiérarchie de catégories doit elle-même exister dans chaque langue via WPML

Un client vendant du matériel de sonorisation professionnelle en France et aux Pays-Bas nous a signalé un détail qui avait échappé à la relecture initiale de son site multilingue : sur les pages produit en néerlandais, le fil d'Ariane affichait bien « Home » et le nom du produit traduits, mais les libellés de catégorie intermédiaires — « Enceintes actives », « Microphones sans fil » — restaient en français. Un détail visuellement discret, facile à manquer sur une relecture rapide, mais qui touchait l'intégralité du catalogue traduit.

Le fil d'Ariane de ce site avait été développé sur mesure, sans passer par une extension de fil d'Ariane classique, avec un balisage `BreadcrumbList` en JSON-LD généré en parallèle de l'affichage visuel. Corriger uniquement l'affichage sans vérifier le balisage structuré aurait laissé le problème à moitié résolu.

## Identifier la source réelle du libellé non traduit

Le fil d'Ariane sur mesure de ce thème récupérait le nom de la catégorie WooCommerce directement via `get_the_terms()`, sans passer par le filtre de traduction WPML pour les taxonomies. Sur un site multilingue avec WPML, chaque terme de taxonomie (catégorie, étiquette) existe potentiellement en plusieurs versions liées entre elles, mais la fonction native de WordPress retourne, sans filtre supplémentaire, le terme réellement attaché à l'article ou au produit consulté — qui peut être resté celui de la langue source si la relation de traduction n'a pas été explicitement suivie dans le code.

```
// Code fautif : retourne le terme source, sans résolution multilingue
$terms = get_the_terms( $product->get_id(), 'product_cat' );
echo esc_html( $terms[0]->name );
```

Le correctif consiste à résoudre l'identifiant du terme dans la langue courante avant d'en récupérer le nom, via le filtre `wpml_object_id` appliqué au type d'objet `product_cat` :

```
$terms = get_the_terms( $product->get_id(), 'product_cat' );
if ( $terms && ! is_wp_error( $terms ) ) {
    $term_id_traduit = apply_filters( 'wpml_object_id', $terms[0]->term_id, 'product_cat', true );
    $terme_traduit   = get_term( $term_id_traduit, 'product_cat' );
    echo esc_html( $terme_traduit->name );
}
```

Ce correctif suppose évidemment que la catégorie ait bien été traduite au préalable dans WPML : un fil d'Ariane ne peut pas afficher un libellé traduit qui n'existe pas. Sur ce projet, deux catégories de niveau intermédiaire n'avaient tout simplement jamais reçu de traduction néerlandaise, un oubli distinct du bug de code, à traiter en parallèle côté contenu.

## Adapter le balisage BreadcrumbList en conséquence

> L'essentiel à retenir : Un libellé de fil d'Ariane non traduit reste souvent invisible en relecture rapide ; BreadcrumbList doit refléter les mêmes libellés traduits que le fil affiché à l'écran ; La hiérarchie de catégories doit elle-même exister dans chaque langue via WPML

Une fois l'affichage visuel corrigé, le balisage JSON-LD généré à part devait suivre la même logique de résolution, faute de quoi le fil visible et les données structurées auraient affiché deux langues différentes pour le même niveau de hiérarchie :

```
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://exemple.com/nl/" },
    { "@type": "ListItem", "position": 2, "name": "Actieve luidsprekers", "item": "https://exemple.com/nl/categorie/actieve-luidsprekers/" },
    { "@type": "ListItem", "position": 3, "name": "Draadloze microfoons", "item": "https://exemple.com/nl/categorie/draadloze-microfoons/" }
  ]
}
```

La règle à retenir est simple : le balisage `BreadcrumbList` doit être un miroir exact, langue par langue, du fil d'Ariane réellement affiché à l'écran, jamais une reconstruction indépendante à partir d'une autre source de données.

## Vérification systématique après correctif

- Contrôler visuellement le fil d'Ariane sur un échantillon de pages produit dans chaque langue, à tous les niveaux de la hiérarchie de catégories.
- Comparer le JSON-LD affiché avec l'outil de test de résultats enrichis de Google, langue par langue, pour vérifier la correspondance exacte des libellés.
- Vérifier dans WPML, via **Langues → Traduction des taxonomies**, qu'aucune catégorie ou étiquette du catalogue ne reste sans traduction dans une langue active du site.

> Un fil d'Ariane mal traduit ne saute jamais aux yeux d'un client pressé qui valide son site : c'est justement ce genre de détail périphérique, répété sur tout un catalogue, qui use la confiance d'un visiteur international.

## Ce que cet article ne traite pas

Ce correctif concerne un fil d'Ariane développé sur mesure dans un thème multilingue. La mise en place d'un fil d'Ariane sans extension dédiée, indépendamment de tout enjeu multilingue, a été traitée séparément côté astuces techniques et n'est pas reprise ici.

## En résumé

Un fil d'Ariane sur mesure doit résoudre explicitement chaque terme de taxonomie dans la langue courante via `wpml_object_id`, sans se contenter des fonctions natives de WordPress qui retournent le terme source. Le balisage `BreadcrumbList` associé doit suivre strictement les mêmes libellés traduits que l'affichage visuel, sous peine de désynchronisation entre ce que voit le visiteur et ce que lit un moteur de recherche.
