Cambiar la moneda automáticamente por país en WooCommerce (reglas GeoIP)
Para cambiar la moneda automáticamente por país en WooCommerce, FOX usa reglas GeoIP: asignas países a cada moneda, y un visitante de Alemania abre la tienda en euros mientras que uno de Canadá ve dólares canadienses, sin tocar ningún selector. La configuración lleva unos minutos. Lo que más sorprende después a la mayoría de los propietarios de tiendas es una decisión de diseño: las reglas eligen la moneda solo en la primera visita del visitante. A continuación verás cómo funciona toda la cadena, cómo configurarla, cómo probarla correctamente y cómo cambiar el comportamiento predeterminado cuando lo necesites.
Cómo funciona el cambio automático de moneda por país
En la primera página que ve el visitante se ejecutan tres pasos:
- WooCommerce averigua el país. FOX no tiene una base de datos de IP propia. Llama a
WC_Geolocation::geolocate_ip(), la misma función que WooCommerce usa para los impuestos y los envíos. WooCommerce lee primero una cabecera de país si el servidor o la CDN la envía (por ejemplo,CF-IPCountryde Cloudflare), luego busca la dirección IP en la base de datos MaxMind GeoLite2 y, como último recurso, consulta un servicio de búsqueda público. - FOX hace coincidir el país. Recorre las listas de países de su pestaña GeoIP. La primera moneda cuya lista contiene el código de país de dos letras pasa a ser la moneda del visitante.
- FOX guarda el resultado para este visitante, y todas las páginas posteriores usan la moneda guardada.
Antes de esa coincidencia, un visitante totalmente nuevo recibe la Moneda de bienvenida (Welcome currency) de la pestaña Opciones (Options). Si el país detectado está en una de tus listas, la moneda GeoIP la sustituye en esa misma página. Si no lo está, o si no se detectó ningún país, el visitante se queda con la moneda de bienvenida. El idioma del navegador no influye.
Configura el cambio automático de moneda por país
Todos los ajustes de FOX están en WooCommerce → Ajustes → moneda (Currency).
- Añade todas las monedas que quieras mostrar en la pestaña Divisas (Currencies). FOX no traduce por sí mismo un país a su moneda local: un visitante solo puede recibir una moneda que exista en tu lista y tenga asignado su país. Una tienda con EUR, GBP y USD puede atender al mundo entero, pero un visitante japonés solo ve yenes si añades JPY.
- Dale a WooCommerce una fuente de países. Crea una cuenta gratuita de MaxMind, genera una clave y guárdala en WooCommerce → Ajustes → Integración → Geolocalización de MaxMind (MaxMind Geolocation); WooCommerce descarga la base de datos cuando se guarda la clave. La guía de WooCommerce sobre MaxMind muestra los pasos. Establece Ubicación predeterminada del cliente (Default customer location) en WooCommerce → Ajustes → General con una opción Geolocalizar (Geolocate), para que el propio WooCommerce trabaje con el mismo país en los impuestos, los envíos y la dirección rellenada previamente en la finalización de compra.
- Asigna los países en la pestaña GeoIP de FOX. Cada moneda tiene una lista de selección múltiple con los botones seleccionar todo (Select all) y limpiar todo (Clear all). La pestaña aparece cuando WooCommerce está activo, porque las reglas dependen de su clase de geolocalización.
- Elige la moneda de bienvenida en la pestaña Opciones (Options). Es la que reciben los visitantes de todos los países que no figuran en las listas, así que funciona como "todos los demás". Usa una moneda que sea visible en el selector; la propia descripción de la opción advierte contra una oculta.
- Pulsa Guardar cambios (Save changes).
Una configuración típica para una tienda con sede en la eurozona:
| Moneda | Países en su lista GeoIP | Quién la recibe en la primera visita |
|---|---|---|
| EUR | los países de la zona del euro | los visitantes de esos países |
| GBP | Reino Unido | los visitantes británicos |
| CHF | Suiza, Liechtenstein | los visitantes de Suiza y Liechtenstein |
| USD (moneda de bienvenida) | vacía | todos los demás y los visitantes cuyo país no se pudo detectar |
Tres reglas deciden los casos límite. Un país que figura en dos monedas va a la primera según el orden de la pestaña Divisas (Currencies). Un país que no está en ninguna lista recibe la moneda de bienvenida. Añadir un mercado a tus zonas de envío no lo añade a las reglas GeoIP; añádelo también aquí.
Perfiles de países
Debajo de las reglas, los Perfiles GeoIP (GeoIP profiles) permiten guardar un conjunto de países con nombre y aplicarlo con Añadir: (Add to:) y una moneda. Aplicar un perfil sustituye la lista de esa moneda por los países del perfil; no se añade a ella. FOX incluye un perfil países de la UE (EU countries), que enumera los Estados miembros de la UE, no la zona del euro, por lo que incluye países con moneda propia, como Suecia, Chequia, Dinamarca, Hungría y Rumanía. Después de aplicarlo a EUR, quita los países que quieras atender en otra moneda y revisa la lista antes de guardar.
Por qué la moneda cambia solo en la primera visita
Las reglas GeoIP deciden lo que ve primero un visitante, no aquello con lo que se queda atado. Una vez que FOX ha guardado una moneda para un visitante, la usa en todas las páginas, de modo que un visitante que prefiere los dólares puede cambiar y conservar los dólares. El mismo mecanismo explica los informes de que "GeoIP dejó de funcionar": tu propio navegador ya tiene una moneda guardada, y cambiar las reglas no afecta a los visitantes que ya tienen una.
Lo que cuenta como visitante nuevo depende de Almacenamiento de moneda (Currency storage) en la pestaña Opciones (Options):
| Almacenamiento de moneda | El visitante se identifica por | Una visita nueva es |
|---|---|---|
| Sesión PHP (PHP Session) | la cookie de sesión PHP del navegador | un navegador o dispositivo nuevo, o una sesión nueva |
| FOX Session | una cookie wp_woocs_session_ que dura 48 horas | un navegador o dispositivo nuevo, o la cookie ha caducado |
| Transitorio (Transient), Memcached, Redis | la dirección IP | una red nueva; todos los dispositivos de una misma red Wi-Fi cuentan como un solo visitante |
Así, un cliente que viaja recibe de nuevo la moneda del nuevo país con un almacenamiento basado en la IP, pero conserva su moneda anterior con un almacenamiento de sesión. Cambiar el tipo de almacenamiento también descarta todas las monedas guardadas, y por eso a veces GeoIP parece "empezar a funcionar" justo después de ese cambio: todos los visitantes son nuevos una vez.
Pruébalo como un visitante nuevo
Probar en el navegador que usaste para configurar la tienda te muestra tu moneda guardada, no el resultado de GeoIP. Haz esto en su lugar:
- Pon
[woocs_geo_hello] [woocs_show_current_currency]en una página en borrador y excluye esa página de toda caché. [woocs_geo_hello] muestra el país que WooCommerce detecta para ti, y [woocs_show_current_currency] la moneda que FOX usa para ti. - Con Sesión PHP (PHP Session) o FOX Session, abre la página en una ventana privada que aún no haya visitado el sitio.
- Con Transitorio (Transient), Memcached o Redis, una ventana privada no basta, porque la dirección IP es la misma. Usa otra conexión, por ejemplo un teléfono con datos móviles, o una VPN que actives antes de abrir el sitio y cuya dirección nadie haya usado para una prueba.
Las direcciones de las VPN no siempre están ubicadas donde dice el proveedor, así que confía en el país que muestra [woocs_geo_hello]. Si ese país falta o es incorrecto, o si el país es correcto pero la moneda no, sigue la lista de comprobación de resolución de problemas de la geolocalización de WooCommerce muestra la moneda incorrecta. Si las páginas de la tienda están en caché, lee por qué un selector de monedas y una caché de página se enfrentan antes de publicar: una página en caché se generó para otro visitante, y la decisión de GeoIP se ejecuta en PHP.
Desactiva el cambio automático o hazlo permanente
Sin cambio automático
No existe un interruptor de activación independiente: GeoIP está activo siempre que una moneda tenga países asignados. Pulsa limpiar todo (Clear all) para cada moneda en la pestaña GeoIP y guarda. Todo visitante nuevo empezará entonces con la moneda de bienvenida y solo la cambiará con un selector.
La moneda del país en cada página
Algunas tiendas no deben permitir que los visitantes de un país de la lista naveguen en otra moneda. El siguiente fragmento vuelve a aplicar la moneda GeoIP en cada visualización de página, después de que FOX haya detectado el país:
/*
* FOX: always show the currency assigned to the visitor's country
* in the GeoIP tab. Visitors from unlisted countries can still switch.
* Child theme functions.php or a code snippets plugin.
*/
add_action('wp_head', function () {
global $WOOCS;
if (empty($WOOCS)) {
return;
}
// Two-letter country code stored by FOX, for example "DE"
$country = $WOOCS->storage->get_val('woocs_user_country');
$currency = $WOOCS->get_currency_by_country($country);
if ($currency && $currency !== $WOOCS->current_currency) {
$WOOCS->set_currency($currency);
}
}, 1000);
La prioridad 1000 lo ejecuta después del propio código de FOX en wp_head, que guarda el país. Lee tus listas GeoIP mediante $WOOCS->get_currency_by_country(), de modo que las reglas se mantienen en un solo lugar. Si escribes tu propia lógica de países, compara códigos de país reales: WooCommerce devuelve FR, ES o IT, nunca EU, así que una condición como 'EU' == $country nunca coincide. Si Es múltiple permitido (Is multiple allowed) en la pestaña Avanzado (Advanced) está en No, la finalización de compra se cobra en la moneda base; en ese caso empieza la función con if (is_checkout()) { return; } para que la página de finalización de compra no mezcle las dos. Como toda decisión tomada en PHP, el fragmento no se ejecuta en una página servida desde una caché de página completa.
Sin ningún selector
La detección automática no necesita un selector visible. No coloques el shortcode [woocs] ni el widget, y mantén desactivado el selector lateral en la pestaña Lado (Side); los visitantes simplemente reciben la moneda de su país. Si sí muestras un selector, el selector de moneda lateral flotante no requiere cambios en el tema.
Precios, finalización de compra y país de facturación
Las reglas GeoIP eligen la moneda; el precio es el precio base convertido a tu tipo de cambio. Para fijar tu propio precio para un mercado, por ejemplo 45 euros en lugar de unos 45,37 convertidos, consulta precio de WooCommerce según el país. Si el cliente paga después en la moneda GeoIP o en tu moneda base es una decisión aparte, que se explica en mostrar precios en moneda local y cobrar en la moneda base.
La dirección IP indica desde dónde llega la conexión, no dónde vive el cliente. Cuando la moneda de pago deba coincidir con la dirección que el cliente introduce al finalizar la compra, usa la moneda de pago según el país del cliente además de las reglas GeoIP, o en lugar de ellas.
Lista de comprobación
- Todas las monedas que quieres mostrar existen en la pestaña Divisas (Currencies).
- WooCommerce puede localizar a los visitantes: clave de MaxMind guardada, o una cabecera de país de tu CDN.
- Cada país de destino está en exactamente una lista GeoIP; la moneda de bienvenida cubre a todos los demás.
- Probado como visitante nuevo según tu tipo de almacenamiento, en una página sin caché con
[woocs_geo_hello]. - Caché de página configurada para las monedas si las páginas de la tienda están en caché.
Si un visitante totalmente nuevo de un país de la lista sigue recibiendo la moneda incorrecta con las cachés desactivadas, abre un tema en el foro de soporte de FOX con un enlace a tu página de prueba, tus reglas GeoIP y tu ajuste de almacenamiento, y lo revisaremos.