Traduction des onglets produit WooCommerce avec WPML ou Polylang
Le 16 octobre 2026, sur ma boutique de test, l'enregistrement de la traduction espagnole d'un produit a remplacé les onglets du français et de l'italien par l'onglet espagnol. La boutique utilise Polylang 3.8.10 et Custom Product Tabs for WooCommerce 1.8.6, l'extension d'onglets de YIKES. Regardons cela.
Précision : je suis l'auteur de ProdTabs, une autre extension d'onglets, dont je parle dans la dernière partie.
Le test
Le produit a deux onglets en français (Livraison et Garantie), un seul en espagnol et un seul en italien. On traduit l'onglet espagnol puis on enregistre le produit espagnol, sans puis avec la synchronisation des champs personnalisés (en anglais), réglée dans Langues > Réglages > Synchronisation :
Avant :
fr (16) : Livraison, Garantie
es (69) : Envío
it (109) : Spedizione
Synchronisation désactivée (PLL()->options : [])
Je traduis l'onglet espagnol puis j'enregistre le produit espagnol (wp_update_post).
fr (16) : Livraison, Garantie
es (69) : Envío
it (109) : Spedizione
Synchronisation des champs personnalisés activée (PLL()->options : ["post_meta"])
Je traduis l'onglet espagnol puis j'enregistre le produit espagnol (wp_update_post).
fr (16) : Envío
es (69) : Envío
it (109) : Envío
Restauré : oui, 108 lignes identiques | sync : []
Raté : avec la synchronisation, les trois langues n'ont plus qu'un onglet, en espagnol. Le premier passage sert de témoin (sans synchronisation, rien ne bouge), et la dernière ligne confirme que le script rétablit les données d'origine.
(Tout a été fait par un script lancé avec WP-CLI, jusqu'à l'enregistrement par wp_update_post() : je n'ai pas refait la manipulation à la main dans l'éditeur.)
Pourquoi ? Parce qu'à chaque enregistrement, Polylang recopie dans les traductions tous les champs à synchroniser. Or la case cochée y fait entrer tous les champs publics (ceux dont le nom ne commence pas par un tiret bas), dont celui où YIKES range les onglets, yikes_woo_products_tabs.
Une extension peut demander une autre règle pour ses propres champs, mais YIKES ne le fait pas.
Le rôle de wpml-config.xml
Cette règle passe par un fichier wpml-config.xml, où l'extension indique, pour chacun de ses champs, s'il faut le copier dans toutes les langues, le traduire ou l'ignorer. WPML le lit, et Polylang aussi (en anglais) : un seul fichier sert donc aux deux.
Cherchons toute mention de WPML ou de Polylang dans le dossier de YIKES :
$ grep -ril "wpml\|polylang" wp-content/plugins/yikes-inc-easy-custom-woocommerce-product-tabs/
wp-content/plugins/yikes-inc-easy-custom-woocommerce-product-tabs/readme.txt
Un seul fichier ressort, le readme, dont la ligne 24 affirme « This plugin is compatible with WPML. » On n'y trouve pourtant ni wpml-config.xml ni la moindre ligne de code destinée à WPML.
Je n'ai pas testé YIKES avec WPML, et il marche peut-être très bien si l'on traduit chaque produit à la main. Mais la documentation de WPML (en anglais) prévient, à propos des champs qui contiennent un tableau, que « WPML translates all sub-keys in custom fields by default ». Réglé sur « Traduire », le champ de YIKES soumettrait donc aussi aux traducteurs la clé id, celle qui sert d'ancre à l'onglet.
La parade, toujours d'après cette page, consiste à lister dans une section custom-fields-texts les seules sous-clés à traduire. (Mise à jour du 16 octobre : la première version de cet article affirmait à tort que WPML ne traduisait pas un tableau sans configuration.)
Les onglets de WooCommerce
Les trois onglets de WooCommerce, eux, ne dépendent d'aucune extension, mais chacun tire son texte d'une source différente :
| Onglet | Origine du texte | Où le traduire |
|---|---|---|
| Description | Le contenu principal du produit | Avec la traduction du produit |
| Informations complémentaires | Poids, dimensions, attributs visibles | Les valeurs d'attributs sont des termes, à traduire comme les catégories |
| Avis | Vos clients | Nulle part, ce sont leurs mots |
| Titres des onglets | Les fichiers de traduction de WooCommerce | Tableau de bord > Mises à jour, section Traductions |
Le piège le plus courant est un titre renommé par un extrait de code copié sans précaution, comme celui-ci :
add_filter( 'woocommerce_product_tabs', function ( $tabs ) {
$tabs['description']['title'] = 'Détails';
return $tabs;
} );
« Détails » restera en français dans toutes les langues. L'exemple de la documentation de WooCommerce (en anglais), lui, est correct : il passe le titre par la fonction __(), avec un domaine de texte. Le titre se traduit alors par un fichier .po dans chaque langue.
Pour le reste de la boutique, WPML s'appuie sur l'extension gratuite WooCommerce Multilingual, et l'éditeur de Polylang vend Polylang for WooCommerce.
Quatre questions avant de choisir
Avant d'installer une extension d'onglets sur une boutique multilingue, je vérifie quatre points :
- Fournit-elle un fichier
wpml-config.xml? Il suffit d'ouvrir son dossier pour le savoir. - La liste des onglets est-elle enregistrée à part de leurs textes ? Si tout tient dans un seul champ, on retombe sur le dilemme du test : copier le champ écrase les traductions, le traduire oblige à reporter chaque changement de liste dans toutes les langues.
- Que voit le client quand un onglet n'est pas encore traduit ? Selon l'extension, rien, un onglet vide ou le texte d'origine, et seule cette dernière solution ne lui fait perdre aucune information.
- Les ancres sont-elles les mêmes dans toutes les langues ? Une ancre tirée du titre change avec la traduction, et
#tab-livraisondevient#tab-envio.
Le cas de ProdTabs
Dans ProdTabs, la liste des onglets et leurs textes sont séparés depuis le début, comme le montre cet extrait de son wpml-config.xml :
<custom-field action="copy">_prodtabs_layout</custom-field>
<custom-field action="translate">_prodtabs_texts</custom-field>
<custom-fields-texts>
<key name="_prodtabs_texts">
<key name="*">
<key name="title" />
<key name="content" />
</key>
</key>
</custom-fields-texts>
La liste (_prodtabs_layout) est copiée telle quelle, les textes (_prodtabs_texts) sont traduits, et seulement leurs clés title et content. Notez aussi que les textes sont rangés par onglet, pas par position, et que l'ancre de chaque onglet est fixée une fois pour toutes à sa création.
Refaisons le même test sur un produit ProdTabs, synchronisation activée, en renommant un onglet espagnol et en le plaçant en tête :
Avant :
fr (14) : Contenu des cases | Composition et allergènes | Notre avis | Livraison | ...
es (67) : Contenido de las casillas | Composición y alérgenos | Nuestra opinión | Envío | ...
it (107) : Contenuto delle caselle | Composizione e allergeni | La nostra opinione | Consegna | ...
Synchronisation des champs personnalisés activée.
Sur l'espagnol : je renomme « Envío » en « Envío y devoluciones », je remonte cet onglet en tête, j'enregistre.
fr (14) : Livraison | Contenu des cases | Composition et allergènes | Notre avis | ...
es (67) : Envío y devoluciones | Contenido de las casillas | Composición y alérgenos | Nuestra opinión | ...
it (107) : Consegna | Contenuto delle caselle | Composizione e allergeni | La nostra opinione | ...
Restauré : oui, 117 lignes identiques | sync : []
Parfait, tout marche : le nouvel ordre s'applique aux trois langues, et chacune garde ses textes.
Avec WPML, les titres et les textes des onglets apparaissent dans l'éditeur de traduction du produit (testé avec WPML 5.1, String Translation et WooCommerce Multilingual 5.6). Avec Polylang, une nouvelle traduction reprend les textes d'origine, à traduire dans le panneau Onglets du produit :
J'ai choisi d'afficher le texte d'origine plutôt que rien : un client qui lit la garantie en français sur la version espagnole a au moins l'information. Le réglage « Onglets pas encore traduits » permet de masquer ces onglets à la place, et la vue d'ensemble de ProdTabs compte, langue par langue, ce qui reste à traduire :
TranslatePress et Weglot fonctionnent autrement : ils traduisent la page affichée, pas les données du produit. Ils traduisent donc les onglets de ProdTabs comme le reste du contenu, puisque tout leur texte est dans la page dès son chargement (testé avec TranslatePress 3.3 et Weglot 6.4).
Bref, avant de traduire des onglets, ouvrez le dossier de l'extension qui les gère et cherchez un fichier wpml-config.xml (et si vous quittez YIKES, la migration est décrite dans un article à part).