FOX - WooCommerce Currency Switcher Professional

Taux de change du sélecteur de devises WooCommerce non mis à jour

Lorsque les taux de change du sélecteur de devises WooCommerce ne se mettent pas à jour, le symptôme est l'un des trois suivants : un champ de taux affiche aucune donnée pour ... (no data for ...) ou 0 après Mettre à jour tous les taux (Update all rates), les taux ne changent jamais d'eux-mêmes, ou ils changent mais ne correspondent pas à ce qu'affiche Google. Chacun a une cause différente, et FOX invente rarement un chiffre : il interroge un fournisseur de taux, enregistre la réponse et multiplie vos prix par ce taux. Ce guide explique le fonctionnement, la solution à chaque symptôme et la façon de reprendre la main sur les taux lorsque les taux automatiques ne vous conviennent pas.

Comment FOX met à jour les taux de change

La source des taux est l'Agrégateur de devises (Currency aggregator) dans l'onglet Options des réglages de FOX (WooCommerce → Réglages → Devise), avec sa clé dans Clé API de l'agrégateur (Aggregator API key) si le fournisseur en exige une. Pour chaque devise autre que la devise de base, FOX envoie une requête à cet agrégateur pour savoir combien d'unités de la devise s'obtiennent avec une unité de votre devise de base. Une boutique en USD avec un taux EUR de 0,92 affiche un produit à 100 USD à 92 EUR.

Les taux peuvent être mis à jour de deux manières, qui traitent différemment les échecs :

  • Mettre à jour tous les taux (Update all rates) dans l'onglet Devises (Currencies), ainsi que le bouton d'actualisation à côté de chaque taux, remplissent les champs de taux avec les réponses. Rien n'est enregistré avant que vous cliquiez sur Enregistrer. Une devise que l'agrégateur ne sait pas coter reçoit le texte de l'erreur dans son champ, et l'enregistrement de ce champ stocke 0.
  • La mise à jour planifiée définie par Mise à jour automatique des taux (Rate auto update) n'enregistre que les taux supérieurs à zéro. Une devise dont la requête échoue conserve son taux précédent, sans le signaler.

Un 0 provient donc presque toujours d'une mise à jour manuelle qui a été enregistrée, et un taux figé d'une mise à jour planifiée qui ne s'exécute pas ou qui échoue systématiquement pour cette devise.

« Aucune donnée » ou un taux de 0

Cliquez sur le bouton d'actualisation à côté de la devise et lisez le texte qui apparaît dans le champ de taux. Il nomme la cause le plus souvent :

  • L'agrégateur n'a pas de données pour cette paire. Aucun fournisseur ne couvre toutes les devises. Yahoo a des lacunes pour de nombreuses paires exotiques (le message est There is no data for these currencies: USD/XXX). La source de la Banque centrale européenne publie une trentaine de devises majeures et calcule les autres devises de base à partir de ses taux en euro. CryptoCompare couvre les cryptomonnaies mais pas toutes les devises classiques, et Pulse Verity ne gère que les cryptomonnaies, avec l'USD comme devise de base. Changez d'agrégateur et testez de nouveau.
  • Le code de devise n'est pas un vrai code. EURO, CAD$ ou un code contenant un caractère invisible copié depuis une page web ne renvoie rien, quel que soit l'agrégateur. Supprimez le code, saisissez à la main les trois lettres du code ISO 4217 et enregistrez. Une devise qui n'a réellement aucun code ISO nécessite un taux manuel ; voir les codes de devise personnalisés.
  • La clé API est absente ou incorrecte. Currencyapi, Open exchange rates, Currencylayer et Fixer exigent une clé, obtenue sur le site du fournisseur, dans Clé API de l'agrégateur (Aggregator API key). Les messages commençant par Aggregator Error: viennent du fournisseur et indiquent ce qu'il a refusé.
  • L'offre gratuite n'autorise pas votre devise de base. Plusieurs fournisseurs ne répondent aux clés gratuites que pour une seule devise de base, par exemple l'USD chez Open exchange rates et Currencylayer, et l'EUR chez Fixer. Une boutique avec une autre devise de base reçoit une erreur du type Changing the API base currency is available for ... plan clients. Passez à une offre qui l'autorise ou choisissez un autre agrégateur.
  • Le quota de requêtes est épuisé. FOX effectue une requête par devise à chaque mise à jour. Huit devises en plus de la devise de base, mises à jour toutes les heures, représentent environ 5 800 requêtes par mois, ce qui dépasse de nombreux quotas gratuits ; lorsque le quota est atteint, le fournisseur cesse de répondre. Choisissez un intervalle plus long dans Mise à jour automatique des taux (Rate auto update) pour que le total mensuel reste dans la limite.
  • Le serveur ne peut pas joindre le fournisseur. Une installation de développement locale, un pare-feu qui bloque le HTTPS sortant ou une configuration cURL ou SSL défaillante bloquent toutes les requêtes. FOX écrit ces échecs dans le journal d'erreurs PHP, sous forme de lignes commençant par [WOOCS] wp_remote_get error:.

La marche à suivre est la même dans tous les cas : corrigez le code, choisissez un agrégateur qui couvre toutes vos devises pour votre devise de base, collez sa clé, cliquez sur Mettre à jour tous les taux (Update all rates), vérifiez que chaque champ contient un nombre, et seulement ensuite cliquez sur Enregistrer.

Ne laissez jamais un taux à 0

Un taux de 0 ramène à zéro chaque prix, frais et frais de livraison dans cette devise : des produits peuvent alors être commandés gratuitement, et les calculs qui divisent par le taux peuvent interrompre la page avec une erreur fatale Division by zero. Si une devise ne peut pas être cotée automatiquement, donnez-lui un taux manuel (voir plus bas) ou supprimez-la. Pour vous protéger d'un fournisseur qui renverrait une valeur aberrante, définissez Taux plancher/plafond (Rate floor/ceiling) pour la devise dans l'onglet Devises (Currencies) : un taux récupéré inférieur au Taux minimal possible (Minimum possible rate) ou supérieur au Taux maximal possible (Maximum possible rate) est remplacé par cette limite. Les pages qui affichent des prix de 0 pour d'autres raisons sont traitées dans conversion de devise erronée : doublons, zéros et autres cas.

Les taux ne se mettent pas à jour automatiquement

Choisissez un intervalle dans Mise à jour automatique des taux (Rate auto update), de spécial : chaque minute (special: each minute) à mensuelle (monthly), puis cliquez sur Enregistrer. Le planning démarre à cet instant. Sous l'option, FOX affiche l'état du planificateur : Dernière exécution (Last run), Prochaine exécution (Next run) et l'intervalle, ou aucun planning enregistré pour l'instant (no schedule stored yet) si l'option n'a jamais été enregistrée.

Le planning est celui de FOX, pas WP-Cron, et il s'exécute à la première requête qui charge WordPress après l'échéance : une page vue, une page d'administration, une requête AJAX ou REST. Cela a trois conséquences :

  • L'heure exacte ne peut pas être fixée dans les réglages, et une mise à jour peut avoir du retard sur un site peu fréquenté. Prochaine exécution (Next run) affiche alors en retard de ..., en attente de la prochaine requête qui charge WordPress (overdue by ..., waiting for the next request that loads WordPress).
  • Les pages servies par un cache de page complet ou un CDN ne chargent pas WordPress. Un site dont les visiteurs ne reçoivent que des pages en cache peut rester longtemps sans mise à jour.
  • DISABLE_WP_CRON dans wp-config.php n'a aucun effet sur ce planning.

Pour rendre les mises à jour ponctuelles, faites en sorte qu'une tâche cron du serveur demande toutes les quelques minutes une URL non mise en cache du site, par exemple https://your-site.com/wp-cron.php ; cela charge WordPress et la mise à jour en retard s'exécute. Pour mettre à jour à heure fixe, réglez Mise à jour automatique des taux (Rate auto update) sur aucune mise à jour automatique (no auto update) et lancez l'action de mise à jour depuis le crontab du serveur avec WP-CLI à l'heure voulue :

# crontab: update FOX rates every day at 06:00 server time
0 6 * * * cd /path/to/wordpress && wp eval 'do_action("woocs_update_rates_wpcron");'

L'action est documentée sous le nom woocs_update_rates_wpcron. Si le plugin est antérieur à la version 2.5.3, mettez-le d'abord à jour : dans les anciennes versions, le planning pouvait redémarrer sans cesse sur les boutiques au trafic REST API régulier et ne jamais s'exécuter.

Comment vérifier que cela fonctionne

Un agrégateur renvoie souvent le même taux que celui d'il y a une heure, ce qui ressemble à une « absence de mise à jour ». Pour tester, saisissez un taux manifestement faux, comme 7777, dans une devise, enregistrez et attendez un intervalle : la mise à jour planifiée doit le remplacer. L'option Notification par e-mail des résultats de « Mise à jour automatique des taux » (Email notice about "Rate auto update" results) de l'onglet Options envoie à l'administrateur la liste des taux après chaque exécution planifiée. La liste présente chaque devise avec son taux actuel, y compris une devise dont la requête a échoué et qui a conservé son ancienne valeur ; elle est envoyée avec la fonction mail() de PHP, donc un plugin SMTP ne la distribue pas. Lorsqu'aucun e-mail n'arrive, la ligne Dernière exécution (Last run) est un meilleur témoin.

Conserver des taux manuels ou utiliser votre propre source

Les taux automatiques sont facultatifs. Voici les façons de reprendre le contrôle, de la plus simple à la plus souple :

  • Tous les taux à la main. Réglez Mise à jour automatique des taux (Rate auto update) sur aucune mise à jour automatique (no auto update), saisissez les taux et enregistrez. Rien ne les écrase.
  • Une devise à la main, les autres en automatique. Le filtre woocs_add_custom_rate répond pour les devises choisies avant que l'agrégateur ne soit interrogé, aussi bien dans les mises à jour planifiées que sur les boutons de mise à jour. Après l'avoir ajouté, cliquez sur Mettre à jour tous les taux (Update all rates) puis sur Enregistrer, ou attendez la prochaine exécution planifiée :
    /*
     * Fixed rate for one currency, automatic rates for the others.
     * Child theme functions.php or a code snippets plugin.
     */
    add_filter('woocs_add_custom_rate', function ($rate, $base_currency, $currency) {
        if ($currency === 'NGN') {
            return 1550; // 1 unit of the base currency = 1550 NGN
        }
        return $rate; // false: the aggregator decides
    }, 10, 3);
  • Une marge en plus du taux. Le champ d'intérêt à côté de chaque taux, dans la colonne Taux+% (Rate+%), ajoute au taux enregistré un montant fixe (0.15) ou un pourcentage entier (2%), de sorte que les mises à jour conservent votre marge. Plus de détails dans comment ajuster manuellement les taux de change.
  • Votre propre source de taux. Les filtres woocs_announce_aggregator et woocs_add_aggregator_processor ajoutent un agrégateur qui lit l'API de votre banque, un fichier XML ou un flux CSV ; le processeur est appelé une fois par devise et renvoie le taux. Comment ajouter un agrégateur de taux personnalisé propose un exemple fonctionnel. Pour la source Narodowy Bank Polsky, woocs_bank_polski_table permet de passer de la table A à une autre table.
  • Des taux écrits par votre code. Les taux sont stockés dans l'option woocs, indexés par code de devise. Lisez-la avec get_option(), et non avec $WOOCS->get_currencies(), qui renvoie les taux avec l'intérêt déjà ajouté :
    $currencies = get_option('woocs', array());
    if (isset($currencies['EUR'])) {
        $currencies['EUR']['rate'] = 0.9215;
        update_option('woocs', $currencies);
    }
    Pour réagir à chaque mise à jour planifiée, par exemple pour journaliser les taux ou les transmettre à un autre système, utilisez l'action woocs_sheduler_rates_updated, qui reçoit les devises mises à jour.

Pourquoi le taux diffère de celui de Google

FOX utilise exactement le taux renvoyé par l'agrégateur sélectionné lors de la dernière mise à jour. Google, XE et les applications bancaires affichent des taux issus de leurs propres fournisseurs de données, en général un taux moyen de marché en direct : un écart n'indique donc pas une erreur. Les raisons habituelles :

  • Des sources et des horaires différents. L'agrégateur Yahoo prend la valeur d'ouverture de la dernière barre de prix journalière, qui peut dater de plusieurs heures en fin d'après-midi. La Banque centrale européenne publie ses taux de référence une fois par jour ouvré. Les offres gratuites des autres fournisseurs sont souvent actualisées toutes les heures ou tous les jours. Des taux qui suivent le marché à quelques minutes près exigent un fournisseur et une offre qui se mettent à jour aussi souvent, ainsi qu'un intervalle adapté dans Mise à jour automatique des taux (Rate auto update).
  • Vos propres réglages. Une valeur d'intérêt dans Taux+% (Rate+%), une limite Taux plancher/plafond (Rate floor/ceiling), un filtre woocs_add_custom_rate, du code d'arrondi ou des prix fixes par devise éloignent tous le prix affiché d'une conversion simple. Vérifiez le code d'arrondi et les prix fixes du produit avant d'incriminer le taux.
  • Des prix qui changent alors que le taux reste identique. Si les prix évoluent alors que les champs de taux restent les mêmes, c'est que quelque chose d'autre convertit ou modifie les prix : un second plugin de devises, un plugin de tarification dynamique ou un cache de page qui sert une ancienne page.

Pour aligner les taux, choisissez l'agrégateur dont les chiffres correspondent à la référence en laquelle vous avez confiance, mettez à jour plus souvent dans la limite de son quota, ou fixez le taux à la main pour les devises où l'écart compte.

Checklist

  • Chaque code de devise est un simple code ISO de trois lettres, saisi à la main.
  • L'agrégateur couvre toutes vos devises pour votre devise de base, et sa clé ainsi que son offre autorisent cette devise de base.
  • Mettre à jour tous les taux (Update all rates) remplit chaque champ avec un nombre avant que vous cliquiez sur Enregistrer ; aucun taux n'est à 0.
  • Mise à jour automatique des taux (Rate auto update) enregistrée, Dernière exécution (Last run) récente, et nombre de requêtes par mois dans la limite du quota du fournisseur.
  • Sur un site entièrement en cache, une tâche cron du serveur demande une URL non mise en cache.
  • Plancher et plafond définis pour les devises où un taux erroné serait dommageable.

Si une devise refuse toujours de se mettre à jour avec un code correct et un agrégateur fonctionnel, ouvrez un sujet sur le forum de support de FOX en indiquant la devise de base, l'agrégateur, le texte affiché dans le champ de taux et les éventuelles lignes [WOOCS] du journal d'erreurs PHP, et nous l'examinerons.