El selector de moneda de WooCommerce no actualiza los tipos de cambio
Cuando los tipos de cambio del selector de moneda de WooCommerce no se actualizan, el síntoma es uno de estos tres: un campo de tasa muestra no data for ... o 0 después de pulsar Actualizar todas las tarifas (Update all rates), los tipos de cambio nunca cambian por sí solos, o cambian pero no coinciden con lo que muestra Google. Cada uno tiene una causa distinta, y FOX rara vez se inventa un número: consulta a un proveedor de tipos de cambio, guarda lo que le devuelve y multiplica tus precios por ese valor. Esta guía explica cómo funciona, cómo resolver cada síntoma y cómo tomar el control de los tipos de cambio cuando los automáticos no son lo que quieres.
Cómo actualiza FOX los tipos de cambio
La fuente de los tipos de cambio es el Agregador de moneda (Currency aggregator) de la pestaña Opciones (Options) de los ajustes de FOX (WooCommerce → Ajustes → Moneda), con su clave en Clave de API de agregador (Aggregator API key) si el proveedor la necesita. Para cada moneda excepto la base, FOX envía una solicitud a ese agregador y le pregunta cuántas unidades de esa moneda se compran con una unidad de tu moneda base. Una tienda en USD con un tipo de cambio de 0,92 para EUR muestra un producto de 100 USD a 92 EUR.
Los tipos de cambio se actualizan de dos maneras, y cada una trata los fallos de forma distinta:
- Actualizar todas las tarifas (Update all rates) en la pestaña Divisas (Currencies), y el botón de actualizar junto a cada tipo de cambio, rellenan los campos con las respuestas. No se guarda nada hasta que pulsas Guardar. Una moneda que el agregador no puede cotizar recibe el texto del error en su campo, y al guardar ese campo se almacena 0.
- La actualización programada, definida con Valorar la actualización automática (Rate auto update), solo guarda tipos de cambio mayores que cero. Una moneda cuya solicitud falla conserva su tipo de cambio anterior, sin avisar.
Así que un 0 casi siempre proviene de una actualización manual que se guardó, y un tipo de cambio congelado, de una actualización programada que no se ejecuta o que falla una y otra vez para esa moneda.
"No data for" o un tipo de cambio de 0
Pulsa el botón de actualizar junto a la moneda y lee el texto que aparece en el campo del tipo de cambio. Casi siempre señala la causa:
- El agregador no tiene datos para el par. Ningún proveedor cubre todas las monedas. Yahoo tiene huecos en muchos pares exóticos (el mensaje dice There is no data for these currencies: USD/XXX). La fuente del Banco Central Europeo publica unas treinta monedas principales y calcula otras monedas base a partir de sus tipos en euros. CryptoCompare cubre las criptomonedas y no todas las monedas fiduciarias, y Pulse Verity solo gestiona criptomonedas, con USD como moneda base. Cambia de agregador y vuelve a probar.
- El código de moneda no es un código real.
EURO,CAD$o un código con un carácter invisible pegado desde una página web no devuelve nada en ningún agregador. Borra el código, escribe a mano las tres letras del código ISO 4217 y guarda. Una moneda que realmente no tiene código ISO necesita un tipo de cambio manual; consulta códigos de moneda personalizados. - Falta la clave de API o es incorrecta. Currencyapi, Tipos de cambio abiertos (Open exchange rates), Jugador de dinero (Currencylayer) y Fijador (Fixer) necesitan una clave del sitio del proveedor en Clave de API de agregador (Aggregator API key). Los mensajes que empiezan por Aggregator Error: vienen del proveedor e indican qué ha rechazado.
- El plan gratuito no admite tu moneda base. Varios proveedores atienden las claves gratuitas solo para una moneda base, por ejemplo USD en Open exchange rates y Currencylayer, y EUR en Fixer. Una tienda con otra moneda base recibe un error como Changing the API base currency is available for ... plan clients. Usa un plan que lo permita u otro agregador.
- Se ha agotado la cuota de solicitudes. FOX hace una solicitud por moneda en cada actualización. Ocho monedas además de la base, actualizadas cada hora, suman unas 5.800 solicitudes al mes, lo que supera muchas cuotas gratuitas; cuando la cuota se agota, el proveedor deja de responder. Elige un intervalo más largo en Valorar la actualización automática (Rate auto update) para que el total mensual encaje.
- El servidor no puede llegar al proveedor. Una instalación de desarrollo local, un cortafuegos que bloquea el HTTPS saliente o una configuración de cURL o SSL defectuosa detienen todas las solicitudes. FOX escribe estos fallos en el registro de errores de PHP como líneas que empiezan por
[WOOCS] wp_remote_get error:.
El camino para resolverlo es el mismo en todos los casos: corrige el código, elige un agregador que cubra todas tus monedas para tu moneda base, pega su clave, pulsa Actualizar todas las tarifas (Update all rates), comprueba que todos los campos contienen un número y solo entonces pulsa Guardar.
Nunca dejes un tipo de cambio en 0
Un tipo de cambio de 0 multiplica por cero todos los precios, tarifas y gastos de envío en esa moneda, de modo que los productos pueden pedirse gratis, y los cálculos que dividen por el tipo de cambio pueden detener la página con un error fatal Division by zero. Si una moneda no puede cotizarse automáticamente, dale un tipo de cambio manual (más abajo) o elimínala. Para protegerte de un proveedor que devuelva un valor descabellado, define Límite inferior/superior de tasa (Rate floor/ceiling) para la moneda en la pestaña Divisas (Currencies): un tipo de cambio obtenido por debajo de la Tasa mínima posible (Minimum possible rate) o por encima de la Tasa máxima posible (Maximum possible rate) se sustituye por ese límite. Las páginas que muestran precios de 0 por otros motivos se tratan en el recálculo de moneda falla: doble, cero y otros casos.
Los tipos de cambio no se actualizan automáticamente
Elige un intervalo en Valorar la actualización automática (Rate auto update), desde especial: cada minuto (special: each minute) hasta mensual (monthly), y pulsa Guardar. La programación empieza a contar desde ese momento. Debajo de la opción, FOX muestra el estado del programador: Última ejecución (Last run), Próxima ejecución (Next run) y el intervalo, o sin programación guardada aún (no schedule stored yet) si la opción nunca se guardó.
La programación es propia de FOX, no de WP-Cron, y se ejecuta en la primera solicitud que carga WordPress después de la hora prevista: una visita a una página, una página de administración, una solicitud AJAX o REST. Esto tiene tres consecuencias:
- La hora exacta no se puede fijar en los ajustes, y en un sitio con poco tráfico una actualización puede ejecutarse tarde. Próxima ejecución (Next run) muestra entonces con retraso de ..., a la espera de la siguiente solicitud que cargue WordPress (overdue by ..., waiting for the next request that loads WordPress).
- Las páginas servidas por una caché de página completa o una CDN no cargan WordPress. Un sitio cuyos visitantes solo reciben páginas en caché puede pasar mucho tiempo sin una actualización.
DISABLE_WP_CRONenwp-config.phpno le afecta.
Para que las actualizaciones sean puntuales, haz que una tarea cron del servidor solicite cada pocos minutos cualquier URL del sitio que no esté en caché, por ejemplo https://your-site.com/wp-cron.php; así se carga WordPress y se ejecuta la actualización pendiente. Para actualizar a una hora fija, en cambio, establece Valorar la actualización automática (Rate auto update) en sin actualización automática (no auto update) y ejecuta la acción de actualización desde el crontab del servidor con WP-CLI a la hora que quieras:
# crontab: update FOX rates every day at 06:00 server time
0 6 * * * cd /path/to/wordpress && wp eval 'do_action("woocs_update_rates_wpcron");'
La acción está documentada como woocs_update_rates_wpcron. Si el plugin es anterior a la versión 2.5.3, actualízalo primero: en versiones anteriores la programación podía reiniciarse una y otra vez en tiendas con tráfico constante de la API REST y no llegar a ejecutarse nunca.
Cómo comprobar que funciona
Un agregador suele devolver el mismo tipo de cambio que devolvió hace una hora, lo que parece "no se actualiza". Para comprobarlo, escribe un tipo de cambio claramente erróneo, como 7777, en una moneda, guarda y espera un intervalo: la actualización programada debería sustituirlo. Aviso por correo electrónico sobre los resultados de "Valorar la actualización automática" (Email notice about "Rate auto update" results) en la pestaña Opciones (Options) envía al administrador una lista de tipos de cambio después de cada ejecución programada. La lista muestra todas las monedas con su tipo de cambio actual, incluida una moneda cuya solicitud falló y conservó su valor anterior, y se envía con mail() de PHP, por lo que un plugin de SMTP no la entrega. Si no llega ningún correo, la línea Última ejecución (Last run) es el mejor testigo.
Mantener tipos de cambio manuales o usar tu propia fuente
Los tipos de cambio automáticos son opcionales. Las formas de tomar el control, de la más sencilla a la más flexible:
- Todos los tipos de cambio a mano. Establece Valorar la actualización automática (Rate auto update) en sin actualización automática (no auto update), escribe los tipos de cambio y guarda. Nada los sobrescribe.
- Una moneda a mano, el resto automático. El filtro woocs_add_custom_rate responde por las monedas elegidas antes de consultar al agregador, tanto en las actualizaciones programadas como en los botones de actualización. Después de añadirlo, pulsa Actualizar todas las tarifas (Update all rates) y Guardar, o espera a la siguiente ejecución programada:
/* * Fixed rate for one currency, automatic rates for the others. * Child theme functions.php or a code snippets plugin. */ add_filter('woocs_add_custom_rate', function ($rate, $base_currency, $currency) { if ($currency === 'NGN') { return 1550; // 1 unit of the base currency = 1550 NGN } return $rate; // false: the aggregator decides }, 10, 3); - Un margen sobre el tipo de cambio. El campo de interés junto a cada tipo de cambio, en la columna Tasa +% (Rate+%), suma una cantidad fija (
0.15) o un porcentaje (2%) al tipo de cambio almacenado, de modo que las actualizaciones conservan tu margen. Más información en cómo ajustar los tipos de cambio manualmente. - Tu propia fuente de tipos de cambio. Los filtros woocs_announce_aggregator y woocs_add_aggregator_processor añaden un agregador que lee la API de tu banco, un archivo XML o un feed CSV; el procesador se llama una vez por moneda y devuelve el tipo de cambio. Cómo añadir un agregador de tipos de cambio personalizado incluye un ejemplo que funciona. Para la fuente Narodowy Bank Polsky, woocs_bank_polski_table cambia de la tabla A a otra tabla.
- Tipos de cambio escritos por tu código. Los tipos de cambio se almacenan en la opción
woocs, indexados por código de moneda. Léela conget_option(), no con$WOOCS->get_currencies(), que devuelve los tipos de cambio con el interés ya sumado:
Para reaccionar a cada actualización programada, por ejemplo para registrar los tipos de cambio o pasarlos a otro sistema, usa la acción woocs_sheduler_rates_updated, que recibe las monedas actualizadas.$currencies = get_option('woocs', array()); if (isset($currencies['EUR'])) { $currencies['EUR']['rate'] = 0.9215; update_option('woocs', $currencies); }
Por qué el tipo de cambio difiere del de Google
FOX usa exactamente el tipo de cambio que devolvió el agregador seleccionado en la última actualización. Google, XE y las aplicaciones bancarias muestran tipos de cambio de sus propios proveedores de datos, normalmente un tipo medio de mercado en directo, así que una diferencia no significa un error. Los motivos habituales:
- Fuentes y momentos distintos. El agregador de Yahoo toma el valor de apertura de la última barra de precios diaria, que por la tarde puede tener varias horas. El Banco Central Europeo publica sus tipos de referencia una vez cada día laborable. Los planes gratuitos de otros proveedores suelen actualizarse cada hora o cada día. Los tipos de cambio que siguen el mercado con una diferencia de minutos requieren un proveedor y un plan que se actualicen con esa frecuencia, y un intervalo equivalente en Valorar la actualización automática (Rate auto update).
- Tus propios ajustes. Un valor de interés en Tasa +% (Rate+%), un límite de Límite inferior/superior de tasa (Rate floor/ceiling), un filtro
woocs_add_custom_rate, código de redondeo o precios fijos por moneda alejan el precio mostrado de una conversión simple. Revisa el código de redondeo y los precios fijos del producto antes de culpar al tipo de cambio. - Precios que cambian mientras el tipo de cambio no. Si los precios se mueven mientras los campos de tipo de cambio siguen igual, hay algo más que convierte o modifica precios: un segundo plugin de monedas, un plugin de precios dinámicos o una caché de página que sirve una página antigua.
Para igualar los tipos de cambio, elige el agregador cuyos números coincidan con la referencia en la que confías, actualiza con más frecuencia dentro de su cuota o fija el tipo de cambio a mano para las monedas en las que la diferencia importa.
Lista de verificación
- Cada código de moneda es un código ISO simple de tres letras, escrito a mano.
- El agregador cubre todas tus monedas para tu moneda base, y su clave y su plan admiten esa moneda base.
- Actualizar todas las tarifas (Update all rates) rellena todos los campos con un número antes de pulsar Guardar; ningún tipo de cambio es 0.
- Valorar la actualización automática (Rate auto update) guardado, Última ejecución (Last run) reciente y solicitudes al mes dentro de la cuota del proveedor.
- En un sitio totalmente en caché, una tarea cron del servidor solicita una URL sin caché.
- Límite inferior y superior definidos para las monedas en las que un tipo de cambio erróneo causaría daño.
Si una moneda sigue sin actualizarse con un código correcto y un agregador que funciona, abre un tema en el foro de soporte de FOX con la moneda base, el agregador, el texto que aparece en el campo del tipo de cambio y las líneas [WOOCS] del registro de errores de PHP, y lo revisaremos.