Algunos negocios no necesitan “bloquear el acceso”, sino aplicar un “geo-routing” más ligero: en la misma página, los usuarios de distintos países/regiones, al hacer clic en un enlace o un botón, deberían ir a URLs de destino diferentes. Este tipo de routing se usa normalmente para: asignación de URLs de descarga, entradas de pago por región, distintos sistemas de soporte, y cambiar entradas entre sitios (internacional/local), etc.
Este artículo solo explica un punto central: cuando la página carga, el frontend solicita GET https://my.ipin.io/info para obtener el código de país country del visitante,
y luego configura el href de un <a> o la URL de redirección al clic de un <button> como la URL correspondiente a esa región.
Por ejemplo, la API puede devolver:
{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}
1)Lógica y principio de funcionamiento (2 párrafos)
Primer párrafo: flujo
La página carga → el frontend solicita inmediatamente https://my.ipin.io/info → obtiene country → elige la URL objetivo según tus reglas (por ejemplo, TW usa la URL A 1, US usa la URL A 2, otras regiones usan una URL por defecto) →
actualiza el “destino” del enlace o del botón con esa URL objetivo. El usuario solo irá a la dirección correspondiente cuando haga clic.
Segundo párrafo: por qué se recomienda definir primero una URL por defecto y luego sobrescribir por región
Porque el entorno frontend no siempre es estable: red, CORS, extensiones bloqueadoras de anuncios y timeouts de la API pueden impedir obtener country. Un enfoque más robusto es:
poner primero en la página una URL por defecto utilizable (una landing genérica) y, cuando el script obtenga la región correctamente, sobrescribirla con una URL específica por región. Así, incluso si la API falla, la página puede redirigir con normalidad y no tendrás problemas como “no pasa nada al hacer clic / URL vacía”.
2)Implementación de código (súper simple, A y button explicados por separado)
2.1 Enlace A (usando id): establecer href según country
Escenario: solo hay un enlace clave en la página y quieres que apunte a diferentes destinos según la región. El ejemplo de abajo muestra la lógica más simple:
si es TW, usa el enlace de TW; si no, usa el enlace por defecto.
<a id="geoLink" href="https://example.com/default">Ir ahora</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) {
// Si falla, mantener el href por defecto
}
})();
</script>
2.2 Enlaces A (usando class): establecer href en lote según country
Escenario: hay varios enlaces en la página que necesitan geo-routing. La forma más simple es: darles la misma class y actualizarlos juntos. El ejemplo sigue siendo minimalista: TW usa el enlace de TW; otras regiones usan el enlace por defecto.
<a class="geo-link" href="https://example.com/default">Entrada de descarga</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): redirigir al hacer clic según country
Escenario: un botón no es un enlace por sí mismo, así que necesitas vincular un evento de clic en el frontend. El ejemplo de abajo mantiene solo la lógica esencial: primero elige la URL objetivo según country, y luego redirige a esa URL cuando se hace clic en el botón.
<button id="geoBtn" type="button">Clic para redirigir</button>
<script>
(async function () {
let target = "https://example.com/default"; // URL por defecto
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) {
// Si falla, usar la URL por defecto
}
const btn = document.getElementById("geoBtn");
if (btn) btn.onclick = function () { window.location.href = target; };
})();
</script>
2.4 Buttons (usando class): vincular redirecciones en lote
Escenario: hay varios botones en la página que deben redirigir por región. La forma más simple: una class común y luego vincular los eventos de clic en un bucle. Nota: los botones no tienen “href por defecto”, así que se recomienda preparar primero una URL por defecto en el script para evitar que el botón “no responda” cuando la API falle.
<button class="geo-btn" type="button">Botón 1</button>
<button class="geo-btn" type="button">Botón 2</button>
<script>
(async function () {
let target = "https://example.com/default"; // URL por defecto
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 Multirregión (TW, US…): “establecer la URL objetivo directamente” con una tabla de mapeo (la versión más corta usable)
La regla más simple: primero prepara una URL por defecto, y luego sobrescríbela con una tabla de mapeo map según el código de país.
Si hay mapeo, se usa; si no, se usa el valor por defecto. La clave es: después de calcular target, aplícalo inmediatamente al href de un enlace A o al evento click de un botón.
2.5.1 Para enlace A (id): establecer href directamente
<a id="geoLink" href="https://example.com/default">Ir ahora</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; // ✅ Clave: escribir target en href
} catch (e) {
// Si falla, mantener el href por defecto
}
})();
</script>
2.5.2 Para botón (id): navegar a target al hacer clic
<button id="geoBtn" type="button">Hacer clic 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; // ✅ Clave: navegar con target al hacer clic
};
})();
</script>
3)Implementación en WordPress / Joomla / Magento / Shopify, etc. (enfoque frontend + código)
Para este tipo de “cambiar el destino del enlace A / destino de redirección del botón por región”, la esencia es insertar el script en el Head global o en el archivo de layout del sitio para que se ejecute lo antes posible. No necesitas tocar la lógica del servidor: mientras el script se ejecute al cargar la página, puedes preparar el destino antes de que el usuario haga clic.
3.1 WordPress
- Usar un plugin de “insertar scripts en header/footer” y pegar el script en el Header (global)
- O insertar el script antes de
</head>en el archivo del temaheader.php
3.2 Joomla! / Joomla
- En el template actual
index.php, encontrar<head>y pegar el script antes de</head> - O usar la opción de “código head personalizado” del template (varía según el template)
3.3 Magento
- Agregar el script al head global del tema (área head de theme/layout)
- El objetivo es que se renderice en todo el sitio para poder mantener fácilmente las reglas de mapeo por región
3.4 Shopify
- Online Store → Themes → Edit code
- Encontrar
theme.liquidy pegar el script antes de</head>(global)
3.5 Regla general
- Cualquier sistema que permita editar el
<head>global o el archivo de layout puede implementar “definir el destino de enlaces/botones según la región IP” de la misma manera - Mantener una URL por defecto para que la página siga siendo utilizable cuando falle la API externa
4)Resumen
> Al cargar la página, se solicita https://my.ipin.io/info para obtener country, luego se elige una URL objetivo según country y se actualiza el href del enlace A o la URL de redirección al clic del botón, logrando una solución frontend de “enviar a destinos diferentes según la región IP”.
En la práctica, los dos puntos más importantes son: primero, colocar el script lo más temprano posible en el head para preparar el destino cuanto antes; segundo, mantener siempre una URL por defecto para evitar enlaces inválidos o botones sin respuesta cuando la API falle. Mientras mantengas bien tus reglas de mapeo por región, esta solución funciona de forma estable para entradas de descarga, entradas de pago y entradas de soporte.
5)Preguntas frecuentes
console.log(info) para confirmar que se obtuvo country.
window.location.href = target por window.open(target, "_blank"). Normalmente no será bloqueado por el navegador si se dispara dentro de un evento de clic.
{ TW: "...", US: "..." }. Si hay coincidencia, se usa la URL correspondiente; si no, se usa la URL por defecto.
https://my.ipin.io/info por CORS, no podrá obtener country y al final solo podrá usar la URL por defecto. Antes de publicar, se recomienda verificar en la consola que la solicitud se realiza correctamente.