FOX - WooCommerce Currency Switcher Professional

Frais de port WooCommerce dans la mauvaise devise : causes et solutions

Des frais de port WooCommerce dans la mauvaise devise se manifestent de trois façons lorsqu'un visiteur change de devise : le symbole change mais le nombre reste le même, le coût est converti deux fois et ressort beaucoup trop élevé ou trop bas, ou la livraison tombe à zéro ou disparaît. Les prix des produits sont généralement corrects en même temps, car la cause tient à l'origine du coût de livraison. Voici comment FOX convertit la livraison, comment distinguer les trois cas avec un seul test, et la solution pour les tarifs forfaitaires, les plugins de transporteurs et les montants fixes par devise.

Comment FOX convertit les frais de livraison

WooCommerce part du principe que tout montant qu'il stocke est dans la devise de base, frais de livraison compris. Les modes de livraison construisent leurs tarifs, WooCommerce fait passer la liste par le filtre woocommerce_package_rates, et FOX la convertit à cet endroit avec la priorité 9999 : le coût de chaque tarif et ses taxes sont multipliés par le taux de change de la devise sélectionnée, puis arrondis aux décimales de cette devise.

  • Cette conversion ne s'exécute que si Plusieurs devises autorisées (Is multiple allowed) = Oui (Yes) dans l'onglet Avancé (Advanced) des réglages de FOX, le mode dans lequel les clients paient dans la devise qu'ils ont sélectionnée.
  • Avec Plusieurs devises autorisées (Is multiple allowed) = Non (No), les tarifs restent dans la devise de base. Le panier les affiche convertis à titre indicatif, et la page de paiement recalcule tout dans la devise de base, qui est ce que le client paie. Cette configuration est expliquée dans afficher la devise locale, facturer dans la devise de base.
  • Les formules du champ de coût de Tarif forfaitaire (Flat rate), comme [qty] * 2 ou [fee percent="10" min_fee="5"], sont évaluées avec le total du panier reconverti dans la devise de base ; les pourcentages et les frais minimums fonctionnent donc en termes de devise de base, puis le résultat est converti avec les autres tarifs.

Il en découle une règle : tout ce qui atteint woocommerce_package_rates avant la priorité 9999 doit être dans la devise de base. Un coût déjà exprimé dans la devise du visiteur est converti une seconde fois ; un coût qu'un plugin définit après que FOX a terminé n'est pas converti du tout.

Frais de port dans la mauvaise devise : déterminer de quel cas il s'agit

Prenez un mode de livraison et un coût connu dans la devise de base, par exemple 10,00 USD, ainsi qu'une devise au taux connu, par exemple l'EUR à 0,92 dans le tableau des devises de FOX. Passez en EUR, modifiez une fois la quantité du panier (WooCommerce conserve les tarifs calculés dans la session et les réutilise tant que le panier ou l'adresse ne change pas) et comparez :

Livraison en EURSignification
9,20 €Converti correctement
10,00 €Non converti : le tarif a été défini après FOX, ou par un plugin qui contourne les tarifs WooCommerce
8,46 €Converti deux fois : le plugin a déjà renvoyé 9,20 en EUR et FOX l'a multiplié de nouveau
Un autre montantLe transporteur a renvoyé un prix dans la devise de son propre compte, traité comme de la devise de base
0,00 € ou aucun mode de livraisonUn taux de 0 pour cette devise, ou un code de devise que le transporteur ne reconnaît pas

Pendant le test, l'option Mode débogage (Debug mode) de WooCommerce → Réglages → Livraison désactive le cache des tarifs de livraison, de sorte que chaque chargement de page calcule des tarifs neufs. Désactivez-la de nouveau ensuite.

Définir un coût de livraison exact par devise

La conversion par le taux de change donne des montants comme 9,20 € ou 1 486 ₹. Lorsque vous voulez des nombres ronds, un niveau de prix différent par marché (18 € pour l'Europe, 32 $ pour le reste du monde), ou des frais de port qui ne suivent pas une majoration ajoutée au taux de change, définissez plutôt le montant devise par devise :

  1. Dans l'onglet Avancé (Advanced) des réglages de FOX, réglez Plusieurs devises autorisées (Is multiple allowed) sur Oui (Yes). L'option Montant fixe individuel pour la livraison (Individual fixed amount for shipping) reste masquée tant que ce n'est pas fait.
  2. Activez Montant fixe individuel pour la livraison (Individual fixed amount for shipping) et enregistrez.
  3. Ouvrez WooCommerce → Réglages → Livraison, une zone de livraison, et modifiez son mode Tarif forfaitaire (Flat rate). Sous les champs de WooCommerce figure désormais un champ Coût fixe (Fixed cost) pour chaque devise sauf celle de base, par exemple Coût fixe EUR (Fixed cost EUR).
  4. Saisissez le montant dans cette devise. Un champ vide (texte indicatif auto) signifie « convertir selon le taux de change ».

Un montant fixe remplace tout le coût converti de ce tarif forfaitaire, y compris les éventuels coûts de classe de livraison ou le résultat d'une formule, et la taxe de livraison est recalculée à partir de lui. Seuls les montants supérieurs à 0 sont utilisés : un 0 compte comme vide ; pour une livraison gratuite dans une seule devise, utilisez donc un mode Livraison gratuite (Free shipping). La même option ajoute des champs Montant minimum de commande en EUR (Minimum order amount in EUR) aux modes Livraison gratuite (Free shipping), de sorte que le seuil de livraison gratuite peut lui aussi être défini par devise ; sans ces champs, FOX compare le sous-total du panier reconverti dans la devise de base au minimum exprimé dans la devise de base.

Ces champs n'existent que pour les modes Tarif forfaitaire (Flat rate) et Livraison gratuite (Free shipping) de WooCommerce lui-même. Les plugins de tarifs au tableau et les tarifs de transporteurs sont toujours convertis selon le taux de change. Si vous ne voyez pas les champs, vérifiez que l'option est toujours activée après l'enregistrement et que la fenêtre de réglages du mode de livraison s'ouvre sans erreur JavaScript dans la console du navigateur.

Pour des coûts convertis que vous voulez simplement rendre plus lisibles, un filtre d'arrondi est l'outil le plus adapté ; l'arrondi des prix convertis en propose un pour la livraison, qui s'exécute après la conversion de FOX.

Plugins de transporteurs qui renvoient des tarifs dans une autre devise

Les plugins pour UPS, DHL, FedEx, Printful, Easyship et les services de livraison locaux demandent un prix en direct à l'API du transporteur. L'API répond dans la devise demandée, ou dans la devise du compte du transporteur. Beaucoup de ces plugins demandent « la devise de la boutique » avec get_woocommerce_currency(), et FOX répond à cette fonction par la devise du visiteur ; l'API renvoie donc, par exemple, 9,20 EUR. Le plugin transmet 9,20 à WooCommerce comme s'il s'agissait de dollars, et FOX le convertit de nouveau. Certains plugins comparent la devise du compte à celle de la boutique et ne renvoient aucun tarif lorsqu'elles diffèrent.

Il existe trois façons de corriger cela, de la plus propre à la plus générale :

  1. Faire demander la devise de base par le plugin. Cherchez un réglage de devise dans le plugin du transporteur. S'il n'y en a pas, sa requête peut être modifiée pour utiliser $WOOCS->default_currency ; c'est la solution pour Printful.
  2. Utiliser une adaptation prête à l'emploi. Du code prêt à l'emploi existe pour UPS Shipping Method, le plugin officiel d'UPS, DHL Express Commerce, Printful, Easyship, Aramex et Ingrid. Packeta convertit ses tarifs via FOX lui-même et n'a besoin d'aucun code, à condition d'être à jour. Les modifications faites dans les fichiers d'un autre plugin sont perdues à sa mise à jour ; notez-les donc.
  3. Reconvertir les tarifs dans la devise de base avant que FOX ne les convertisse. Cela fonctionne avec n'importe quel transporteur et résiste aux mises à jour des plugins.
/*
 * Carrier rates that arrive in a currency other than the base currency:
 * turn them back into the base currency before FOX converts all rates (priority 9999).
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woocommerce_package_rates', function ($rates, $package) {
    if (!class_exists('WOOCS')) {
        return $rates;
    }
    global $WOOCS;

    $methods       = array('ups'); // method IDs of the carrier plugins (see below)
    $rate_currency = $WOOCS->current_currency;  // or a fixed code, e.g. 'GBP' for the account currency

    $currencies = $WOOCS->get_currencies();
    if ($rate_currency === $WOOCS->default_currency || empty($currencies[$rate_currency]['rate'])) {
        return $rates;
    }
    $factor = (float) $currencies[$rate_currency]['rate'];

    foreach ($rates as $rate) {
        if (!in_array($rate->get_method_id(), $methods, true)) {
            continue;
        }
        $rate->set_cost((float) $rate->get_cost() / $factor);

        $taxes = $rate->get_taxes();
        if (!empty($taxes)) {
            foreach ($taxes as $key => $tax) {
                $taxes[$key] = (float) $tax / $factor;
            }
            $rate->set_taxes($taxes);
        }
    }
    return $rates;
}, 100, 2);

Pour trouver l'identifiant d'un mode de livraison, inspectez le bouton radio du mode de livraison sur la page du panier : sa valeur ressemble à ups:4:03 ou flat_rate:2, et la partie avant le premier deux-points est généralement l'identifiant du mode. Gardez $rate_currency égal à la devise du visiteur lorsque le transporteur cote dans la devise qu'on lui demande ; indiquez un code fixe lorsqu'il cote toujours dans la devise du compte. Cette devise doit exister dans le tableau des devises de FOX avec un taux à jour, faute de quoi l'extrait laisse les tarifs intacts. Le même extrait répond aussi à la question « ne pas convertir la livraison pour ce mode » : le montant renvoyé par le mode est alors affiché tel quel dans toutes les devises.

Une livraison qui n'est pas convertie du tout

Lorsque le nombre reste le même et que seul le symbole change, le coût n'est jamais passé par la conversion de FOX. Raisons typiques :

  • Le plugin modifie ses tarifs dans son propre rappel woocommerce_package_rates avec une priorité supérieure à 9999, après que FOX les a convertis.
  • Le prix est défini par le widget de paiement propre au plugin ou ajouté comme frais du panier au lieu d'un tarif de livraison.
  • Des règles du plugin de livraison comparent le total du panier à des seuils saisis dans la devise de base ; les règles fondées sur la valeur du panier choisissent donc la mauvaise tranche dans les autres devises.

Ces cas demandent une modification du côté du plugin : il doit faire passer ses montants par FOX avec apply_filters('woocs_exchange_value', $amount), décrit sur la page woocs_exchange_value, ou comparer des valeurs en devise de base. Interrogez les auteurs du plugin, ou consultez FOX Labs pour des adaptations d'autres plugins.

La livraison passe à zéro ou disparaît après le changement de devise

  • Un taux de 0. FOX multiplie le coût de livraison par le taux de la devise ; un taux enregistré à 0 rend donc tous les tarifs gratuits dans cette devise. Cela arrive lorsqu'un agrégateur ne renvoie aucune donnée, souvent après un changement de devise de base. Vérifiez la colonne Taux (Rate) de l'onglet Devises (Currencies) ; les taux de change qui ne se mettent pas à jour en détaille les causes.
  • Un code de devise que le transporteur ne connaît pas. Les API des transporteurs cotent selon le code ISO ; une devise ajoutée sous la forme UK au lieu de GBP ne renvoie aucun tarif et la page de paiement n'affiche aucun mode de livraison. Utilisez le vrai code ISO pour toute devise que voit un transporteur ou une passerelle ; les codes de devise personnalisés explique quand un code non ISO est sans danger.
  • Le transporteur rejette la devise. Certains plugins de transporteurs ne renvoient des tarifs que lorsque la devise de la boutique est égale à celle du compte. Utilisez l'une des trois solutions de la section sur les transporteurs ci-dessus.

Checklist

  • Plusieurs devises autorisées (Is multiple allowed) est réglé comme prévu : Oui (Yes) pour facturer dans la devise du visiteur, Non (No) pour facturer dans la devise de base.
  • Chaque devise a un taux différent de zéro et un vrai code ISO.
  • Les tarifs forfaitaires qui exigent des montants exacts ont des valeurs Coût fixe (Fixed cost) pour chaque devise, avec Montant fixe individuel pour la livraison (Individual fixed amount for shipping) activé.
  • Les plugins de transporteurs demandent la devise de base, utilisent leur adaptation, ou sont couverts par l'extrait de reconversion.
  • Testé dans une fenêtre de navigation privée, avec le panier modifié ou le Mode débogage (Debug mode) de la livraison activé, dans chaque devise.

Si un mode de livraison reste incorrect dans une devise, ouvrez un sujet sur le forum de support de FOX en indiquant le nom du plugin de livraison, votre réglage Plusieurs devises autorisées (Is multiple allowed), ainsi que le coût que vous voyez dans la devise de base et dans l'autre devise, et nous l'examinerons.