El selector de moneda no cambia los precios: diagnóstico paso a paso
Cuando el selector de moneda no cambia los precios, suele pasar una de dos cosas: eliges otra moneda y no ocurre nada, o cambia el símbolo de la moneda mientras el importe sigue siendo el número de la moneda base. FOX convierte un precio en el momento en que WooCommerce lo construye, así que cuando un importe no cambia, o bien la moneda nunca se cambió, o bien ese importe no pasó por las funciones de precio de WooCommerce. Las comprobaciones siguientes van de la más rápida a la más laboriosa.
Por qué el selector de moneda no cambia algunos precios
Cuando un visitante elige una moneda, FOX la guarda y la página se reconstruye en esa moneda. Con Es múltiple permitido (Is multiple allowed) = Sí (Yes) (el valor por defecto de una instalación nueva), FOX filtra los métodos que devuelven el precio del producto (get_price(), get_regular_price(), get_sale_price() y los precios de las variaciones), de modo que todo precio que WooCommerce lee de un producto se convierte. Con No, convierte los importes cuando wc_price() les da formato. En ambos modos, un precio impreso por get_price_html() del producto también va envuelto en un <span class="woocs_price_code">, y así es como FOX encuentra y vuelve a dibujar los precios en las páginas en caché.
El símbolo de la moneda viene de otro lugar: WooCommerce pide el símbolo de la moneda actual cada vez que da formato a un importe. Por eso el símbolo puede cambiar mientras el número no. Cualquier importe leído directamente de la base de datos, calculado por otro plugin o reescrito más tarde por un script recibe el símbolo nuevo y conserva el número antiguo.
Paso 1: ¿se está cambiando la moneda realmente?
- El selector no es de FOX. Los menús de moneda integrados en los temas, los banners de banderas del encabezado y los widgets de moneda de los constructores de páginas son código independiente; pueden cambiar un símbolo o una cookie que FOX nunca lee. Quítalos y usa el selector de FOX: el widget, el shortcode [woocs] o el selector lateral.
- La página se recarga y vuelve la moneda anterior. Entonces la selección se pierde o se deshace: una caché de página, el almacenamiento de la moneda, o código que llama a
$WOOCS->set_currency()oreset_currency()en cada página, a menudo sobrante de un antiguo snippet de "forzar una sola moneda". La moneda vuelve a la predeterminada al cambiar de página repasa cada causa. - Todas las monedas muestran el mismo símbolo. Si los importes sí cambian pero todas las monedas llevan el mismo signo, el problema es la columna Símbolo (Symbol) de la pestaña Divisas (Currencies), no la conversión; consulta cómo cambiar el símbolo de la moneda.
Paso 2: revisa la fila de la moneda
Abre la pestaña Divisas (Currencies) y fíjate en la moneda que no convierte:
- Tasa. Una tasa de 1 convierte 100 en 100: solo cambia el símbolo. Una tasa de 0 o vacía da precios en cero o vacíos. Actualiza la tasa, o corrige el agregador como se describe en los tipos de cambio no se actualizan.
- Código. Usa el código ISO 4217 (
THB,EUR) y escríbelo a mano. Un código pegado desde una página web puede llevar un carácter invisible; entonces FOX no encuentra la moneda y cada cambio vuelve a la moneda base. Borrar el código y volver a escribirlo es toda la solución en ese caso.
Si has cambiado la moneda base hace poco, revisa todas las tasas de nuevo: todas son relativas a la moneda base, y la propia moneda base debe tener la tasa 1.
Paso 3: averigua quién imprime el precio
Cambia a la moneda que falla, abre las herramientas de desarrollo del navegador (F12) y pega esto en la consola:
document.querySelectorAll('.woocs_price_code').forEach(function (el) {
el.style.outline = '2px solid red';
});
Cada precio que WooCommerce imprimió a través del HTML de precio del producto recibe un marco rojo. Un precio sin marco lo imprimió otro código: el tema, un widget de un constructor de páginas u otro plugin. Eso te dice dónde buscar a continuación.
El precio no tiene marco: plantillas del tema y código personalizado
El caso más habitual es una plantilla que lee directamente el campo meta del precio, por ejemplo echo wc_price( get_post_meta( $id, '_price', true ) );. Eso lee el número guardado en la moneda base sin pasar por el objeto del producto: con Es múltiple permitido (Is multiple allowed) = Sí (Yes) nunca se convierte, y en cualquiera de los dos modos no tiene marco, así que no se vuelve a dibujar en las páginas en caché. Sustitúyelo por la salida de precio propia del producto:
<?php
/*
* In the theme template that prints the price (copy it to a child theme first).
* Instead of: echo wc_price( get_post_meta( $id, '_price', true ) );
*/
$product = wc_get_product( $id );
if ( $product ) {
echo $product->get_price_html(); // converted, formatted, redrawn on cached pages
}
// For an amount that is not a product price, stored in the base currency:
echo do_shortcode( '[woocs_show_custom_price value="' . esc_attr( $amount ) . '"]' );
?>
El shortcode [woocs_show_custom_price] convierte y da formato a un importe en moneda base en ambos modos. Para los cálculos en PHP, $WOOCS->woocs_exchange_value() devuelve el número convertido. El código antiguo de temas que construye precios a partir de propiedades como $product->max_variation_price tiene el mismo problema; la FAQ problemas de precio en la página de producto muestra la salida correcta para las páginas de producto individual.
El precio no tiene marco: otro plugin lo calcula
Los plugins de eventos y reservas, los de opciones de producto y campos adicionales, y los de promociones y descuentos suelen calcular el precio por su cuenta a partir de los valores en moneda base e imprimir el resultado. Si solo esos productos, o solo el precio de la variación después de elegir opciones, conservan el importe base, desactiva el plugin en una copia de pruebas y vuelve a probar. Muchos de estos plugins ya tienen código de adaptación listo en la lista de compatibilidad de FOX Labs.
El precio tiene marco pero muestra el importe base
Entonces el precio se convirtió en el servidor y se cambió después en el navegador, o la página procede de una caché:
- Caché de página. Una página en caché lleva los precios de quien la cargó primero. Activa Estoy usando un complemento de caché en mi sitio (I am using cache plugin on my site) en la pestaña Opciones (Options), para que FOX vuelva a dibujar los precios con marco después de cargar la página, y luego vacía todas las cachés. Cómo funciona esto y qué cookies excluir se explica en por qué un selector de moneda y una caché de página se pelean.
- JavaScript retrasado o combinado. Si la optimización retrasa los scripts de FOX, el redibujado nunca se ejecuta; consulta el selector de moneda se queda cargando.
- Un script reescribe el precio. Los selectores de variaciones, las vistas rápidas, las barras fijas de añadir al carrito y los scripts personalizados a veces copian un precio que guardaron al construirse la página, o lo recalculan en JavaScript. Compara el código fuente de la página (Ctrl+U) con lo que ves: un precio correcto en el código fuente y uno erróneo en pantalla apunta a un script.
Paso 4: dos conversores en un mismo sitio
Solo un plugin puede convertir los precios. Un segundo conversor choca con FOX: uno cambia el símbolo y el otro el importe, o ambos convierten y los precios salen duplicados o restablecidos. Los segundos conversores típicos son la función multimoneda de WooPayments (FOX muestra un aviso al respecto en las páginas de ajustes de WooCommerce), el multimoneda de WooCommerce Multilingual de WPML, los módulos de moneda de los constructores de páginas y complementos de temas como ShopEngine Pro, y un plugin de moneda usado anteriormente que sigue activo. Desactiva el otro, quédate con FOX y configura allí tus monedas.
Aísla la causa
Cuando ninguna de las comprobaciones anteriores señala al culpable, prueba en una copia de pruebas:
- Cambia a un tema por defecto como Storefront y desactiva todos los plugins excepto WooCommerce y FOX.
- Cambia de moneda en la tienda, en un producto y en el carrito. Si ahora los precios se convierten, la causa está en lo que has desactivado.
- Recupera primero el tema, después los plugins uno a uno, probando tras cada uno, hasta que los precios dejen de convertirse.
La FAQ la moneda se recalcula mal muestra una función real de un tema encontrada de esta manera.
Lista de comprobación
- El selector de la página es el widget, el shortcode o el selector lateral de FOX.
- La moneda seleccionada sigue seleccionada tras recargar la página.
- La moneda tiene una tasa real (ni 0 ni 1) y un código ISO reescrito a mano.
- El precio que falla tiene el marco rojo de la comprobación en consola, o su plantilla ya usa
get_price_html(). - No hay ningún segundo conversor de moneda activo; las cachés están vaciadas y los scripts de FOX no están retrasados.
Si los precios siguen sin cambiar, abre un tema en el foro de soporte de FOX con un enlace a una página donde ocurra, el resultado de la comprobación en consola y tu ajuste Es múltiple permitido (Is multiple allowed), y lo revisaremos.