Le WordPress d'aujourd'hui, décodé pour les développeurs

E-commerce

WPML et WooCommerce Subscriptions : le conflit qui bloque le renouvellement

Sur une boutique multilingue, certains abonnements cessent de se renouveler correctement. L'origine se cache dans la gestion des identifiants de traduction.

Par WordPress Développement • 12 août 2021 • 4 min de lecture • Aucun commentaire
WPML et WooCommerce Subscriptions : le conflit qui bloque le renouvellement

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.

L'essentiel à retenir : Comprendre comment WPML duplique les identifiants de produit ; Corriger le lien entre abonnement et produit traduit ; Vérifier le renouvellement dans chaque langue du site

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_payment dé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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi