Настройка ссылки A и перехода по кнопке (button) по IP-локации

Автор:Lisa Farrell · 2026-01-19

В некоторых сценариях нужно не «запретить доступ», а сделать более лёгкое «гео-разветвление»: на одной и той же странице пользователи из разных стран/регионов при клике по ссылке или кнопке должны попадать на разные целевые адреса. Обычно такое разветвление используют для: распределения ссылок на скачивание, разных платежных входов по регионам, разных систем поддержки, переключения входов на разные сайты (международный/локальный) и т. д.

Эта статья объясняет только одну ключевую вещь: при загрузке страницы фронтенд делает запрос GET https://my.ipin.io/info, чтобы получить код страны посетителя country, а затем устанавливает href у <a> или адрес перехода по клику у <button> на URL, соответствующий региону. Например, интерфейс может вернуть:

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

1)Логика и принцип работы(2 абзаца)

Первый абзац: поток
Загрузка страницы → фронтенд сразу запрашивает https://my.ipin.io/info → получает country → по вашим правилам выбирает целевой URL (например, для TW использовать адрес A 1, для US — адрес A 2, для других регионов — адрес по умолчанию) → обновляет «назначение» ссылки или кнопки на выбранный целевой URL. Пользователь перейдёт на нужный адрес только в момент клика.

Второй абзац: почему лучше сначала задать URL по умолчанию, а затем перезаписать по региону
Потому что фронтенд-среда нестабильна: сеть, CORS, блокировщики рекламы, таймауты API могут привести к тому, что country не получится получить. Более надёжный подход такой: сначала на странице указать рабочий URL по умолчанию (универсальный лендинг), а после успешного определения региона — заменить его на региональный URL. Тогда даже при сбое интерфейса страница всё равно сможет корректно перейти, и не возникнет проблем «нажал — ничего не произошло / адрес пустой».

2)Реализация кода(супер просто,A и button объясняются отдельно)

2.1 Ссылка A(используем id):установить href по country

Сценарий: на странице есть одна ключевая ссылка, и вы хотите, чтобы она вела на разные адреса по региону. Ниже — самая простая логика: если TW, использовать ссылку для TW, иначе — ссылку по умолчанию.

<a id="geoLink" href="https://example.com/default">Перейти сейчас</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) {
    // При ошибке сохраняем href по умолчанию
  }
})();
</script>

2.2 Ссылки A(используем class):массово установить href по country

Сценарий: на странице несколько ссылок, и все они должны разветвляться по регионам. Самый простой способ — дать им один и тот же class и обновить разом. Пример остаётся максимально простым: TW использует TW-ссылку, остальные регионы — ссылку по умолчанию.

<a class="geo-link" href="https://example.com/default">Вход на скачивание</a>
<a class="geo-link" href="https://example.com/default">Вход на покупку</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(используем id):переход по клику в зависимости от country

Сценарий: кнопка сама по себе не является ссылкой, поэтому нужно привязать обработчик клика во фронтенде. Ниже — только самая суть: сначала выбираем целевой URL по country, затем при клике переходим на этот URL.

<button id="geoBtn" type="button">Нажмите для перехода</button>

<script>
(async function () {
  let target = "https://example.com/default"; // URL по умолчанию

  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) {
    // При ошибке используем URL по умолчанию
  }

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

2.4 Button(используем class):массово привязать переход по клику

Сценарий: на странице несколько кнопок, и всем нужен переход по региону. Самый простой вариант — общий class и цикл для привязки обработчиков клика. Важно: у кнопки нет «href по умолчанию», поэтому рекомендуется заранее подготовить URL по умолчанию в скрипте, чтобы при сбое интерфейса кнопка не была «без реакции».

<button class="geo-btn" type="button">Кнопка 1</button>
<button class="geo-btn" type="button">Кнопка 2</button>

<script>
(async function () {
  let target = "https://example.com/default"; // URL по умолчанию

  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 Несколько регионов(TW、US…):«сразу установить целевой URL» через таблицу соответствий (самый короткий рабочий вариант)

Самое простое правило: сначала задайте URL по умолчанию, затем перезапишите его таблицей соответствий map по коду страны. Есть соответствие — используем его, нет — используем дефолт. Ключевой момент: после вычисления target нужно сразу применить его к href ссылки A или к обработчику клика кнопки.

2.5.1 Для A-ссылки(id):установить href напрямую

<a id="geoLink" href="https://example.com/default">Перейти сейчас</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; // ✅ Ключ: записать target в href
  } catch (e) {
    // При ошибке оставляем href по умолчанию
  }
})();
</script>

2.5.2 Для кнопки(id):переходить на target при клике

<button id="geoBtn" type="button">Нажмите для перехода</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; // ✅ Ключ: переходить с target при клике
  };
})();
</script>

3)Реализация в WordPress / Joomla / Magento / Shopify и т. д.(фронтенд-подход + код)

Реализация «менять назначение A-ссылки / назначения перехода кнопки по региону» по сути сводится к тому, чтобы вставить скрипт в общий Head сайта или файл шаблона/лейаута, чтобы он выполнялся как можно раньше. Не нужно менять серверную логику: если скрипт запускается при загрузке страницы, то до клика пользователя можно подготовить правильное назначение.

3.1 WordPress

  • Использовать плагин «вставка скриптов в header/footer» и вставить код в Header(на весь сайт)
  • Или вставить скрипт перед </head> в файле темы header.php

3.2 Joomla! / Joomla

  • В текущем шаблоне найти <head> в index.php и вставить скрипт перед </head>
  • Или использовать встроенную опцию шаблона «пользовательский код в head»(в зависимости от шаблона)

3.3 Magento

  • Добавить скрипт в глобальный head темы(область head в theme/layout)
  • Цель — единый вывод на весь сайт, чтобы удобно поддерживать правила маппинга по регионам

3.4 Shopify

  • Online Store → Themes → Edit code
  • Найти theme.liquid и вставить скрипт перед </head>(на весь сайт)

3.5 Общие правила

  • Любая система, где можно редактировать общий <head> или файл лейаута, может реализовать «назначение ссылок/кнопок по IP-региону» тем же способом
  • Сохраняйте URL по умолчанию, чтобы при сбое внешнего API страница оставалась работоспособной

4)Итоги

> При загрузке страницы запрашиваем https://my.ipin.io/info, получаем country, затем по country выбираем целевой URL и обновляем либо href у A-ссылки, либо адрес перехода по клику кнопки, тем самым реализуя фронтенд-решение «гео-разветвления по IP на разные назначения».

На практике важны две вещи: во-первых, размещайте скрипт как можно раньше в head, чтобы заранее подготовить назначение; во-вторых, всегда держите URL по умолчанию, чтобы при сбое API не получить нерабочие ссылки или «молчащие» кнопки. Если поддерживать таблицу соответствий по регионам, решение стабильно работает для входов на скачивание, оплату и поддержку.

5)Частые вопросы

Q1:Почему кнопка не переходит при клике?
Частые причины — скрипт не выполняется или запрос к API завершился ошибкой. Рекомендуется заранее задать URL по умолчанию(в примерах это сделано)и во время разработки временно использовать console.log(info), чтобы убедиться, что country действительно получен.
Q2:Почему для A-ссылки рекомендуют сначала поставить default href?
Потому что даже при сбое определения региона пользователь всё равно сможет перейти по ссылке по умолчанию. Иначе получится: «API упал → ссылка не обновилась → пользователю некуда идти».
Q3:Можно ли открывать по кнопке в новом окне?
Можно. Замените window.location.href = target на window.open(target, "_blank"). Обычно браузер не блокирует это, если вызов идёт из обработчика клика.
Q4:Как поддержать несколько регионов, например TW, US, JP?
Самый простой и удобный вариант — таблица соответствий: { TW: "...", US: "..." }. Есть совпадение — используем соответствующий URL, нет — используем URL по умолчанию.
Q5:Влияет ли CORS на этот подход?
Да. Если из-за CORS браузер не может прочитать JSON от https://my.ipin.io/info, он не получит country и в итоге сможет использовать только URL по умолчанию. Перед публикацией рекомендуется проверить в консоли, что запрос выполняется успешно.