Definir link A e redirecionamento de button com base na localização por IP

Autor:Lisa Farrell · 2026-01-19

Em alguns casos, o objetivo não é “bloquear acesso”, e sim fazer um “roteamento por região” mais leve: na mesma página, usuários de países/regiões diferentes, ao clicar em um link ou botão, devem ir para URLs de destino diferentes. Esse tipo de roteamento costuma ser usado para: distribuição de links de download, entradas de pagamento por região, diferentes sistemas de suporte, e troca de entrada entre sites (internacional/local), etc.

Este artigo fala apenas de um ponto central: no carregamento da página, o frontend requisita GET https://my.ipin.io/info para obter o código do país do visitante country, e então define o href do <a> ou o endereço de navegação no clique do <button> como a URL correspondente àquela região. Por exemplo, a API pode retornar:

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

1)Lógica e princípio de funcionamento(2 parágrafos)

Primeiro parágrafo: fluxo
A página carrega → o frontend requisita imediatamente https://my.ipin.io/info → obtém country → escolhe a URL de destino conforme suas regras (por exemplo, TW usa a URL A 1, US usa a URL A 2, outras regiões usam a URL padrão) → atualiza o “destino” do link ou do botão para essa URL. O usuário só irá para o endereço correspondente quando clicar.

Segundo parágrafo: por que é recomendado definir primeiro uma URL padrão e depois sobrescrever por região
Porque o ambiente frontend pode ser instável: rede, CORS, extensões de bloqueio de anúncios e timeouts da API podem impedir a obtenção do country. Uma abordagem mais robusta é: definir na página uma URL padrão funcional (landing genérica) e, quando o script conseguir identificar a região, sobrescrever para a URL específica daquela região. Assim, mesmo se a API falhar, a página ainda consegue navegar normalmente, evitando “cliquei e não aconteceu nada / URL vazia”.

2)Implementação (super simples, A e button explicados separadamente)

2.1 Link A(usando id):definir href de acordo com country

Cenário: há apenas um link principal na página e você quer que ele aponte para destinos diferentes por região. O exemplo abaixo mostra a lógica mais simples: se for TW, usa o link de TW; caso contrário, usa o link padrão.

<a id="geoLink" href="https://example.com/default">Ir agora</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) {
    // Se falhar, mantém o href padrão
  }
})();
</script>

2.2 Link A(usando class):definir href em lote de acordo com country

Cenário: há vários links na página que precisam de roteamento por região. O jeito mais simples é: dar a mesma class e atualizar todos juntos. O exemplo segue minimalista: TW usa o link de TW; as demais regiões usam o link padrão.

<a class="geo-link" href="https://example.com/default">Entrada de download</a>
<a class="geo-link" href="https://example.com/default">Entrada de compra</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(usando id):no clique, navegar de acordo com country

Cenário: botão não é link por si só, então você precisa vincular um evento de clique no frontend. O exemplo abaixo mantém apenas a lógica essencial: primeiro escolhe a URL de destino conforme country, depois no clique do botão navega para essa URL.

<button id="geoBtn" type="button">Clique para ir</button>

<script>
(async function () {
  let target = "https://example.com/default"; // URL padrão

  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) {
    // Se falhar, usa a URL padrão
  }

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

2.4 Button(usando class):vincular navegação no clique em lote

Cenário: há vários botões na página e todos precisam navegar por região. O jeito mais simples: usar uma class comum e fazer um loop para vincular o clique. Atenção: botão não tem “href padrão”, então é recomendado preparar uma URL padrão no script para evitar que, quando a API falhar, o botão “não responda”.

<button class="geo-btn" type="button">Botão 1</button>
<button class="geo-btn" type="button">Botão 2</button>

<script>
(async function () {
  let target = "https://example.com/default"; // URL padrão

  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 Várias regiões(TW、US…):usar uma tabela de mapeamento para “definir diretamente a URL de destino” (versão mais curta utilizável)

A regra mais simples: prepare primeiro uma URL padrão e depois sobrescreva com a tabela de mapeamento map pelo código do país. Se houver mapeamento, use-o; se não, use a padrão. O ponto-chave: depois de calcular target, aplique imediatamente no href do link A ou no clique do botão.

2.5.1 Para link A(id):definir href diretamente

<a id="geoLink" href="https://example.com/default">Ir agora</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; // ✅ Chave: escrever target no href
  } catch (e) {
    // Se falhar, manter o href padrão
  }
})();
</script>

2.5.2 Para button(id):ao clicar, navegar para target

<button id="geoBtn" type="button">Clique para ir</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; // ✅ Chave: navegar com target no clique
  };
})();
</script>

3)Implementação em WordPress / Joomla / Magento / Shopify etc.(abordagem frontend + código)

Esse tipo de “alterar destino de link A / destino de clique de button por região” na prática é inserir o script no Head global do site ou no arquivo de layout para que ele execute o mais cedo possível. Você não precisa mexer na lógica do servidor: desde que o script rode ao carregar a página, dá para preparar o destino antes do clique do usuário.

3.1 WordPress

  • Usar um plugin de “inserir scripts no header/footer” e colar o script no Header(vale para o site todo)
  • Ou inserir antes de </head> no arquivo do tema header.php

3.2 Joomla! / Joomla

  • No template atual, encontrar <head> em index.php e colar o script antes de </head>
  • Ou usar a opção do template de “código head personalizado” (varia conforme o template)

3.3 Magento

  • Adicionar o script no head global do tema(área head em theme/layout)
  • Objetivo: saída unificada no site todo para facilitar a manutenção das regras de mapeamento por região

3.4 Shopify

  • Online Store → Themes → Edit code
  • Encontrar theme.liquid e colar o script antes de </head>(vale para o site todo)

3.5 Regra geral

  • Qualquer sistema que permita editar o <head> global ou o arquivo de layout pode implementar “definir destino de links/botões por região IP” da mesma forma
  • Recomenda-se manter uma URL padrão para que continue funcionando quando a API externa falhar

4)Resumo

> Ao carregar a página, requisitar https://my.ipin.io/info para obter country, escolher a URL de destino conforme country e atualizar o href do link A ou o destino de navegação do clique do botão, realizando uma solução frontend de “roteamento por região IP para diferentes destinos”.

Na prática, os dois pontos mais importantes são: primeiro, colocar o script o mais cedo possível no head para concluir a configuração do destino rapidamente; segundo, sempre preparar uma URL padrão para evitar links inválidos ou botões sem resposta quando a API falhar. Mantendo bem as regras de mapeamento por região, essa solução funciona de forma estável para entradas de download, pagamento e suporte.

5)Perguntas frequentes

Q1:Por que o botão não redireciona quando eu clico?
As causas comuns são: o script não executou ou a requisição à API falhou. Recomenda-se preparar uma URL padrão(como nos exemplos)e, durante o desenvolvimento, usar temporariamente console.log(info) para confirmar se o country foi obtido.
Q2:Por que é recomendado deixar um href padrão no link A primeiro?
Porque mesmo se a detecção de região falhar, o usuário ainda consegue navegar pelo link padrão. Caso contrário, você pode cair no cenário: “API falhou → link não foi definido → usuário sem destino”.
Q3:Dá para abrir em uma nova janela ao clicar no botão?
Sim. Troque window.location.href = target por window.open(target, "_blank"). Normalmente, dentro do evento de clique, o navegador não bloqueia.
Q4:E se eu precisar suportar várias regiões como TW, US, JP?
Usar um mapa é a forma mais simples e fácil de manter: { TW: "...", US: "..." }. Se houver correspondência, usa a URL correspondente; se não, usa a URL padrão.
Q5:CORS afeta essa solução?
Sim. Se o navegador não conseguir ler o JSON de https://my.ipin.io/info por causa de CORS, ele não obtém country e no fim só consegue usar a URL padrão. Antes de publicar, é recomendado validar no console se a requisição está funcionando.