La géolocalisation WooCommerce affiche la mauvaise devise : checklist
Lorsque la géolocalisation WooCommerce affiche la mauvaise devise, les règles GeoIP de FOX sont rarement la partie défaillante. La devise d'un nouveau visiteur est le bout d'une courte chaîne : WooCommerce détermine le pays à partir de l'adresse IP, FOX cherche ce pays dans ses règles GeoIP, et le résultat est enregistré pour le visiteur. Une mauvaise devise signifie qu'un maillon de la chaîne a cédé : le pays n'a pas été détecté, le pays a été détecté mais ne correspond à aucune règle, ou le visiteur n'a jamais atteint le code parce qu'un cache a répondu avant. Les vérifications ci-dessous permettent de trouver de quel maillon il s'agit, dans cet ordre.
Comment FOX choisit la devise d'un nouveau visiteur
FOX n'a pas de base de géolocalisation propre. Il appelle WC_Geolocation::geolocate_ip(), la fonction que WooCommerce utilise pour les estimations de taxes et de livraison, et reçoit en retour un code pays à deux lettres. Il parcourt ensuite les listes de l'onglet GeoIP de ses réglages (WooCommerce → Réglages → Devise) : la première devise dont la liste contient ce pays devient la devise du visiteur. Si aucune liste ne le contient, le visiteur reste sur la Devise d'accueil (Welcome currency) de l'onglet Options. La configuration des règles depuis zéro est décrite dans changer automatiquement de devise selon le pays ; cette page explique comment trouver pourquoi elles ne fonctionnent pas.
Trois points de cette logique expliquent la plupart des signalements « cela ne fonctionne pas » :
- Les règles s'appliquent une seule fois, à la première visite. Ensuite, FOX enregistre la devise du visiteur et l'utilise sur chaque page : un visiteur qui a changé de devise à la main conserve donc son choix. Modifier les règles par la suite n'affecte pas les visiteurs qui ont déjà une devise enregistrée.
- La première visite est marquée comme utilisée même si aucun pays n'a été détecté. Si la toute première page vue n'a pas pu géolocaliser le visiteur, les règles ne sont pas réessayées à la deuxième page. Le visiteur reste sur la devise d'accueil jusqu'à l'expiration de ses données enregistrées.
- La décision est prise en PHP, pendant que WordPress construit la page. Une page servie sous forme de HTML fini depuis un cache ne l'exécute pas.
Étape 1 : voir ce que WooCommerce détecte
Créez une page en brouillon avec ces deux shortcodes et excluez-la de tous les caches (plugin de cache, cache du serveur, CDN) :
[woocs_geo_hello] [woocs_show_current_currency]
[woocs_geo_hello] demande à WooCommerce le pays de la requête en cours et affiche Your country is: ..., ou Your country is not defined! Troubles with GeoIp service. lorsque WooCommerce ne renvoie rien. [woocs_show_current_currency] affiche la devise que FOX utilise pour vous. La page doit rester hors cache : une copie en cache affiche le pays de la première personne qui l'a chargée.
Ouvrez la page comme un véritable nouveau visiteur. Une fenêtre privée n'y suffit pas toujours, car ce qui compte comme « nouveau » dépend du Stockage de la devise (Currency storage) dans l'onglet Options :
- PHP Session et FOX Session conservent les données derrière un cookie du navigateur : une nouvelle fenêtre privée est donc un nouveau visiteur.
- Transient, Memcached et Redis identifient les données par l'adresse IP. Tous les navigateurs d'une même connexion sont le même visiteur, et une adresse VPN que vous ou quelqu'un d'autre avez déjà utilisée pour un test n'est pas nouvelle non plus. Testez depuis une autre connexion, par exemple un téléphone en données mobiles, ou passez à PHP Session pendant vos tests.
| Ce qu'affiche la page de test | Où se situe le problème |
|---|---|
| Pays non défini | WooCommerce ne parvient pas du tout à géolocaliser |
| Un mauvais pays, souvent celui de la boutique ou du serveur | Une mauvaise adresse IP parvient à WooCommerce, ou le serveur met la localisation en cache |
| Bon pays, mauvaise devise, lors d'une toute nouvelle visite | Les règles GeoIP |
| Bon pays et bonne devise ici, mauvaise devise sur les pages de la boutique | Cache de page |
Aucun pays, ou le mauvais pays
Cette partie relève de WooCommerce et du serveur, et FOX ne peut utiliser que ce qu'ils renvoient.
MaxMind n'est pas configuré
WooCommerce recherche l'adresse IP dans la base gratuite MaxMind GeoLite2, qu'il ne télécharge que si vous lui fournissez une clé. Créez un compte MaxMind gratuit, générez une clé et collez-la dans WooCommerce → Réglages → Intégration → Géolocalisation MaxMind (MaxMind Geolocation). Réglez Emplacement par défaut du client (Default customer location) dans WooCommerce → Réglages → Général sur l'une des deux options Géolocaliser (Geolocate), car WooCommerce ne télécharge et ne met à jour la base que lorsque la géolocalisation est utilisée. Sans la base, WooCommerce se rabat sur des services de recherche publics avec un délai d'attente de deux secondes, ce qui peut expliquer un pays détecté sur certaines requêtes et absent sur d'autres.
Le serveur transmet sa propre adresse IP
WooCommerce prend l'adresse du visiteur d'abord dans l'en-tête X-Real-IP, puis dans la première adresse de X-Forwarded-For, puis dans REMOTE_ADDR. Derrière un proxy inverse, un répartiteur de charge ou Varnish, ces valeurs peuvent contenir l'adresse du proxy, et tous les visiteurs sont alors placés dans le pays du centre de données. Derrière Cloudflare, la solution la plus simple est le réglage Géolocalisation IP (IP Geolocation) de Cloudflare : il ajoute un en-tête CF-IPCountry, et WooCommerce lit un pays dans cet en-tête avant de regarder une adresse IP. Sinon, le serveur doit rétablir l'adresse réelle ; sur nginx, il s'agit des directives real_ip_header et set_real_ip_from, que votre hébergeur peut définir.
Pour voir quelle adresse WooCommerce reçoit, ajoutez ce shortcode temporaire et placez [geo_debug] sur la page de test hors cache :
/*
* Temporary geolocation check. Child theme functions.php or a code snippets plugin.
* Remove it when you are done.
*/
add_shortcode('geo_debug', function () {
if (!class_exists('WC_Geolocation')) {
return '';
}
$geo = WC_Geolocation::geolocate_ip();
return 'IP seen by WooCommerce: ' . esc_html(WC_Geolocation::get_ip_address())
. '<br>Country: ' . esc_html($geo['country']);
});
Si l'IP est celle de votre serveur ou toujours la même adresse quelle que soit la personne qui ouvre la page, le proxy est en cause.
L'hébergeur met la localisation en cache
Certains hébergeurs gérés exploitent leur propre cache de page ou cache « dynamique » devant WordPress, et certains mettent en cache la localisation détectée page par page. La page de test affiche alors le même pays à tous les visiteurs, même si aucun plugin de cache n'est installé. Demandez à l'hébergeur d'exclure vos pages de cette couche ou de la faire varier selon le pays, ou testez avec elle désactivée pour confirmer.
Bon pays, mauvaise devise : les règles GeoIP
Lorsque la page de test affiche le bon pays lors d'une toute nouvelle visite et que la devise reste incorrecte, ouvrez l'onglet GeoIP :
- Des listes vides. Si aucune devise n'a de pays assignés, FOX ne change jamais de devise selon la localisation et chaque visiteur reçoit la devise d'accueil.
- Un pays dans deux listes. FOX retient la première devise, dans l'ordre de l'onglet Devises (Currencies), dont la liste contient le pays. Un pays laissé dans la liste USD garde ces visiteurs en USD, quelle que soit l'autre devise à laquelle il est assigné. Cliquer sur Tout sélectionner (Select all) pour une devise, puis assigner des pays à d'autres, est un moyen facile d'en arriver là.
- Un pays qui ne figure dans aucune liste. Livrer vers un nouveau marché ne l'ajoute pas aux règles ; ajoutez-le à la bonne devise.
- Une règle pour une devise qui n'est plus dans la boutique. Les règles sont enregistrées par code de devise. Après la suppression ou le renommage d'une devise dans l'onglet Devises (Currencies), une règle orpheline pointe vers un code vers lequel FOX ne peut pas basculer, et ces visiteurs reçoivent la devise de base. Enregistrer de nouveau les réglages réécrit les règles uniquement pour les devises actuelles.
- Le profil intégré Pays de l'UE (EU countries). Il liste la Pologne sous le code
PO, qui n'est pas un code pays : appliquer ce profil laisse donc la Pologne de côté. Ajoutez-la à la main.
Deux autres causes se trouvent hors des règles. Un code personnalisé qui appelle $WOOCS->set_currency() sur chaque page, par exemple dans wp_head, remplace le choix GeoIP ; cherchez-le dans le thème et les snippets. Et une liste déroulante de devises créée par le thème ou un constructeur de pages n'est pas le sélecteur FOX et peut tout simplement ne pas refléter la devise active ; utilisez le shortcode [woocs] pour comparer.
La géolocalisation affiche la mauvaise devise uniquement sur les pages en cache
Un cache de page complet stocke une copie finie d'une page et la distribue à tout le monde : la devise du premier visiteur est donc montrée au suivant, et le code GeoIP ne s'exécute jamais pour le visiteur qui a reçu la copie. Pourquoi un sélecteur de devises et un cache de page se battent explique ce conflit en détail ; pour la géolocalisation, ces quatre réglages fonctionnent ensemble :
- Emplacement par défaut du client (Default customer location) = Géolocaliser (avec prise en charge de la mise en cache des pages) (Geolocate (with page caching support)). WooCommerce redirige alors vers des URL avec une clé
?v=construite à partir de la localisation du visiteur, de sorte qu'un cache qui identifie les pages par l'URL complète stocke une copie distincte pour chaque localisation, générée par un visiteur de cette localisation. Le cache ne doit pas ignorer le paramètre de requêtev. - J'utilise un plugin de cache sur mon site (I am using cache plugin on my site) dans l'onglet Options de FOX. Une fois la page en cache chargée, le plugin demande au serveur la devise enregistrée du visiteur et, si elle diffère de celle du HTML en cache, redessine les prix.
- Un stockage que le cache ne peut pas partager entre les visiteurs. Avec PHP Session, ajoutez le cookie
PHPSESSIDà la liste des cookies « ne jamais mettre en cache » du plugin de cache ; avec FOX Session, le cookie qui commence parwp_woocs_session_. Avec un CDN devant le site, Transient associé à l'option de cache évite complètement les cookies. - Les pages panier, paiement et compte exclues du cache, y compris les pages de paiement personnalisées créées par un thème ou un plugin d'entonnoir de vente.
Une limite de FOX 2.5.5 compte ici : la requête de redessin compare la devise de la copie en cache avec la devise actuelle du visiteur avant d'atteindre l'étape GeoIP. Un nouveau visiteur démarre dans la Devise d'accueil (Welcome currency) ; sur les pages mises en cache dans la Devise d'accueil (Welcome currency), les règles GeoIP sont donc ignorées et le visiteur la conserve. L'article sur Cloudflare APO fournit un court snippet qui exécute d'abord l'étape GeoIP ; il fonctionne avec n'importe quel cache de page, pas seulement Cloudflare.
Pour WP Rocket en particulier, FOX et WP Rocket liste les exclusions de scripts nécessaires. Pour confirmer que le cache est bien la cause, purgez toutes les couches (plugin, serveur, CDN), désactivez le cache le temps d'un test et refaites le test de première visite.
Utilisateurs de VPN, villes frontalières et pays de facturation
La géolocalisation IP indique d'où sort la connexion, pas où habite le client. Un VPN, un réseau d'entreprise, un opérateur mobile qui passe par un pays voisin ou une ville proche d'une frontière produisent tous le « mauvais » pays, et WooCommerce le rapporte correctement du point de vue de l'adresse IP. Les VPN gratuits sont particulièrement peu fiables pour les tests, et une adresse VPN déjà utilisée par quelqu'un n'est pas une première visite pour un stockage basé sur l'IP.
Lorsque la devise doit correspondre au client plutôt qu'à la connexion, décidez-la au paiement d'après l'adresse que le client saisit. Changer de devise selon l'adresse de facturation plutôt que la géolocalisation propose du code prêt à l'emploi pour cela, et changer de devise selon le pays de livraison fait la même chose pour le pays de livraison. Si vous utilisez des prix fixes par devise, l'option Paiement selon les règles GeoIP (Checkout by GeoIP rules) de l'onglet Avancé (Advanced) fait au contraire utiliser au paiement la devise GeoIP du pays du visiteur, quelle que soit celle qu'il a sélectionnée pendant sa navigation.
Checklist
- La page de test hors cache affiche le bon pays pour un tout nouveau visiteur.
- Clé MaxMind enregistrée, Emplacement par défaut du client (Default customer location) réglé sur une option Géolocaliser (Geolocate).
- Derrière un proxy ou un CDN, l'IP réelle du visiteur ou un en-tête de pays parvient à WordPress.
- Chaque pays cible figure dans une seule liste GeoIP, et cette devise existe dans la boutique.
- Avec un cache de page : Géolocaliser (avec prise en charge de la mise en cache des pages) (Geolocate (with page caching support)), J'utilise un plugin de cache sur mon site (I am using cache plugin on my site), un stockage par visiteur et le paiement exclu du cache.
- Tests effectués comme un nouveau visiteur pour le stockage que vous utilisez, et non dans un navigateur qui a déjà une devise enregistrée.
Si la page de test affiche le bon pays pour un nouveau visiteur et que la devise reste incorrecte avec les caches désactivés, ouvrez un sujet sur le forum de support de FOX avec le lien de la page de test, vos règles GeoIP et le réglage de stockage, et nous l'examinerons.