FOX - WooCommerce Currency Switcher Professional

Double conversion de devise WooCommerce : prix du panier trop élevés

La double conversion de devise dans WooCommerce se manifeste toujours de la même façon : la page produit indique 218 CAD, le panier 304 CAD. Le prix a été multiplié deux fois par le taux de change. FOX convertit un prix une seule fois ; une seconde conversion signifie donc toujours qu'un deuxième acteur intervient dans la chaîne : un autre plugin, le thème, du code personnalisé, ou un réglage qui gonfle le taux. Ce guide explique comment la seconde conversion se produit, comment la distinguer d'un simple taux erroné, comment trouver le plugin responsable et comment les développeurs corrigent leur propre code.

Comment un prix se retrouve converti deux fois

Avec Plusieurs devises autorisées (Is multiple allowed) réglé sur Oui (l'onglet Avancé (Advanced) de WooCommerce → Réglages → Devise), les clients paient dans la devise qu'ils ont sélectionnée ; FOX convertit donc le prix du produit à la source : chaque fois qu'un code appelle $product->get_price(), il reçoit le montant dans la devise sélectionnée. C'est correct tant que le code se contente de lire les prix.

Les problèmes commencent avec les plugins qui lisent un prix, le modifient et le réécrivent. Les options et add-ons de produit, les remises dynamiques, les prix B2B et de gros, les réservations, les abonnements, les stocks multi-entrepôts et plugins similaires le font souvent dans le panier : ils appellent get_price(), qui renvoie déjà 218 CAD pour un produit à 157 USD, ajoutent leur part et enregistrent le résultat avec set_price(). WooCommerce conserve le nombre reçu comme prix de cet article du panier. Lorsque le panier relit le prix, FOX convertit 218 comme s'il s'agissait d'USD, et le panier affiche 304. La page produit ne passe jamais par cette étape, c'est pourquoi elle reste correcte.

Les autres chemins qui mènent au même résultat :

  • Deux convertisseurs de devises. La fonction multidevise propre à WooCommerce (incluse dans WooPayments), un thème avec un sélecteur de devise intégré ou un second plugin de devises convertit aussi le prix. Un seul d'entre eux peut être actif.
  • Fonctions de prix du thème. Un thème qui construit lui-même les chaînes de prix, par exemple pour les fourchettes de produits variables, peut appliquer de nouveau une valeur déjà convertie.
  • Votre propre code qui définit les prix du panier ou convertit des montants que FOX a déjà convertis.

Avec Plusieurs devises autorisées (Is multiple allowed) réglé sur Non, les prix restent en interne dans la devise de base et FOX ne convertit que ce qui est affiché. C'est pourquoi une double conversion qui disparaît dans ce mode désigne directement un plugin qui réécrit les prix.

Double conversion ou taux erroné ? Vérifiez le rapport

Divisez le prix erroné par le prix correct et comparez le résultat au taux de la devise dans l'onglet Devises (Currencies).

Ce que vous voyezCe que cela indique
Page produit correcte, panier ou paiement trop élevé ; erroné ÷ correct égale le tauxDouble conversion par un plugin, le thème ou du code personnalisé
Erroné seulement pour certains produits (variables, avec options, réservables)Le plugin qui gère ces produits
Toutes les pages trop élevées dans une devise, page produit compriseLe taux ou la valeur d'intérêt de cette devise, pas une double conversion
Prix corrects sur le site, e-mail de commande ou page de paiement multipliés de nouveauLa propre conversion de devise d'une passerelle de paiement

Le symptôme inverse, un prix qui ne change pas du tout quand le visiteur change de devise, a d'autres causes ; voir le sélecteur de devises ne change pas les prix.

Écartez d'abord les réglages

  • Intérêt. Le champ après le + dans la colonne Taux+% (Rate+%) ajoute une valeur au taux. Un nombre simple est ajouté tel quel : dans une boutique dont les prix sont en roupies pakistanaises, 5 transforme le taux USD de 0,0036 en 5,0036, ce qui rend tous les prix de cette devise environ 1 400 fois plus élevés. Pour un pourcentage, écrivez-le avec le signe, par exemple 3%.
  • Le taux lui-même. Appuyez sur le bouton d'actualisation à côté du taux et comparez-le à une référence. Si l'agrégateur renvoie n'importe quoi, changez-en ; voir les taux de change ne se mettent pas à jour.
  • La devise de base. La ligne marquée comme base doit avoir le taux 1 et aucun intérêt, et les prix des produits doivent être saisis dans cette devise. Une boutique dont les prix sont en USD alors que la base de FOX est l'EUR présente un écart constant dans chaque devise.

Trouver le plugin qui reconvertit

Travaillez sur une copie de test du site, pas sur la boutique en production, et utilisez pour chaque test un produit et une devise autre que la devise de base.

  1. Notez le prix sur la page produit et dans le panier dans cette devise.
  2. Réglez Plusieurs devises autorisées (Is multiple allowed) sur Non, enregistrez, videz le panier et ajoutez de nouveau le produit. Si le panier est maintenant correct, un plugin réécrit les prix. Remettez le réglage sur Oui pour les étapes suivantes.
  3. Désactivez tous les plugins sauf WooCommerce et FOX et passez à un thème par défaut comme Storefront. Videz le panier et testez. Le panier doit maintenant correspondre à la page produit.
  4. Réactivez les plugins un par un, en commençant par tout ce qui touche aux prix : options de produit, remises, vente en gros, réservations, abonnements, inventaire. Videz le panier et ajoutez de nouveau le produit après chacun : certains plugins stockent leur prix dans l'article du panier au moment de son ajout.
  5. Quand le panier devient erroné, le plugin que vous venez d'activer est le coupable. Remettez le thème en dernier pour le vérifier lui aussi.

Les caches de page et le stockage du navigateur peuvent afficher un ancien panier. Videz-les, ou testez dans une fenêtre privée, avant de tirer une conclusion d'une étape.

Corriger : adaptations, réglages et code

Le coupable est un plugin tiers

De nombreux plugins de prix populaires disposent déjà d'une adaptation ; consultez la liste de compatibilité pour le vôtre et appliquez le code publié. S'il n'y figure pas, FOX Labs accepte les demandes d'adaptation pour les plugins très utilisés. Deux autres options : voir si le plugin possède un réglage pour les boutiques multidevises ou sa propre conversion que vous pouvez désactiver, ou régler Plusieurs devises autorisées (Is multiple allowed) sur Non, afin que les clients voient les prix dans leur devise et paient dans la devise de base ; afficher les prix locaux tout en facturant dans la devise de base explique ce qui change pour les clients.

Le coupable est votre propre code

La règle est simple : get_price() vous donne la devise sélectionnée, set_price() doit recevoir la devise de base. Reconvertissez le résultat avec le filtre woocs_back_convert_price avant de l'enregistrer :

/*
 * Custom cart prices on a FOX shop with "Is multiple allowed" = Yes.
 * Child theme functions.php or a code snippets plugin.
 */
add_action('woocommerce_before_calculate_totals', function ($cart) {
    if (is_admin() && !wp_doing_ajax()) {
        return;
    }
    if (did_action('woocommerce_before_calculate_totals') >= 2) {
        return; // run once per request, or the change is applied again
    }

    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];

        $price = (float) $product->get_price(); // already in the selected currency
        $price = $price * 1.10;                  // your logic, for example +10 %

        // back to the base currency, so FOX converts it only once;
        // with "Is multiple allowed" = No the value passes through unchanged
        $product->set_price(apply_filters('woocs_back_convert_price', $price, true));
    }
}, 20);

Comme il s'agit d'un filtre, le code continue de fonctionner si FOX est désactivé : la valeur passe sans être modifiée. Les montants fixes de votre logique (des frais de 5,00, un supplément) sont des montants en devise de base ; ajoutez-les après la reconversion, pas avant.

Si votre code calcule un prix déjà définitif dans la devise sélectionnée, par exemple à partir de sa propre table de prix par devise, indiquez à FOX de ne pas y toucher avec woocs_skip_conversion. FOX appelle ce filtre avant de convertir le prix d'un produit ; renvoyer true laisse ce prix tel quel :

/*
 * Mark cart products whose price you set in the selected currency,
 * for example inside woocommerce_before_calculate_totals:
 *     $product->set_price($final_price);
 *     $product->update_meta_data('_price_is_final', 'yes'); // kept in memory, the product is not saved
 */
add_filter('woocs_skip_conversion', function ($skip, $price, $product) {
    if ($product instanceof WC_Product && $product->get_meta('_price_is_final') === 'yes') {
        return true;
    }
    return $skip;
}, 10, 3);

Le filtre ne reçoit le produit qu'avec Plusieurs devises autorisées (Is multiple allowed) réglé sur Oui, qui est le mode dans lequel ce problème se produit.

Si le panier est toujours erroné

  • Testez à chaque fois avec un panier neuf. Un ancien article du panier peut porter un prix qu'un plugin a stocké lors de son ajout.
  • Vérifiez qu'un seul convertisseur de devises est actif, y compris le multidevise propre à WooCommerce et les sélecteurs de devise intégrés au thème.
  • Si le panier est correct et que seul le total du paiement ou la commande est erroné, examinez les plugins de frais, de livraison et de paiement, qui ajoutent leurs propres montants au total.
  • Comparez avec la courte liste de contrôle de prix converti deux fois sur la page de paiement si le problème n'apparaît qu'au paiement.

Si l'isolation désigne un plugin sans adaptation pour l'instant, indiquez son nom, sa version et le type de produit qui pose problème sur le forum d'assistance de FOX.