Constat technique récurrent sur les boutiques multilingues : un abonnement souscrit en version allemande d’une boutique WooCommerce ne se renouvelle plus après quelques mois, alors que le même produit fonctionne sans accroc en version française. Le point commun de ces incidents est presque toujours WPML combiné à WooCommerce Subscriptions.
Comment WPML gère la traduction des produits
WPML fonctionne en dupliquant chaque produit WooCommerce en autant d’articles WordPress distincts qu’il existe de langues actives, reliés entre eux par une table de correspondance interne (icl_translations). Un produit disponible en français et en allemand possède donc deux identifiants de post différents, chacun avec ses propres métadonnées.
Pour la majorité des fonctionnalités WooCommerce, cette duplication reste transparente grâce aux hooks de traduction fournis par WPML. Le problème apparaît avec WooCommerce Subscriptions parce que l’extension stocke, au moment de la souscription initiale, l’identifiant du produit dans les métadonnées de l’abonnement — et cet identifiant reste figé à l’identifiant de la langue dans laquelle l’achat a été effectué.
Où se situe exactement le conflit au renouvellement
Au moment du renouvellement automatique, WooCommerce Subscriptions recharge le produit à partir de l’identifiant stocké pour recalculer le prix et générer la nouvelle commande. Si, entre-temps, le produit original a été modifié uniquement dans sa version source (la traduction n’ayant pas été resynchronisée), ou si un plugin de cache de traduction a invalidé la relation WPML sans régénérer la métadonnée liée à l’abonnement, l’appel échoue silencieusement ou revient à un prix incohérent.

Corriger le lien entre abonnement et produit traduit
La correction la plus fiable consiste à forcer explicitement la résolution du produit dans la langue d’origine de l’abonnement plutôt que de laisser WPML basculer selon la langue courante du contexte d’exécution du cron de renouvellement, qui peut différer de la langue de l’achat initial :
add_filter('woocommerce_subscriptions_product', function ($product, $subscription) {
$langue_origine = $subscription->get_meta('_wpml_langue_souscription');
if ($langue_origine) {
$id_produit_traduit = apply_filters(
'wpml_object_id',
$product->get_id(),
'product',
true,
$langue_origine
);
return wc_get_product($id_produit_traduit);
}
return $product;
}, 10, 2);
Il faut au préalable enregistrer la langue de souscription au moment de l’achat initial, via le hook woocommerce_checkout_subscription_created, en lisant la langue active avec apply_filters('wpml_current_language', null).
Vérifier le renouvellement dans chaque langue active
- Créer un abonnement de test dans chaque langue configurée sur le site
- Forcer un renouvellement anticipé via l’action
woocommerce_scheduled_subscription_paymentdéclenchée manuellement en environnement de recette - Vérifier que le montant facturé correspond au prix affiché dans la langue de souscription, pas au prix de la langue par défaut du site
- Contrôler que l’e-mail de confirmation de renouvellement part bien dans la bonne langue
Le piège des extensions de traduction de contenu dynamique
Certaines configurations ajoutent WPML String Translation en complément, pour traduire les libellés générés dynamiquement par WooCommerce Subscriptions (statuts d’abonnement, textes des e-mails de renouvellement). Cette couche supplémentaire peut elle-même introduire un délai de cache si les chaînes traduites sont mises en cache par un plugin d’optimisation, ce qui explique parfois qu’une correction du lien produit-traduction ne suffise pas totalement à retrouver un comportement cohérent dans toutes les langues immédiatement après la mise à jour.
Sur les projets où ce cas se présente, vider explicitement le cache des chaînes de traduction WPML après tout déploiement touchant WooCommerce Subscriptions évite ce résidu d’incohérence, en plus de la correction du filtre présentée plus haut.
En résumé
Le conflit entre WPML et WooCommerce Subscriptions ne vient pas d’une incompatibilité générale entre les deux extensions, mais d’un point précis : l’identifiant de produit stocké dans l’abonnement ne suit pas automatiquement la structure de traduction WPML lors du renouvellement. Fixer la langue de souscription dès l’achat initial et résoudre explicitement le produit traduit à chaque renouvellement règle ce problème de façon durable.