Définir un lien A et la redirection d’un bouton selon la localisation IP

Auteur:Lisa Farrell · 2026-01-19

Certains cas d’usage ne visent pas à « interdire l’accès », mais à mettre en place un « routage par région » plus léger : sur une même page, les utilisateurs venant de pays/régions différents doivent être envoyés vers des URL cibles différentes lorsqu’ils cliquent sur un lien ou un bouton. Ce routage est généralement utilisé pour : répartir des URL de téléchargement, proposer des entrées de paiement différentes selon la région, pointer vers différents systèmes de support, ou basculer entre des sites (international/local), etc.

Cet article ne traite que d’un point central : au chargement de la page, le frontend envoie GET https://my.ipin.io/info pour obtenir le code pays country du visiteur, puis définit le href d’un <a> ou l’URL de redirection au clic d’un <button> vers l’URL correspondant à la région. Par exemple, l’API peut renvoyer :

{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}

1)Logique et principe de fonctionnement (2 paragraphes)

Premier paragraphe : flux
Chargement de la page → le frontend appelle immédiatement https://my.ipin.io/info → récupère country → sélectionne l’URL cible selon tes règles (par exemple TW utilise l’URL A n°1, US utilise l’URL A n°2, les autres régions utilisent une URL par défaut) → met à jour la « destination » du lien ou du bouton avec l’URL cible. L’utilisateur n’est dirigé vers l’adresse correspondante qu’au moment où il clique.

Deuxième paragraphe : pourquoi il est recommandé de définir d’abord une URL par défaut puis de la remplacer selon la région
Parce que l’environnement frontend est instable : le réseau, CORS, des extensions de blocage de publicité, ou des timeouts d’API peuvent empêcher d’obtenir country. Une approche plus robuste consiste à : définir d’abord sur la page une URL utilisable par défaut (une landing page générique), puis, une fois la région déterminée, la remplacer par une URL spécifique à la région. Ainsi, même si l’API échoue, la page peut toujours rediriger normalement, et tu évites les problèmes « clic sans réaction / URL vide ».

2)Implémentation du code (super simple, A et button expliqués séparément)

2.1 Lien A (avec id) : définir href selon country

Scénario : il n’y a qu’un lien clé sur la page, et tu veux qu’il pointe vers des adresses différentes selon la région. L’exemple ci-dessous montre la logique la plus simple : si c’est TW, utiliser le lien TW ; sinon utiliser le lien par défaut.

<a id="geoLink" href="https://example.com/default">Aller maintenant</a>

<script>
(async function () {
  try {
    const info = await fetch("https://my.ipin.io/info").then(r => r.json());
    const target = (info.country === "TW")
      ? "https://example.com/tw"
      : "https://example.com/default";

    const a = document.getElementById("geoLink");
    if (a) a.href = target;
  } catch (e) {
    // En cas d’échec, conserver le href par défaut
  }
})();
</script>

2.2 Liens A (avec class) : définir href en lot selon country

Scénario : plusieurs liens sur la page doivent être routés par région. La méthode la plus simple : leur donner la même class, puis les mettre à jour en une fois. L’exemple reste minimal : TW utilise le lien TW, les autres régions utilisent le lien par défaut.

<a class="geo-link" href="https://example.com/default">Entrée téléchargement</a>
<a class="geo-link" href="https://example.com/default">Entrée achat</a>

<script>
(async function () {
  try {
    const info = await fetch("https://my.ipin.io/info").then(r => r.json());
    const target = (info.country === "TW")
      ? "https://example.com/tw"
      : "https://example.com/default";

    document.querySelectorAll(".geo-link").forEach(function (el) {
      el.href = target;
    });
  } catch (e) {}
})();
</script>

2.3 Button (avec id) : rediriger après clic selon country

Scénario : un bouton n’est pas un lien en soi, il faut donc lier un événement de clic côté frontend. L’exemple ci-dessous garde uniquement la logique essentielle : d’abord choisir l’URL cible selon country, puis rediriger vers cette URL au clic du bouton.

<button id="geoBtn" type="button">Cliquer pour rediriger</button>

<script>
(async function () {
  let target = "https://example.com/default"; // URL par défaut

  try {
    const info = await fetch("https://my.ipin.io/info").then(r => r.json());
    if (info.country === "TW") target = "https://example.com/tw";
  } catch (e) {
    // En cas d’échec, utiliser l’URL par défaut
  }

  const btn = document.getElementById("geoBtn");
  if (btn) btn.onclick = function () { window.location.href = target; };
})();
</script>

2.4 Buttons (avec class) : lier les redirections au clic en lot

Scénario : plusieurs boutons sur la page doivent rediriger selon la région. La méthode la plus simple : une class commune, puis lier l’événement de clic dans une boucle. Remarque : un bouton n’a pas de « href par défaut », il est donc recommandé de préparer une URL par défaut dans le script, afin d’éviter un bouton « sans réaction » quand l’API échoue.

<button class="geo-btn" type="button">Bouton 1</button>
<button class="geo-btn" type="button">Bouton 2</button>

<script>
(async function () {
  let target = "https://example.com/default"; // URL par défaut

  try {
    const info = await fetch("https://my.ipin.io/info").then(r => r.json());
    if (info.country === "TW") target = "https://example.com/tw";
  } catch (e) {}

  document.querySelectorAll(".geo-btn").forEach(function (btn) {
    btn.onclick = function () { window.location.href = target; };
  });
})();
</script>

2.5 Multi-régions (TW, US…) : « définir directement l’URL cible » avec une table de mapping (version la plus courte utilisable)

La règle la plus simple : préparer d’abord une URL par défaut, puis l’écraser via une table de mapping map selon le code pays. S’il y a un mapping, on l’utilise ; sinon, on garde le défaut. Le point clé : une fois target calculé, il faut immédiatement l’appliquer au href d’un lien A ou au gestionnaire de clic d’un bouton.

2.5.1 Pour un lien A (id) : définir href directement

<a id="geoLink" href="https://example.com/default">Aller maintenant</a>

<script>
(async function () {
  const defaultUrl = "https://example.com/default";
  const map = { TW: "https://example.com/tw", US: "https://example.com/us" };

  try {
    const info = await fetch("https://my.ipin.io/info").then(r => r.json());
    const target = map[info.country] || defaultUrl;

    document.getElementById("geoLink").href = target; // ✅ Clé : écrire target dans href
  } catch (e) {
    // En cas d’échec, on garde le href par défaut
  }
})();
</script>

2.5.2 Pour un bouton (id) : naviguer vers target au clic

<button id="geoBtn" type="button">Cliquer pour aller</button>

<script>
(async function () {
  const defaultUrl = "https://example.com/default";
  const map = { TW: "https://example.com/tw", US: "https://example.com/us" };
  let target = defaultUrl;

  try {
    const info = await fetch("https://my.ipin.io/info").then(r => r.json());
    target = map[info.country] || defaultUrl;
  } catch (e) {}

  document.getElementById("geoBtn").onclick = function () {
    window.location.href = target; // ✅ Clé : naviguer avec target au clic
  };
})();
</script>

3)Implémentation dans WordPress / Joomla / Magento / Shopify, etc. (approche frontend + code)

Pour ce type de « changement de destination de lien A / destination de redirection de button selon la région », l’essentiel est d’insérer le script dans le Head global ou le fichier de layout du site afin qu’il s’exécute le plus tôt possible. Tu n’as pas besoin de modifier la logique côté serveur : tant que le script s’exécute au chargement, tu peux préparer la destination avant que l’utilisateur ne clique.

3.1 WordPress

  • Utiliser un plugin “insertion de scripts header/footer” et coller le script dans le Header (global)
  • Ou insérer le script avant </head> dans le fichier de thème header.php

3.2 Joomla! / Joomla

  • Dans le template courant index.php, trouver <head> et coller le script avant </head>
  • Ou utiliser l’entrée “code head personnalisé” fournie par le template (selon le template)

3.3 Magento

  • Ajouter le script dans le head global du thème (zone head du theme/layout)
  • L’objectif est un affichage global sur tout le site pour maintenir facilement les règles de mapping par région

3.4 Shopify

  • Online Store → Themes → Edit code
  • Trouver theme.liquid et coller le script avant </head> (global)

3.5 Règle générale

  • Tout système permettant d’éditer le <head> global ou le fichier de layout peut mettre en œuvre « définir la destination des liens/boutons selon la région IP » de la même manière
  • Conserver une URL par défaut pour que la page reste utilisable si l’API externe échoue

4)Résumé

> Au chargement de la page, on appelle https://my.ipin.io/info pour obtenir country, puis on choisit une URL cible selon country et on met à jour soit le href du lien A, soit l’URL de redirection au clic du bouton, afin de réaliser une solution frontend de « routage vers des destinations différentes selon la région IP ».

En pratique, les deux points les plus importants sont : premièrement, placer le script le plus tôt possible dans le head pour préparer rapidement la destination ; deuxièmement, toujours prévoir une URL par défaut afin d’éviter des liens invalides ou des boutons sans réponse en cas d’échec de l’API. Tant que tu maintiens correctement tes règles de mapping par région, cette solution fonctionnera de manière stable pour les entrées de téléchargement, de paiement et de support.

5)Questions fréquentes

Q1:Pourquoi le bouton ne redirige pas quand je clique ?
Les causes courantes sont que le script ne s’exécute pas ou que la requête API échoue. Il est conseillé de préparer une URL par défaut (c’est déjà le cas dans les exemples) et, pendant le développement, d’utiliser temporairement console.log(info) pour vérifier si country a bien été récupéré.
Q2:Pourquoi recommande-t-on de définir d’abord un href par défaut pour le lien A ?
Parce que même si la détection de région échoue, l’utilisateur peut toujours naviguer via le lien par défaut. Sinon, tu risques : « API en échec → lien non mis à jour → utilisateur sans destination ».
Q3:Le bouton peut-il s’ouvrir dans une nouvelle fenêtre ?
Oui. Remplace window.location.href = target par window.open(target, "_blank"). En général, cela n’est pas bloqué par le navigateur lorsqu’il est déclenché dans un événement de clic.
Q4:Et si je dois prendre en charge plusieurs régions comme TW, US, JP ?
Une table de correspondance est l’approche la plus simple à maintenir : { TW: "...", US: "..." }. S’il y a une correspondance, on utilise l’URL correspondante ; sinon on utilise l’URL par défaut.
Q5:Est-ce que CORS peut affecter cette solution ?
Oui. Si le navigateur ne peut pas lire le JSON de https://my.ipin.io/info à cause de CORS, il ne peut pas récupérer country et finira par utiliser l’URL par défaut. Avant la mise en production, il est recommandé de vérifier dans la console que la requête réussit.