FOX - WooCommerce Currency Switcher Professional

Le sélecteur de devises ne change pas les prix ? Diagnostic pas à pas

Un sélecteur de devises qui ne change pas les prix se présente sous l'une de ces deux formes : vous choisissez une autre devise et rien ne se passe, ou le symbole monétaire change alors que le montant reste le nombre de la devise de base. FOX convertit un prix au moment où WooCommerce le construit ; si un montant ne change pas, c'est soit que la devise n'a jamais été changée, soit que ce montant n'est pas passé par les fonctions de prix de WooCommerce. Les vérifications ci-dessous vont de la plus rapide à la plus approfondie.

Pourquoi un sélecteur de devises ne change pas certains prix

Lorsqu'un visiteur choisit une devise, FOX l'enregistre et la page est reconstruite dans cette devise. Avec Plusieurs devises autorisées (Is multiple allowed) = Oui (la valeur par défaut d'une nouvelle installation), FOX filtre les accesseurs de prix du produit (get_price(), get_regular_price(), get_sale_price() et les prix des variations), de sorte que chaque prix que WooCommerce lit sur un produit est converti. Avec Non, il convertit les montants au moment où ils sont formatés par wc_price(). Dans les deux modes, un prix affiché par get_price_html() du produit est en outre enveloppé dans un <span class="woocs_price_code">, ce qui permet à FOX de retrouver et de redessiner les prix sur les pages en cache.

Le symbole monétaire vient d'un autre endroit : WooCommerce demande le symbole de la devise courante chaque fois qu'il formate un montant. C'est pourquoi le symbole peut changer sans que le nombre change. Tout montant lu directement dans la base de données, calculé par un autre plugin ou réécrit plus tard par un script reçoit le nouveau symbole et garde l'ancien nombre.

Étape 1 : la devise change-t-elle vraiment ?

  • Le sélecteur n'est pas FOX. Les menus de devises intégrés aux thèmes, les bannières de drapeaux de l'en-tête et les widgets de devise des constructeurs de pages sont du code distinct ; ils peuvent modifier un symbole ou un cookie que FOX ne lit jamais. Supprimez-les et utilisez le sélecteur FOX : le widget, le shortcode [woocs] ou le sélecteur latéral.
  • La page se recharge et l'ancienne devise revient. La sélection est alors perdue ou annulée : par un cache de page, par le stockage de la devise, ou par du code qui appelle $WOOCS->set_currency() ou reset_currency() à chaque page, souvent un reste d'un ancien snippet « forcer une seule devise ». La devise revient à la valeur par défaut au changement de page passe en revue chaque cause.
  • Toutes les devises affichent le même symbole. Si les montants changent mais que toutes les devises portent le même signe, le problème vient de la colonne Symbole (Symbol) de l'onglet Devises (Currencies), pas de la conversion ; voir comment changer le symbole monétaire.

Étape 2 : vérifier la ligne de la devise

Ouvrez l'onglet Devises (Currencies) et regardez la devise qui ne se convertit pas :

  • Taux. Avec un taux de 1, 100 devient 100 : seul le symbole change. Un taux de 0 ou un taux vide donne des prix à zéro ou vides. Mettez le taux à jour, ou corrigez l'agrégateur comme décrit dans les taux de change ne se mettent pas à jour.
  • Code. Utilisez le code ISO 4217 (THB, EUR) et saisissez-le à la main. Un code collé depuis une page web peut contenir un caractère invisible ; FOX ne trouve alors pas la devise, et chaque changement retombe sur la devise de base. Supprimer le code et le retaper suffit à tout régler dans ce cas.

Si vous avez récemment changé la devise de base, vérifiez de nouveau tous les taux : ils sont tous relatifs à la devise de base, et la devise de base elle-même doit avoir le taux 1.

Étape 3 : trouver qui affiche le prix

Passez dans la devise qui pose problème, ouvrez les outils de développement du navigateur (F12) et collez ceci dans la console :

document.querySelectorAll('.woocs_price_code').forEach(function (el) {
    el.style.outline = '2px solid red';
});

Chaque prix que WooCommerce a affiché via le HTML de prix du produit reçoit un cadre rouge. Un prix sans cadre a été affiché par un autre code : le thème, un widget de constructeur de pages ou un autre plugin. Cela vous indique où chercher ensuite.

Le prix n'a pas de cadre : modèles du thème et code personnalisé

Le cas le plus courant est un modèle qui lit directement le champ meta du prix, par exemple echo wc_price( get_post_meta( $id, '_price', true ) );. Cela lit le nombre stocké en devise de base sans passer par l'objet produit : avec Plusieurs devises autorisées (Is multiple allowed) = Oui, il n'est jamais converti, et dans les deux modes il n'a pas de cadre, donc il n'est pas redessiné sur les pages en cache. Remplacez-le par l'affichage de prix propre au produit :

<?php
/*
 * In the theme template that prints the price (copy it to a child theme first).
 * Instead of: echo wc_price( get_post_meta( $id, '_price', true ) );
 */
$product = wc_get_product( $id );
if ( $product ) {
    echo $product->get_price_html(); // converted, formatted, redrawn on cached pages
}

// For an amount that is not a product price, stored in the base currency:
echo do_shortcode( '[woocs_show_custom_price value="' . esc_attr( $amount ) . '"]' );
?>

Le shortcode [woocs_show_custom_price] convertit et formate un montant en devise de base dans les deux modes. Pour les calculs en PHP, $WOOCS->woocs_exchange_value() renvoie le nombre converti. Le code ancien de thème qui construit des prix à partir de propriétés comme $product->max_variation_price pose le même problème ; la FAQ problèmes de prix sur la page produit montre l'affichage correct pour les pages de produit unique.

Le prix n'a pas de cadre : un autre plugin le calcule

Les plugins d'événements et de réservations, d'options de produit et de champs supplémentaires, de promotions et de remises calculent souvent eux-mêmes un prix à partir des valeurs en devise de base et affichent le résultat. Si seuls ces produits, ou seulement le prix de la variation après le choix des options, gardent le montant de base, désactivez le plugin sur une copie de test et recommencez. Beaucoup de ces plugins disposent déjà d'un code d'adaptation prêt à l'emploi dans la liste de compatibilité de FOX Labs.

Le prix a un cadre mais affiche le montant de base

Le prix a alors été converti côté serveur puis modifié ensuite dans le navigateur, ou la page provient d'un cache :

  • Cache de page. Une page en cache porte les prix de la personne qui l'a chargée en premier. Activez J'utilise un plugin de cache sur mon site (I am using cache plugin on my site) dans l'onglet Options, afin que FOX redessine les prix encadrés après le chargement de la page, puis videz tous les caches. Le fonctionnement et les cookies à exclure sont expliqués dans pourquoi un sélecteur de devises et un cache de page se battent.
  • JavaScript différé ou combiné. Si l'optimisation retarde les scripts de FOX, le redessin ne s'exécute jamais ; voir le sélecteur de devises reste bloqué au chargement.
  • Un script réécrit le prix. Les sélecteurs de variations, les aperçus rapides, les barres d'ajout au panier fixes et les scripts personnalisés copient parfois un prix mémorisé lors de la construction de la page, ou le recalculent en JavaScript. Comparez le code source de la page (Ctrl+U) avec ce que vous voyez : un prix correct dans le code source et un prix erroné à l'écran désignent un script.

Étape 4 : deux convertisseurs sur un même site

Un seul plugin doit convertir les prix. Un second convertisseur se bat avec FOX : l'un change le symbole, l'autre le montant, ou les deux convertissent et les prix sont doublés ou réinitialisés. Les seconds convertisseurs typiques sont la fonction multidevise de WooPayments (FOX affiche un avis à ce sujet sur les pages de réglages de WooCommerce), le multidevise de WooCommerce Multilingual de WPML, les modules de devises des constructeurs de pages et des extensions de thème comme ShopEngine Pro, ainsi qu'un plugin de devises utilisé auparavant et toujours actif. Désactivez l'autre, gardez FOX et définissez-y vos devises.

Isoler la cause

Si aucune des vérifications ci-dessus ne désigne le coupable, testez sur une copie de test :

  1. Passez à un thème par défaut comme Storefront et désactivez tous les plugins sauf WooCommerce et FOX.
  2. Changez de devise sur la boutique, sur un produit et dans le panier. Si les prix se convertissent maintenant, la cause se trouve dans ce que vous avez désactivé.
  3. Réactivez d'abord le thème, puis les plugins un par un, en testant après chacun, jusqu'à ce que les prix cessent de se convertir.

La FAQ la devise est mal recalculée montre une vraie fonction de thème trouvée de cette façon.

Liste de contrôle

  • Le sélecteur affiché sur la page est le widget, le shortcode ou le sélecteur latéral de FOX.
  • La devise choisie reste sélectionnée après le rechargement de la page.
  • La devise a un vrai taux (ni 0, ni 1) et un code ISO retapé.
  • Le prix défaillant a le cadre rouge du test de la console, ou son modèle utilise maintenant get_price_html().
  • Aucun second convertisseur de devises n'est actif ; les caches sont vidés et les scripts de FOX ne sont pas différés.

Si les prix ne changent toujours pas, ouvrez un sujet sur le forum d'assistance de FOX avec un lien vers une page où le problème se produit, le résultat du test de la console et votre réglage Plusieurs devises autorisées (Is multiple allowed), et nous l'examinerons.