El selector de moneda vuelve a la moneda predeterminada al cambiar de página
Un visitante elige euros, abre la página siguiente y vuelve a ver la moneda predeterminada. O la moneda salta: euros en la página de la tienda, dólares en el producto, euros otra vez tras añadir al carrito. Cuando un selector de moneda vuelve a la moneda predeterminada de esta forma, FOX no ha olvidado nada por sí solo. Ha ocurrido una de estas tres cosas: la página venía de una caché y nunca llegó al plugin, el almacenamiento que guarda la elección del visitante no la conservó, o algo en el sitio volvió a establecer otra moneda. A continuación: cada causa con su solución, un diagnóstico y por qué una página en caché puede mostrar la moneda incorrecta durante un segundo antes de corregirse.
Cómo recuerda FOX la moneda seleccionada
Cuando un visitante hace clic en una moneda, FOX abre la misma página con ?currency=EUR en la dirección (o, con No hay datos GET en el enlace (No GET data in link) activado en la pestaña Opciones (Options), envía la elección por AJAX y recarga la página). El plugin escribe el código en el almacenamiento seleccionado en Almacenamiento de moneda (Currency storage). En cada solicitud posterior vuelve a leer la moneda de ahí.
Si el almacenamiento no tiene nada para este visitante, FOX lo trata como nuevo: recibe la Moneda de bienvenida (Welcome currency) y las reglas GeoIP si las usas. Esa suele ser la moneda predeterminada que la gente ve "al volver". Una página en caché muestra otra más: la moneda de quien se guardó primero en la caché.
Una caché de página sirve la página
Esta es la causa en la mayoría de los casos. Una página en caché lleva la moneda de quien la generó, y FOX no se ejecuta para el visitante que recibe la copia. Por qué ambos chocan, y las dos salidas honestas, se explican en por qué un selector de moneda y una caché de página se enfrentan. Los síntomas que apuntan a la caché:
- La moneda se mantiene para ti cuando has iniciado sesión, pero no en una ventana privada. La mayoría de las cachés de página omiten a los usuarios con sesión iniciada.
- La moneda se mantiene en cuanto hay algo en el carrito. Muchas cachés de servidor omiten a los visitantes con la cookie
woocommerce_items_in_cart. - La página con
?currency=en la dirección es correcta, y la página siguiente sin ese parámetro es incorrecta. - Dos navegadores muestran dos monedas distintas en la misma página.
La solución por parte de FOX es un solo ajuste: Estoy usando un complemento de caché en mi sitio (I am using cache plugin on my site) = Sí (Yes) en la pestaña Opciones (Options), y después vaciar todas las cachés. Con él, cada página pide al servidor la moneda real del visitante después de cargar y vuelve a dibujar los precios cuando los guardados en caché son distintos. Déjalo desactivado en una tienda sin caché de página: ahí FOX ya imprime los precios correctos en el servidor.
Otras dos reglas valen para cualquier caché, sea cual sea su marca:
- Las páginas de carrito, finalizar compra y cuenta nunca se guardan en caché. Los plugins de caché excluyen las páginas estándar de WooCommerce, pero una página de finalizar compra creada por un tema o un plugin de embudos suele faltar en la lista.
- Con No hay datos GET en el enlace (No GET data in link) activado, el cambio recarga la misma dirección, y una caché responde a esa recarga con la moneda antigua. En una tienda con caché, esta opción necesita la opción de caché; si no, parece que el selector no hace nada.
Capas de caché
Una tienda puede tener tres cachés, cada una con su propio vaciado y configuración: el plugin de caché, la caché de servidor del hosting (SiteGround, Kinsta y otros hostings gestionados tienen una) y una CDN como Cloudflare. Vaciar una no vacía las otras. Los optimizadores que retrasan o combinan JavaScript (WP Rocket, LiteSpeed Cache, NitroPack y otros) también pueden impedir que se ejecute el redibujado: consulta FOX y WP Rocket y el selector de moneda se queda cargando tras la optimización de JS para ver las exclusiones. No hace falta el almacenamiento en caché de fragmentos de página (como los bloques mfunc de W3 Total Cache): FOX vuelve a dibujar los precios por sí mismo.
Cuando el redibujado no se ejecuta
La opción de caché solo ayuda si la solicitud de redibujado realmente se envía y se responde:
- Páginas sin precios. FOX envía la solicitud solo cuando la página contiene precios de productos. En una página de inicio, una entrada de blog o una página de contacto en caché sin precios, el selector conserva la moneda de la copia en caché. La elección no se pierde: la siguiente página con precios la muestra. Si importa la etiqueta del selector en esas páginas, exclúyelas de la caché de página.
- Precios impresos de forma no estándar. FOX encuentra los precios por el contenedor que añade al HTML de precio de WooCommerce:
<span class="woocs_price_code" … data-product-id="…">. Un tema, un maquetador de páginas o un plugin de descuentos que construye por sí mismo el HTML del precio elimina ese contenedor, y FOX no ve precios en la página. Mira el código fuente de la página y buscawoocs_price_code; si falta alrededor de los precios, desactiva plugins y cambia a un tema por defecto hasta que aparezca. - AJAX bloqueado. Un cortafuegos o un plugin de seguridad que bloquea
/wp-admin/admin-ajax.phppara los visitantes impide el redibujado. La moneda parece entonces aleatoria, porque cada página muestra lo que se guardó en la caché.
El almacenamiento de moneda pierde la elección
Si la moneda se restablece incluso con todas las cachés desactivadas, el almacenamiento no conserva la elección del visitante, y cada página es una primera visita. Almacenamiento de moneda (Currency storage) en la pestaña Opciones (Options) decide cómo reconoce FOX a un visitante:
| Almacenamiento de moneda (Currency storage) | El visitante se reconoce por | Motivo típico de los restablecimientos |
|---|---|---|
| Transitorio (Transient) | la dirección IP; con la opción de caché activada, una clave aleatoria que el navegador guarda en localStorage | Los visitantes comparten una IP (oficinas, operadores móviles) o la IP cambia durante la visita. Un servidor detrás de un proxy o un balanceador de carga que no pasa X-Forwarded-For o X-Real-IP ve una sola dirección para todos, así que los visitantes se sobrescriben la moneda unos a otros. |
| Sesión PHP (PHP Session) | la cookie PHPSESSID y los datos de sesión en el servidor | El servidor elimina las sesiones inactivas (la duración predeterminada de PHP es de 24 minutos), la cookie termina al cerrar el navegador, o varios servidores PHP no comparten las sesiones. |
| Sesión FOX (FOX Session) | una cookie que empieza por wp_woocs_session_, válida 48 horas; datos en la tabla de sesiones de WooCommerce | Un proxy o una CDN que elimina la cookie; la sesión termina a las 48 horas. |
| Memcached, Redis | la dirección IP, como Transitorio (Transient) | Un Servidor de almacenamiento (Storage server) o un Puerto de almacenamiento (Storage port) incorrectos: no se guarda nada. Solo aparecen en la lista cuando existe la extensión de PHP; consulta Memcached o Redis como almacenamiento de moneda. |
Un valor de Transitorio (Transient) caduca un día después de la última página vista del visitante, o a los 30 días en el modo de clave del navegador. Cuando la moneda se restablece sin caché, cambia a otro tipo de almacenamiento, guarda y vuelve a probar. Una moneda que "cambia al azar" entre páginas en una tienda sin caché es el caso de la IP compartida: un almacenamiento de sesión lo resuelve.
Dos efectos secundarios que conviene conocer. Cambiar el tipo de almacenamiento hace olvidar una vez todas las monedas guardadas, así que todos los visitantes pasan a ser nuevos. Y con Sesión PHP (PHP Session) o Sesión FOX (FOX Session) cada visitante recibe la cookie de sesión en la primera solicitud, de modo que añadir esa cookie a la lista de "no cachear" de una caché desactiva la caché para casi todos después de su primera página. Con una caché de página o una CDN, Transitorio (Transient) más la opción de caché es la combinación pensada para el almacenamiento en caché: la clave del navegador viaja con las solicitudes de redibujado y de carrito, y no interviene ninguna cookie.
Algo vuelve a establecer la moneda
Cuando el almacenamiento funciona y no hay caché, la moneda se restablece porque algo escribe una nueva.
- Enlaces con
?currency=. Cualquier dirección que contengacurrency=USDestablece dólares para el visitante que la abre. Un elemento de menú, un banner o un botón cuyo enlace se copió del navegador mientras había una moneda seleccionada restablece la moneda de todos los visitantes que hagan clic. Buscacurrency=en los menús, los widgets y el contenido de las páginas. - Código que llama a
set_currency()en cada página. Los snippets que eligen una moneda según el idioma, el rol de usuario o la página y llaman a $WOOCS->set_currency() en cada solicitud sobrescriben cada vez la elección del visitante. Buscaset_currencyen el tema hijo y en los plugins de snippets de código. Un snippet así solo debe ejecutarse cuando le toca imponerse, no en cada visita a una página. - Finalizar compra. Con Es múltiple permitido (Is multiple allowed) establecido en No en la pestaña Avanzado (Advanced), FOX cambia a la moneda base al finalizar la compra, y el visitante la conserva después. Es así por diseño: la moneda vuelve a la predeterminada tras finalizar la compra lo explica. Pago por reglas de GeoIP (Checkout by GeoIP rules) hace lo mismo con la moneda del país del visitante; consulta moneda de finalizar compra según el país del cliente.
Las reglas GeoIP no causan restablecimientos por sí solas: se aplican solo en la primera visita. Si la moneda de GeoIP vuelve en cada página, el visitante es "nuevo" en cada página, que es el problema de almacenamiento descrito arriba.
Encuentra la causa paso a paso
- Reprodúcelo como visitante. Abre una ventana privada, sin sesión iniciada y con el carrito vacío. Elige una moneda y abre después una página sin precios, una página de producto y el carrito.
- Mira en qué moneda se construyó la página. Abre el código fuente de la página (Ctrl+U) y busca
var woocs_current_currency; el"name"que contiene es la moneda del HTML. Una página construida en una moneda que no elegiste vino de una caché, o el almacenamiento perdió la elección. - Observa el redibujado. Abre las herramientas de desarrollo (F12), recarga, filtra la pestaña Network por
admin-ajaxy busca la solicitud conaction=woocs_get_products_price_html. Una respuesta de[]significa que la moneda guardada es igual a la de la página. Una respuesta concurrent_currencyindica la moneda que FOX tiene guardada para ti. Si no hay solicitud, la opción de caché está desactivada, la página no tiene precios con el contenedor de FOX o front.js no se ejecutó; un 403 significa que un cortafuegos la bloquea. - Salta la caché una vez. Añade un parámetro que la caché nunca haya visto, como
?nocache=4821, cambiando el número cada vez. Las cachés omiten esas direcciones o aún no tienen copia de ellas, así que WordPress construye la página de nuevo. Si la moneda es correcta ahí e incorrecta sin el parámetro, la causa es la caché. - Desactiva las cachés. Desactiva el plugin de caché, la caché de servidor en el panel del hosting y la caché de la CDN, y vacía las tres. Si la moneda sigue restableciéndose, cambia Almacenamiento de moneda (Currency storage) y busca después enlaces con
currency=y código conset_currency. - Vuelve a activar las capas de una en una, probando tras cada una. La capa tras la cual vuelve el restablecimiento es la que hay que configurar.
Se muestra la moneda incorrecta durante un segundo y luego cambia
En una tienda con caché y la opción de caché activada, este parpadeo es lo esperado. La página en caché llega con los precios de quien se guardó primero. Cuando el HTML se ha analizado, front.js espera 300 ms, recoge los precios y envía una solicitud a admin-ajax.php. El servidor compara la moneda de la página con la guardada del visitante y, si difieren, devuelve el HTML de precios nuevo, que sustituye a los precios antiguos y actualiza los selectores. La espera que ves es el tiempo hasta que arranca el script más esa solicitud, que nunca se guarda en caché y carga todo WordPress. En un teléfono lento puede tardar varios segundos.
Para acortarla o hacerla invisible:
- No retrases los scripts de FOX. Un ajuste de retrasar hasta la interacción mantiene el redibujado en espera hasta que el visitante se desplaza o toca la pantalla. Las exclusiones están en el artículo sobre la optimización de JS.
- Haz más rápidos la página y el servidor. El redibujado no puede empezar antes de que se analice la página, y no puede terminar más rápido de lo que el servidor responde a una solicitud sin caché.
- Activa Precargador de precios (Prices preloader). Se muestra bajo la opción de caché en la pestaña Opciones (Options) una vez activada esa opción. Oculta los precios en caché tras un pequeño spinner desde que aparece la página hasta que front.js inicia el redibujado, que es la parte larga de la espera en una página lenta o con scripts retrasados. Mientras se ejecuta la propia solicitud de redibujado, los precios en caché vuelven a verse, así que un servidor lento aún los muestra brevemente.
El precargador tiene dos efectos secundarios conocidos. Los productos cargados más tarde, por paginación AJAX, desplazamiento infinito o un filtro AJAX, no se vuelven a dibujar, porque el redibujado se ejecuta una vez por carga de página, y nada quita el spinner de sus precios. Desactiva la carga AJAX para las listas de productos en caché o desactiva el precargador. Y una plantilla de variaciones de terceros que cambia el precio sin los eventos de variación estándar de WooCommerce deja el spinner sobre el precio de la variación; usa la plantilla estándar, o pide a su autor que quite la clase woocs_preloader_ajax de .woocs_price_code después de cada cambio.
Desactivar la opción de caché elimina el parpadeo, pero devuelve el restablecimiento, porque entonces los precios en caché se quedan como están. La única configuración sin ningún parpadeo es no guardar en caché las páginas que muestran precios. Si la tienda puede permitirse la carga del servidor, esa es la opción más limpia.
Lista de verificación
- Probado sin sesión iniciada, en una ventana privada, con el carrito vacío, después de vaciar todas las capas de caché.
- Estoy usando un complemento de caché en mi sitio (I am using cache plugin on my site) = Sí (Yes) si alguna caché de página o CDN guarda en caché las páginas de la tienda, No si ninguna lo hace.
- Las páginas de carrito, finalizar compra y cuenta, incluidas las personalizadas, excluidas de todas las cachés.
- Precios envueltos en spans
woocs_price_code, y solicitudwoocs_get_products_price_htmlrespondida con estado 200. - Almacenamiento de moneda (Currency storage) cambiado y probado si el restablecimiento ocurre sin ninguna caché.
- Sin enlaces con
currency=en menús ni contenido, sin código que llame aset_currency()en cada página, Es múltiple permitido (Is multiple allowed) = Sí (Yes) si la moneda debe sobrevivir a finalizar la compra.
Si la moneda sigue restableciéndose después de todo esto, abre un tema en el foro de soporte de FOX con el enlace de la página, tu configuración de caché y la respuesta de la solicitud woocs_get_products_price_html, y lo revisaremos.