Convertir precios de inmuebles a otra moneda en WordPress
Para convertir los precios de inmuebles a otra moneda en WordPress, el precio tiene que pasar por el selector de monedas. Un tema de inmobiliaria, anuncios clasificados, alquiler o reservas imprime sus precios con su propio código, así que cuando un visitante elige otra moneda en el selector de WPCS, esos precios se quedan como están. WPCS convierte lo que imprimen su shortcode [wpcs_price] y sus funciones de PHP. La solución es hacer que el tema imprima su precio a través de ellos. Normalmente eso significa cambiar un archivo de plantilla o una función en un tema hijo, y los pasos son los mismos para anuncios de inmuebles, alquileres, tours y clasificados.
Por qué los precios del tema y de los anuncios no cambian de moneda
El selector no busca números en la página. Guarda la moneda del visitante, y cada precio impreso con [wpcs_price] se calcula en esa moneda: el importe en tu moneda base multiplicado por el tipo de cambio, con formato y con el símbolo de la moneda. Un tema que lee property_price de los metadatos de la entrada e imprime $250,000 con su propio formato nunca consulta a WPCS, así que sus precios no pueden cambiar.
Dos cosas deben estar en orden antes de empezar:
- Los importes que guarda el tema deben estar en la moneda base de WPCS, aquella cuyo botón de opción está seleccionado en la pestaña Monedas (Currencies) y cuyo tipo de cambio es 1. Si los anuncios se introducen en euros, haz que EUR sea la moneda base.
- El valor guardado debe ser un número simple como
250000o1250.50. Un texto como250,000,$250ko Precio a consultar se lee como un número erróneo o no se lee en absoluto; por eso los precios en forma de texto necesitan el tratamiento aparte que se muestra más abajo, y los números con formato deben limpiarse antes.
Encuentra dónde imprime el tema el precio
Abre un anuncio y mira el HTML del precio en el inspector del navegador: su clase CSS (por ejemplo item-price o listing-price) es un buen término de búsqueda. Después busca esa clase en la carpeta del tema, junto con las llamadas a get_post_meta cercanas. Encontrarás una de estas tres cosas:
- Un archivo de plantilla (una tarjeta, la página de un anuncio individual) que lee el campo meta y lo imprime con echo;
- una función del tema como
theme_listing_price()que construye el HTML del precio y se llama desde varias plantillas; - un shortcode del tema o un widget que muestra el precio.
La misma búsqueda te dice la clave meta que contiene el importe, el segundo argumento de get_post_meta(). Si el tema es complejo, su autor puede indicar la plantilla, la función y la clave meta en una sola respuesta. Haz todos los cambios en un tema hijo, porque una actualización del tema sustituye los archivos del tema padre.
Imprime el precio con [wpcs_price]
Dentro del loop o en la página de un anuncio individual, el shortcode puede leer él mismo el campo meta; meta_value es la clave meta y se usa la entrada actual:
<?php echo do_shortcode('[wpcs_price meta_value="property_price"]'); ?>
Fuera del loop (una barra lateral, una ventana emergente del mapa, un bloque de anuncios relacionados), añade post_id: [wpcs_price post_id="123" meta_value="property_price"]. Cuando el código del tema ya tiene el importe en una variable, pásalo como value, y deja los precios en forma de texto como texto:
<?php
// Child theme copy of the template that prints the listing price.
// "property_price" is an example: use the meta key your theme uses.
$amount = get_post_meta(get_the_ID(), 'property_price', true);
if (is_numeric($amount)) {
echo do_shortcode('[wpcs_price value="' . (float) $amount . '"]');
} else {
echo esc_html($amount); // "Price on request" and other text
}
?>
Elimina el símbolo de moneda propio del tema alrededor de la salida antigua: [wpcs_price] imprime por sí mismo el símbolo de la moneda seleccionada; de lo contrario obtendrás dos símbolos. Los prefijos y sufijos como Desde o / mes se mantienen tal cual; convierte cada número por separado cuando un anuncio tenga un precio de oferta y un precio de alquiler.
Archivos de plantilla
Los archivos que el tema carga con get_template_part() o locate_template() se pueden sobrescribir: copia el archivo a la misma ruta dentro del tema hijo y edita la copia. WordPress carga primero la versión del tema hijo.
Funciones del tema
Muchos temas declaran sus funciones de plantilla dentro de if ( ! function_exists( 'theme_listing_price' ) ). El functions.php del tema hijo se carga antes que el del tema padre, así que una función con el mismo nombre definida allí sustituye la versión del tema en todos los sitios donde se usa. Copia la función original, conserva lo que devuelve o imprime y cambia solo el importe:
/*
* Child theme functions.php. Works only when the parent theme wraps
* theme_listing_price() in if ( ! function_exists() ). The function
* and meta key names are examples: use the ones from your theme.
*/
function theme_listing_price() {
$amount = get_post_meta(get_the_ID(), 'property_price', true);
if (!is_numeric($amount)) {
return esc_html($amount);
}
return do_shortcode('[wpcs_price value="' . (float) $amount . '"]');
}
Houzez, por ejemplo, construye los precios de los anuncios en houzez_listing_price(), declarada de esta forma. Comprueba la versión de tu tema antes de copiar cualquier función, ya que sus detalles internos cambian de una versión a otra.
Shortcodes del tema
Cuando el precio viene de un shortcode del tema, registra un nuevo manejador para la misma etiqueta después de que el tema haya registrado el suyo:
/*
* Child theme functions.php: replace the theme shortcode [listing_price]
* with a version that prints the price through WPCS.
* "listing_price" and "property_price" are examples.
*/
add_action('init', function () {
remove_shortcode('listing_price');
add_shortcode('listing_price', function ($atts) {
$atts = shortcode_atts(array('id' => get_the_ID()), $atts);
$amount = get_post_meta((int) $atts['id'], 'property_price', true);
if (!is_numeric($amount)) {
return esc_html($amount);
}
return do_shortcode('[wpcs_price value="' . (float) $amount . '"]');
});
}, 99);
Si el tema ofrece un filtro sobre la salida de sus precios, ese es el lugar más limpio de todos: devuelve la salida de [wpcs_price] desde la función de retorno de tu filtro y no hace falta copiar nada del tema.
Plugins de anuncios, de reservas y constructores de páginas
Cuando los anuncios vienen de un plugin (un directorio, un plugin de alquileres o de reservas) o de un widget de un constructor de páginas, el precio lo imprime el código de ese plugin, y se aplica la misma regla: su salida tiene que pasar por [wpcs_price]. Busca una de estas opciones, por este orden:
- un hook de filtro sobre el HTML del precio o sobre el importe con formato;
- un sistema de sobrescritura de plantillas (muchos plugins cargan primero sus plantillas desde una carpeta del tema activo);
- una plantilla de tarjeta que diseñas tú mismo. En una plantilla Loop Item de Elementor Pro, por ejemplo, coloca un widget Shortcode con
[wpcs_price meta_value="your_price_key"]donde va el precio; el shortcode lee el campo meta de cada anuncio del loop.
Si no existe ninguna, pide al autor del plugin un hook o la ruta de la plantilla. Un precio dentro de un widget que no ofrece hook, plantilla ni ajuste para ello no se puede convertir desde fuera.
Totales calculados: convierte en PHP
Los totales que calcula tu código, como noches multiplicadas por el precio por noche, un depósito o una tarifa, deben calcularse en la moneda base y convertirse una sola vez, al mostrarlos:
<?php
// Calculate in the base currency, convert only for display.
$per_night = (float) get_post_meta(get_the_ID(), 'price_per_night', true);
$total = $nights * $per_night; // $nights comes from your booking form
// Full price HTML with the currency symbol (also redrawn on cached pages):
echo do_shortcode('[wpcs_price value="' . $total . '"]');
// Or only the converted number, formatted for the selected currency:
global $WPCS;
if (isset($WPCS)) {
echo esc_html($WPCS->wpcs_exchange_value($total));
}
?>
$WPCS->wpcs_exchange_value() devuelve una cadena con formato y con los separadores de la moneda seleccionada, así que no calcules con su resultado. Imprime el código de la moneda a su lado con $WPCS->current_currency si lo necesitas. En un sitio con caché de página, prefiere el shortcode: con Uso un plugin de caché en mi sitio (I am using cache plugin on my site) activado, solo la salida de [wpcs_price] se redibuja para cada visitante (consulta el selector de monedas y los plugins de caché).
Comprueba el resultado y conoce los límites
- Cambia de moneda en la tarjeta de un anuncio y en la página de un anuncio individual: el importe, el símbolo y el formato deben cambiar en ambas.
- Los precios de anuncios en una moneda que los servicios de tipos de cambio no cubren necesitan un tipo de cambio escrito a mano; consulta errores de tipos de cambio.
- Los filtros de búsqueda del tema y la ordenación por precio siguen funcionando con los importes guardados en la moneda base; no convierten.
- WPCS cambia cómo se muestran los precios. Los pagos, las reservas, las facturas y los correos siguen en la moneda que usa el tema o el plugin de reservas. Para una tienda WooCommerce, el plugin hermano FOX cambia también la moneda del carrito y del checkout; consulta WPCS o FOX.
Si el tema imprime sus precios de una forma a la que ninguno de estos métodos llega, abre un tema en el foro de soporte de WPCS con el nombre del tema, la plantilla o la función que imprime el precio y la clave meta que lee.