ProdTabs

ProdTabs › Guides

Traduction des onglets produit WooCommerce avec WPML ou Polylang

Publié le 16 octobre 2026 par .

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 :

OngletOrigine du texteOù le traduire
DescriptionLe contenu principal du produitAvec la traduction du produit
Informations complémentairesPoids, dimensions, attributs visiblesLes valeurs d'attributs sont des termes, à traduire comme les catégories
AvisVos clientsNulle part, ce sont leurs mots
Titres des ongletsLes fichiers de traduction de WooCommerceTableau 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 :

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 :

Panneau Onglets dans la traduction d'un produit WooCommerce. L'onglet Notre avis porte les étiquettes Ce produit et Non traduit, avec la case Visible cochée et les flèches pour le déplacer. Un avis jaune dit : Pas encore traduit dans cette langue, la boutique affiche le texte de la langue d'origine, saisissez la traduction ci-dessous. Suivent le champ Titre, un éditeur de contenu vide, un lien dépliable Texte de la langue d'origine, le lien direct #tab-notre-avis et le code court de l'onglet avec un bouton Copier.

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 :

Carte Langues de la vue d'ensemble de ProdTabs : pastilles FR, ES avec 13 et IT avec 12 onglets à traduire, la phrase Polylang est actif, une fiche et ses traductions partagent la même liste d'onglets et chaque langue garde ses textes, la mention 25 onglets ne sont pas encore traduits dans l'une des langues, et un bouton Vérifier la configuration.

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).