Añadir margen al tipo de cambio en WordPress o fijar un tipo manual
Los precios convertidos en un sitio WordPress pueden diferir de Google o XE en unos pocos puntos porcentuales, y muchos propietarios quieren esa diferencia a propósito: añaden un margen al tipo de cambio para cubrir las comisiones de conversión, o mantienen un tipo fijo, como 1 EUR = 1 CHF, que las actualizaciones automáticas no deben sobrescribir. En WPCS – WordPress Currency Switcher los tres casos se reducen a la misma pregunta: de dónde viene el tipo de cambio y cuándo cambia. Este artículo lo explica y después muestra cómo añadir un margen por moneda sin código, un margen porcentual con código y tipos manuales fijos.
Por qué los precios convertidos difieren de Google o XE
WPCS no calcula los tipos de cambio. Para cada moneda pide el tipo respecto a tu moneda base al servicio seleccionado en Agregador de divisas (Currency aggregator) (pestaña Opciones (Options) de Ajustes (Settings) → Currency Switcher), guarda ese número en la fila de la moneda y multiplica tus precios por él: [wpcs_price value=100] muestra 100 × el tipo. Una diferencia con Google o XE tiene una de estas causas:
- Una fuente distinta. Google y XE muestran tipos de mercado en vivo. Los agregadores de bancos centrales (el BCE, el Narodowy Bank Polski y los bancos nacionales de Rumanía, Hungría, Moldavia y Ucrania) publican un tipo de referencia oficial por día laborable. Los servicios comerciales (Open exchange rates, Currencylayer, Fixer, Currencyapi) se actualizan con un intervalo que depende de tu plan. En las divisas principales las fuentes coinciden bastante; en monedas como KES, GHS o NGN pueden diferir en varios puntos porcentuales.
- Un tipo antiguo. El sitio usa el tipo guardado en la última actualización. Actualización automática de tipos (Rate auto update), en la pestaña Opciones (Options), lo refresca cada hora, dos veces al día (el valor predeterminado), a diario, cada semana o cada mes, mediante WP-Cron. WP-Cron solo se ejecuta cuando alguien visita el sitio, así que en un sitio con poco tráfico una actualización puede llegar tarde.
- Tus propios cambios. Un margen en el campo de interés o en código (ambos más abajo), un tipo escrito a mano o el redondeo del precio convertido.
Para acercarte a los tipos de mercado, cambia a un agregador comercial: elígelo en Agregador de divisas (Currency aggregator), pega la clave de ese servicio en Clave API del agregador (Aggregator API key), guarda y pulsa Actualizar todos los tipos (Update all rates) en la pestaña Monedas (Currencies), seguido de Guardar opciones (Save options). Los mensajes de error y los límites de solicitudes de la API se explican en errores de los tipos de cambio. También puedes conectar cualquier otra fuente de tipos como agregador personalizado.
Comprueba el tipo que usa realmente tu sitio
El campo del tipo en la pestaña Monedas (Currencies) muestra el tipo guardado del agregador. El front-end usa ese tipo más el margen que haya. Para ver el tipo final, coloca esto en una página en borrador:
[wpcs_code_rate code=GBP]
[wpcs_price value=100]
La primera línea imprime el tipo de GBP con el que se convierten los precios, con el interés y los cambios de código incluidos; la segunda debe ser igual a 100 veces ese tipo cuando GBP está seleccionada. Compara la primera línea con tu fuente, no el precio convertido con una web de conversión: esa comparación mezcla tipo, redondeo y decimales.
Añadir un margen al tipo de cambio sin código: el campo de interés
Cada fila de moneda tiene un segundo campo tras el tipo, con un signo más entre ambos y el texto de ejemplo interés (interest). En el front-end el plugin usa tipo + interés. El interés es una cantidad que se suma al tipo, no un porcentaje:
| Base USD | Tipo | Interés | Tipo usado | Margen |
|---|---|---|---|---|
| EUR | 0.86 | 0.0258 | 0.8858 | 3% |
| JPY | 151.30 | 4.539 | 155.839 | 3% |
| INR | 88.20 | -0.882 | 87.318 | -1% |
Para obtener un porcentaje, multiplica el tipo actual por él (el 3 % de 0,86 es 0,0258) y escribe el resultado. Como la cantidad se mantiene mientras el tipo se mueve, el porcentaje se desvía un poco con el tiempo; recalcúlalo de vez en cuando o usa el código de abajo. Un interés negativo reduce el tipo. La página de ajustes muestra siempre el tipo sin el interés, de modo que el agregador puede seguir actualizando el tipo mientras tu margen queda aparte. El conversor, la tabla de tipos y el icono de información del precio usan el mismo tipo más el interés que tus precios.
Usa el campo de interés solo para monedas cuyo tipo se actualice sin errores. Cuando una actualización automática no obtiene el tipo de una moneda, esa moneda conserva el tipo que el sitio está usando en ese momento, que ya contiene el interés, y se guarda como nuevo tipo almacenado; cada actualización fallida vuelve a sumar el margen. Revisa esas filas después de un error del agregador, o usa la versión con código, que no tiene este efecto. Por la misma razón, después de Actualizar todos los tipos (Update all rates) pulsa siempre Guardar opciones (Save options) antes de salir de la página.
Un margen porcentual con código
El filtro wpcs_currency_data_manipulation modifica los datos de las monedas cada vez que el plugin los lee, así que un porcentaje sigue siendo un porcentaje sea cual sea el tipo. El plugin también lee esos datos en su página de ajustes y al actualizar los tipos, y los vuelve a escribir. Un margen añadido ahí se guardaría en el tipo almacenado y luego se sumaría otra vez, por lo que el fragmento se salta esos momentos:
/*
* WPCS: add a percentage markup to exchange rates on the front end.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('wpcs_currency_data_manipulation', function ($currencies) {
// Keep stored rates clean: no markup on the plugin settings page,
// during automatic rate updates and in the "Update all rates" request.
if ((is_admin() && !wp_doing_ajax())
|| wp_doing_cron()
|| (isset($_REQUEST['action']) && $_REQUEST['action'] === 'wpcs_save_etalon')) {
return $currencies;
}
$markup = array(
'EUR' => 3, // +3 %
'GBP' => 2.5, // +2.5 %
);
foreach ($markup as $code => $percent) {
if (isset($currencies[$code]['rate'])) {
$currencies[$code]['rate'] = (float) $currencies[$code]['rate'] * (1 + $percent / 100);
}
}
return $currencies;
});
No incluyas la moneda base. El filtro se ejecuta después de añadir el campo de interés, así que usa uno u otro para una moneda, no ambos. El ejemplo breve de la FAQ sobre establecer los tipos manualmente no tiene esa comprobación: por sí solo suma el margen de nuevo cada vez que se guardan los ajustes.
Mantener un tipo manual fijo, como 1:1
Algunos sitios quieren el mismo número en dos monedas (un libro a 20 EUR y 20 CHF), o un tipo pactado con un socio. El campo del tipo acepta cualquier número que escribas; lo que hay que hacer es impedir que el plugin lo reemplace.
Todos los tipos fijados a mano
- En la pestaña Monedas (Currencies), escribe el tipo en la fila, por ejemplo 1 para CHF cuando la moneda base es EUR.
- En la pestaña Opciones (Options), define Actualización automática de tipos (Rate auto update) como sin actualización automática (no auto update).
- Pulsa Guardar opciones (Save options).
A partir de ahora los tipos solo cambian cuando tú los cambias. Evita Actualizar todos los tipos (Update all rates) y el botón de actualización de la fila: traen tipos nuevos del agregador al formulario, y al guardar se reemplazaría tu tipo fijo. Si pulsas uno por error, vuelve a escribir el tipo antes de guardar.
Un tipo fijo mientras los demás se actualizan
Actualización automática de tipos (Rate auto update) funciona para todas las monedas a la vez; no hay un bloqueo por moneda. Para mantener CHF en 1 mientras las demás monedas siguen el mercado, fíjalo en código. El agregador puede seguir actualizando el tipo guardado de CHF, pero el sitio siempre usa 1:
/*
* WPCS: always use 1 EUR = 1 CHF (the base currency is EUR).
* Child theme functions.php or a code snippets plugin.
*/
add_filter('wpcs_currency_data_manipulation', function ($currencies) {
if (isset($currencies['CHF'])) {
$currencies['CHF']['rate'] = 1;
}
return $currencies;
});
Un tipo fijado da siempre el mismo resultado, por lo que este fragmento no necesita ninguna comprobación de administración. Anula el campo de interés de esa moneda. Si quieres tu propia cantidad por precio en lugar de un único tipo, por ejemplo 20 EUR pero 19 CHF, usa en su lugar los precios fijos por moneda.
Cuando el intervalo de actualización no cambia
El plugin programa su tarea de actualización una sola vez, con el intervalo seleccionado en ese momento. Elegir otro intervalo más tarde no reemplaza la programación existente, así que sigue ejecutándose el intervalo antiguo. Para aplicar el nuevo, elimina el evento programado wpcs_currencies_rate_auto_update (con un plugin gestor de cron o con WP-CLI: wp cron event delete wpcs_currencies_rate_auto_update); el plugin lo programa de nuevo con el ajuste actual en la siguiente visita a una página. Si los tipos no se actualizan en absoluto, lee por qué no funciona la actualización automática de tipos.
Lista de comprobación
[wpcs_code_rate code=XXX]muestra el tipo que esperas, y[wpcs_price value=100]es igual a 100 veces ese tipo.- El agregador y su clave API se ajustan a la precisión que necesitas.
- Cada moneda tiene un margen en el campo de interés o en código, nunca en ambos, y la moneda base no tiene ninguno.
- Tipos fijos: Actualización automática de tipos (Rate auto update) está en sin actualización automática (no auto update), o el tipo está fijado en código.
- Las cachés de página se vacían tras cambiar los tipos; las páginas en caché muestran los precios antiguos hasta entonces.
Si el tipo usado sigue difiriendo de la fuente más de lo que puedes explicar, publica el agregador, la moneda y la salida de [wpcs_code_rate] en el foro de soporte de WPCS.