WooCommerce & WPML : Définir la devise selon l'adresse de l'utilisateur ou sa géolocalisation

WooCommerce & WPML : Définir la devise selon l'adresse de l'utilisateur ou sa géolocalisation

Tech web
Cloche d'abonnement aux notifications | |
  • Recevoir les notifications

Le code de cet article a été testé sur WordPress 5.3, WooCommerce 3.8, WPML 4.3.4

Lorsque l'on parle de site multilangue sur WordPress, on se doit de mentionner l'un des plus reconnus : WPML. Très complet, ce plugin (payant) se combine parfaitement avec WooCommerce (plugin e-commerce) en permettant de traduire les produits, les catégories de produits, mais aussi de gérer les devises.

Toutefois, WPML n'offre pas (pour le moment) la possibilité de définir la devise selon l'adresse entrée par l'utilisateur dans WooCommerce, ni selon la géolocalisation (en se basant sur le navigateur du visiteur). En parcourant les questions abordant le sujet dans le forum du support du plugin, on se rend compte que cette fonctionnalité devrait entrer prochainement dans leur "pipeline". Mais pour l'instant, aucune date n'a été prononcée. C'est pourquoi, le code qui ci-dessous pourrait vous être fort utile.

Veuillez noter que le code décrit dans cet article tient particulièrement compte du cas de la Suisse et comporte uniquement les devises "CHF, EUR, USD". Libre à vous d'ajouter d'autres devises ou de modifier le code selon vos besoins.

La géolocalisation

Nous allons commencer par écrire une petite fonction dans le fichier function.php de votre thème enfant (child theme) qui nous retournera le pays détecté par le navigateur selon WooCommerce :

// Obtenir la géolocalisation de l'utilisateur
function get_geolocated_user_country() {
 
  // La Géolocalisation doit être activée dans les Paramètres WooCommerce
  $location = WC_Geolocation::geolocate_ip();
  $country = $location['country'];
   
  return $country;
}

 

La devise selon le pays

Toujours dans le fichier function.php, nous allons utiliser un "filtre" (filter) fourni par WPML (plus précisément WCML) qui nous permettra de choisir la devise qui sera affichée par défaut lors du chargement d'une page dans notre sélecteur de devise.

Le but de la manoeuvre, dans notre cas, est de vérifier si le client doit voir les prix s'afficher en EUR, en CHF ou en USD selon le pays depuis lequel il visite le site. On crée en premier un tableau avec la liste des pays qui paient en Euros. On saura ainsi que si le pays du visiteur est dans cette liste, il faudra lui fournir un affichage en Euros. S'il n'est pas dans cette liste, il aura droit a un affichage en USD. Finalement, si son pays est "CH" (code ISO de la Suisse), l'affichage des prix sera en CHF.

Mais comment savoir de quel pays provient l'utilisateur ? Nous allons le faire en récupérant 3 informations différentes qui seront utilisées dans un ordre de priorité bien précis. En premier lieu, nous allons vérifier si l'utilisateur est connecté. Si c'est le cas, nous allons utiliser en priorité l'adresse de livraison (Shipping address). Si elle n'a pas été entrée, nous utiliserons alors l'adresse de facturation (Billing Address).

Si l'utilisateur n'est pas connecté, ou que ni l'adresse de livraison, ni l'adresse de facturation sont disponibles, nous utiliserons la géolcalication via le navigateur du visiteur.

// Définir la devise dans laquelle les prix seront affichés selon le pays de l'utilisateur
function set_currency($client_currency){

  // Liste des pays qui ont pour devise EUR
  $EURCountries = array(
    'AT','BE','BG','HR','CY','CZ','DK','EE','FI','FR','DE','GR','HU','IE','IT','LV','LT','LU','MT','NL','PL','PT','RO','SK','SI','ES','SE','GB'
  );
  
  // Vérifier si l'utilisateur est connecté et s'il n'est pas dans l'administration. Si c'est le cas, vérifier s'il a entré un pays dans son compte 
  if ( is_user_logged_in() && !is_admin() ) {
    $userShippingAddress = WC()->customer->get_shipping_country();
    $userBillingAddress = WC()->customer->get_billing_country();
  }

  // Si l'utilisateur a entré un pays en Shipping Address, utiliser celui-ci. Si ce n'est pas le cas, utiliser celui de Billing Address s'il existe et sinon utiliser la géolocalisation
  if ( isset($userShippingAddress) && !empty($userShippingAddress) ) {
    $userCountry = $userShippingAddress;
  } else if ( isset($userBillingAddress) && !empty($userBillingAddress) ) {
    $userCountry = $userBillingAddress;
  } else {
    // Si le pays n'a pas été spécifié par l'utilisateur dans son compte, utiliser la géolocalisation WooCommerce
    $userCountry = get_geolocated_user_country();
  }

  // Tous ceux qui ne sont pas suisses ou européens voient les prix USD, les suisses en CHF et les européens en EUR
  if ( $userCountry != 'CH' && !in_array( $userCountry, $EURCountries )) {
    $client_currency = 'USD';
  } else if ( in_array( $userCountry, $EURCountries ) ) {
    $client_currency = 'EUR';
  } else {
    $client_currency = 'CHF';
  }

  return $client_currency;
}

add_filter('wcml_client_currency','set_currency');

 

Conclusion

Et voilà ! Si vous voulez que l'utilisateur ne puisse plus changer la devise par lui-même, je vous laisse cacher les sélecteurs que vous auriez affichés. Pour cacher celui qui se trouve dans le détail des produits, il suffit de décocher la case "Show a currency selector on the product page template" dans les paramètres de WPML, onglet "Multi-currency".

Une toute dernière chose, je tiens à préciser que cet article n'est en rien sponsorisé par WPML. Donc si vous avez d'autres solutions avec d'autres plugins à proposer, je vous écoute volontiers. Sait-on jamais, peut-être qu'elles feront l'objet d'un autre article ;)

 

Sources

WPML

WooCommerce

Catégories :
Tech web

Tags :
PHP Wordpress WooCommerce

Vous avez aimé cet article ? Suivez-nous sur Facebook pour ne rien manquer !