Geolocalización de WooCommerce: moneda incorrecta y lista de comprobación
Cuando la geolocalización de WooCommerce muestra la moneda incorrecta, las reglas GeoIP de FOX rara vez son la parte averiada. La moneda de un visitante nuevo es el final de una cadena corta: WooCommerce deduce el país a partir de la dirección IP, FOX busca ese país en sus reglas GeoIP y el resultado se guarda para el visitante. Una moneda incorrecta significa que ha fallado un eslabón de esa cadena: no se detectó el país, se detectó pero no coincidió con ninguna regla, o el visitante nunca llegó al código porque respondió antes una caché. Las comprobaciones siguientes averiguan qué eslabón es, en ese orden.
Cómo elige FOX una moneda para un visitante nuevo
FOX no tiene una base de datos de geolocalización propia. Llama a WC_Geolocation::geolocate_ip(), la misma función que usa WooCommerce para las estimaciones de impuestos y envío, y recibe un código de país de dos letras. Después recorre las listas de la pestaña GeoIP de sus ajustes (WooCommerce → Ajustes → Moneda): la primera moneda cuya lista contiene ese país pasa a ser la moneda del visitante. Si ninguna lista lo contiene, el visitante se queda en la Moneda de bienvenida (Welcome currency) de la pestaña Opciones (Options). Cómo configurar las reglas desde cero se explica en cambiar la moneda automáticamente según el país; esta página trata de averiguar por qué no funcionan.
Tres detalles de esta lógica explican la mayoría de los casos de "no funciona":
- Las reglas se aplican una sola vez, en la primera visita. Después, FOX guarda la moneda del visitante y la usa en todas las páginas, de modo que un visitante que cambió de moneda a mano conserva su elección. Cambiar las reglas más tarde no afecta a los visitantes que ya tienen una moneda guardada.
- La primera visita se marca como usada aunque no se haya detectado ningún país. Si en la primera página vista no se pudo geolocalizar al visitante, las reglas no se vuelven a probar en la segunda. El visitante se queda en la moneda de bienvenida hasta que caducan sus datos guardados.
- La decisión se toma en PHP, mientras WordPress construye la página. Una página servida como HTML terminado desde una caché no la ejecuta.
Paso 1: comprueba qué detecta WooCommerce
Crea una página en borrador con estos dos shortcodes y exclúyela de todas las cachés (plugin de caché, caché del servidor, CDN):
[woocs_geo_hello] [woocs_show_current_currency]
[woocs_geo_hello] pregunta a WooCommerce por el país de la solicitud actual e imprime Tu país es: ... (Your country is: ...), o ¡Tu país no está definido! Problemas con el servicio GeoIp. (Your country is not defined! Troubles with GeoIp service.) cuando WooCommerce no devuelve nada. [woocs_show_current_currency] imprime la moneda que FOX está usando para ti. La página debe seguir sin caché: una copia en caché muestra el país de quien la cargó primero.
Abre la página como un visitante realmente nuevo. Una ventana privada no siempre basta, porque lo que cuenta como "nuevo" depende de Almacenamiento de moneda (Currency storage) en la pestaña Opciones (Options):
- Sesión PHP (PHP Session) y Sesión FOX (FOX Session) guardan los datos tras una cookie del navegador, así que una ventana privada nueva es un visitante nuevo.
- Transitorio (Transient), Memcached y Redis identifican los datos por la dirección IP. Todos los navegadores de la misma conexión son el mismo visitante, y una dirección VPN que tú u otra persona ya hayáis usado en una prueba tampoco es nueva. Prueba desde otra conexión, como un móvil con datos móviles, o cambia a Sesión PHP (PHP Session) mientras haces las pruebas.
| Lo que muestra la página de prueba | Dónde está el problema |
|---|---|
| País no definido | WooCommerce no puede geolocalizar en absoluto |
| Un país erróneo, a menudo el de la tienda o el del servidor | A WooCommerce llega una dirección IP equivocada, o el servidor guarda la ubicación en caché |
| País correcto, moneda incorrecta, en una visita totalmente nueva | Las reglas GeoIP |
| País y moneda correctos aquí, moneda incorrecta en las páginas de la tienda | Caché de página |
Sin país o con un país erróneo
Esta parte corresponde a WooCommerce y al servidor, y FOX solo puede usar lo que ellos devuelven.
MaxMind no está configurado
WooCommerce busca la dirección IP en la base de datos gratuita MaxMind GeoLite2, que solo descarga cuando le das una clave. Crea una cuenta gratuita de MaxMind, genera una clave y pégala en WooCommerce → Ajustes → Integración → Geolocalización de MaxMind (MaxMind Geolocation). Establece Ubicación predeterminada del cliente (Default customer location) en WooCommerce → Ajustes → General en una de las dos opciones Geolocalizar (Geolocate), porque WooCommerce mantiene la base de datos descargada y actualizada solo cuando se usa la geolocalización. Sin la base de datos, WooCommerce recurre a servicios públicos de consulta con un tiempo de espera de dos segundos, lo que puede explicar un país que se detecta en algunas solicitudes y falta en otras.
El servidor pasa su propia dirección IP
WooCommerce toma la dirección del visitante primero de la cabecera X-Real-IP, después de la primera dirección de X-Forwarded-For y por último de REMOTE_ADDR. Detrás de un proxy inverso, un balanceador de carga o Varnish, estas pueden contener la dirección del proxy, y todos los visitantes quedan ubicados en el país del centro de datos. Detrás de Cloudflare, la solución más sencilla es el propio ajuste Geolocalización de IP (IP Geolocation) de Cloudflare: añade una cabecera CF-IPCountry, y WooCommerce lee un país de esa cabecera antes de mirar ninguna dirección IP. En otro caso, el servidor debe restaurar la dirección real; en nginx son las directivas real_ip_header y set_real_ip_from, que puede configurar tu hosting.
Para ver qué dirección recibe WooCommerce, añade este shortcode temporal y coloca [geo_debug] en la página de prueba sin caché:
/*
* Temporary geolocation check. Child theme functions.php or a code snippets plugin.
* Remove it when you are done.
*/
add_shortcode('geo_debug', function () {
if (!class_exists('WC_Geolocation')) {
return '';
}
$geo = WC_Geolocation::geolocate_ip();
return 'IP seen by WooCommerce: ' . esc_html(WC_Geolocation::get_ip_address())
. '<br>Country: ' . esc_html($geo['country']);
});
Si la IP es la de tu servidor o siempre es la misma dirección, sea quien sea el que abra la página, la causa es el proxy.
El hosting guarda la ubicación en caché
Algunos hostings gestionados ejecutan su propia caché de página o "dinámica" delante de WordPress, y algunos guardan en caché la ubicación detectada por página. La página de prueba muestra entonces el mismo país a todos los visitantes aunque no haya ningún plugin de caché instalado. Pide al hosting que excluya tus páginas de esa capa o que la varíe según el país, o prueba con ella desactivada para confirmarlo.
País correcto, moneda incorrecta: las reglas GeoIP
Cuando la página de prueba muestra el país correcto en una visita totalmente nueva y la moneda sigue siendo incorrecta, abre la pestaña GeoIP:
- Listas vacías. Si ninguna moneda tiene países asignados, FOX nunca cambia según la ubicación y todos los visitantes reciben la moneda de bienvenida.
- Un país en dos listas. FOX toma la primera moneda, en el orden de la pestaña Divisas (Currencies), cuya lista contiene el país. Un país que se queda en la lista de USD mantiene a esos visitantes en USD, sea cual sea el resto de sus asignaciones. Pulsar seleccionar todo (Select all) en una moneda y asignar después países a otras es una forma fácil de llegar a esta situación.
- Un país que no está en ninguna lista. Enviar a un mercado nuevo no lo añade a las reglas; añádelo a la moneda correspondiente.
- Una regla para una moneda que ya no está en la tienda. Las reglas se guardan por código de moneda. Después de eliminar o renombrar una moneda en la pestaña Divisas (Currencies), una regla sobrante apunta a un código al que FOX no puede cambiar, y esos visitantes reciben la moneda base. Volver a guardar los ajustes reescribe las reglas solo para las monedas actuales.
- El perfil integrado países de la UE (EU countries). Incluye a Polonia con el código
PO, que no es un código de país, así que al aplicar el perfil Polonia queda fuera. Añade Polonia a mano.
Otras dos causas quedan fuera de las reglas. Un código personalizado que llama a $WOOCS->set_currency() en cada página, por ejemplo en wp_head, anula la elección de GeoIP; búscalo en el tema y en los snippets. Y un desplegable de monedas creado por el tema o por un maquetador de páginas no es el selector de FOX y puede que simplemente no refleje la moneda activa; usa el shortcode [woocs] para comparar.
La geolocalización muestra la moneda incorrecta solo en páginas en caché
Una caché de página completa guarda una copia terminada de la página y se la entrega a todos, de modo que la moneda del primer visitante se muestra al siguiente, y el código de GeoIP nunca se ejecuta para el visitante que recibió la copia. Por qué un selector de moneda y una caché de página se enfrentan explica el conflicto en detalle; para la geolocalización, estos cuatro ajustes funcionan juntos:
- Ubicación predeterminada del cliente (Default customer location) = Geolocalizar (con soporte de caché de páginas) (Geolocate (with page caching support)). WooCommerce redirige entonces a URL con una clave
?v=formada a partir de la ubicación del visitante, de modo que una caché que indexa las páginas por la URL completa guarda una copia distinta para cada ubicación, generada por un visitante de esa ubicación. La caché no debe ignorar el parámetro de consultav. - Estoy usando un complemento de caché en mi sitio (I am using cache plugin on my site) en la pestaña Opciones (Options) de FOX. Después de cargar una página en caché, el plugin pide al servidor la moneda guardada del visitante y, cuando difiere de la que figura en el HTML en caché, vuelve a dibujar los precios.
- Un almacenamiento que la caché no pueda compartir entre visitantes. Con Sesión PHP (PHP Session), añade la cookie
PHPSESSIDa la lista de cookies de "no cachear" del plugin de caché; con Sesión FOX (FOX Session), la cookie que empieza porwp_woocs_session_. Con una CDN delante del sitio, Transitorio (Transient) más la opción de caché evita las cookies por completo. - Las páginas de carrito, finalizar compra y cuenta excluidas de la caché, incluidas las páginas de finalizar compra personalizadas creadas por un tema o un plugin de embudos.
Un límite de FOX 2.5.5 importa aquí: la solicitud de redibujado compara la moneda de la copia en caché con la moneda actual del visitante antes de llegar al paso de GeoIP. Un visitante nuevo empieza en la Moneda de bienvenida (Welcome currency), así que en las páginas guardadas en caché en la Moneda de bienvenida (Welcome currency) se omiten las reglas GeoIP y el visitante la conserva. El artículo sobre Cloudflare APO ofrece un fragmento breve que ejecuta primero el paso de GeoIP; funciona con cualquier caché de página, no solo con Cloudflare.
Para WP Rocket en concreto, FOX y WP Rocket enumera las exclusiones de scripts que necesita. Para confirmar que la causa es la caché, vacía todas las capas (plugin, servidor, CDN), desactiva la caché para una prueba y repite la prueba de primera visita.
Usuarios de VPN, ciudades fronterizas y el país de facturación
La geolocalización por IP te dice por dónde sale la conexión, no dónde vive el cliente. Una VPN, una red corporativa, un operador móvil que enruta a través de un país vecino o una ciudad cercana a una frontera producen el país "equivocado", y WooCommerce lo informa correctamente desde el punto de vista de la dirección IP. Las VPN gratuitas son especialmente poco fiables para hacer pruebas, y una dirección VPN que alguien ya usó no es una primera visita para el almacenamiento basado en IP.
Cuando la moneda debe coincidir con el cliente y no con la conexión, decídela al finalizar la compra a partir de la dirección que escribe el cliente. Cambiar la moneda según la dirección de facturación en lugar de la geolocalización tiene código listo para eso, y cambiar la moneda según el país de entrega hace lo mismo con el país de envío. Si usas precios fijos por moneda, la opción Pago por reglas de GeoIP (Checkout by GeoIP rules) de la pestaña Avanzado (Advanced) hace, en cambio, que el pago use la moneda GeoIP del país del visitante, sea cual sea la que seleccionó mientras navegaba.
Lista de verificación
- La página de prueba sin caché muestra el país correcto para un visitante totalmente nuevo.
- Clave de MaxMind guardada y Ubicación predeterminada del cliente (Default customer location) establecida en una opción Geolocalizar (Geolocate).
- Detrás de un proxy o una CDN, a WordPress llega la IP real del visitante o una cabecera de país.
- Cada país de destino aparece en exactamente una lista GeoIP, y esa moneda existe en la tienda.
- Con una caché de página: Geolocalizar (con soporte de caché de páginas) (Geolocate (with page caching support)), Estoy usando un complemento de caché en mi sitio (I am using cache plugin on my site), un almacenamiento por visitante y el pago excluido.
- Pruebas hechas como visitante nuevo para el almacenamiento que uses, no en un navegador que ya tenga una moneda guardada.
Si la página de prueba muestra el país correcto para un visitante nuevo y la moneda sigue siendo incorrecta con las cachés desactivadas, abre un tema en el foro de soporte de FOX con el enlace de la página de prueba, tus reglas GeoIP y el ajuste de almacenamiento, y lo revisaremos.