Convertir un campo de precio de ACF a otra moneda en WordPress
Para convertir un campo de precio de ACF a otra moneda en WordPress, deja que WPCS lea el propio campo: [wpcs_price meta_value=property_price] toma el campo personalizado property_price de la entrada actual y lo muestra en la moneda que el visitante ha seleccionado. Cuando esto no funciona, el resultado está vacío o es 0.00, y la causa casi siempre es la clave meta o el formato del valor guardado. A continuación: la configuración, cómo encontrar la clave real, qué significa cada resultado erróneo y qué hacer con los repeaters, las páginas de opciones y los constructores de páginas.
Pon meta_value en [wpcs_price], no en [wpcs]
WPCS tiene dos shortcodes distintos. [wpcs] dibuja el selector de monedas; [wpcs_price] imprime un precio. meta_value es un atributo del shortcode de precio: [wpcs meta_value=property_price] muestra un selector y nada más, así que el campo nunca cambia. Usa ambos, cada uno en su sitio:
<?php
// header.php of a child theme: the switcher
echo do_shortcode('[wpcs show_flags=1 txt_type="desc"]');
?>
Y en el contenido, donde va el precio: [wpcs_price meta_value=property_price]. El shortcode lee el campo de la entrada actual, lo toma como un importe en tu moneda base y lo convierte con el tipo de cambio actual. Para un campo de otra entrada, añade su ID: [wpcs_price meta_value=property_price post_id=123]. Indica siempre meta_value junto con post_id: con post_id solo, el shortcode busca un campo llamado wpcs_price.
Los importes del campo deben estar en la moneda base, la seleccionada en la pestaña Monedas (Currencies) (consulta cómo funciona la moneda base). Si el campo contiene en cambio tu propio importe para cada moneda, como USD:15,EUR:20, añade type=fixed, como se describe en precios fijos por moneda.
Encuentra la clave meta real del campo
Un campo de ACF tiene tres identificadores, y solo uno de ellos sirve:
- Etiqueta del campo (Field Label), por ejemplo «Precio de la propiedad»: el texto que ven los editores. No es una clave.
- Nombre del campo (Field Name), por ejemplo
property_price: es la clave meta bajo la que ACF guarda el valor. Úsalo enmeta_value. - Clave del campo (Field Key), por ejemplo
field_5fb9732bdda1e: el ID interno de ACF, guardado en una segunda fila meta oculta,_property_price. No contiene ningún precio.
Los campos dentro de otros campos de ACF se guardan con nombres combinados. Un subcampo amount del grupo pricing se guarda como pricing_amount. Las filas del repeater prices se guardan como prices_0_amount, prices_1_amount y así sucesivamente, contando desde 0, de modo que [wpcs_price meta_value=prices_0_amount] imprime la primera fila. Los campos de una página de opciones de ACF y de los términos de taxonomía no son meta de entrada en absoluto; el shortcode no puede leerlos, y se convierten en PHP como se muestra más abajo.
Los temas y plugins que imprimen precios mediante sus propias funciones auxiliares ocultan la clave: el nombre de esa función, o la palabra que se le pasa, no es necesariamente la clave meta, y no se puede pasar una función al shortcode. Para ver qué guarda realmente una entrada, añade este fragmento un momento, abre la entrada con la sesión iniciada como administrador y lee la lista que aparece debajo del contenido:
/*
* Temporary: list all custom fields of the current post under its content,
* for administrators only. Child theme functions.php or a code snippets
* plugin. Remove it when you have found the key.
*/
add_filter('the_content', function ($content) {
if (is_singular() && current_user_can('manage_options')) {
$meta = get_post_meta(get_the_ID());
$content .= '<pre>' . esc_html(print_r($meta, true)) . '</pre>';
}
return $content;
});
Una línea como [property_price] => Array ( [0] => 250000 ) te da tanto la clave como el valor guardado. En un campo de ACF, la clave sin guion bajo contiene el valor y la que lleva guion bajo contiene la clave del campo. Para una guía específica de cada tema, consulta convertir los precios de anuncios de un tema.
Por qué el precio convertido de ACF no muestra nada o muestra 0.00
El plugin lee el texto guardado como un número desde su primer carácter y se detiene en el primer carácter que no forma parte de un número simple. Eso explica todos los resultados extraños:
| Guardado en el campo | Mostrado en la moneda base, formato 1,000.00 | Por qué |
|---|---|---|
| Nada, o clave errónea | Nada | El valor está vacío; vacío y 0 no muestran precio |
250000 o 1250.50 | 250,000.00 / 1,250.50 | Correcto |
$250,000 o € 250 | 0.00 | Un símbolo antes del número se lee como 0 |
250,000 | 250.00 | La lectura se detiene en la coma |
1.250 (miles con punto) | 1.25 | El punto se lee como separador decimal |
12,50 | 12.00 | Una coma decimal termina el número |
Así, un resultado vacío significa que la clave es errónea o que el campo está vacío en esta entrada; 0.00 o un importe mucho menor de lo esperado significa que la clave es correcta y el formato guardado es erróneo. La solución es un campo que solo pueda contener un número simple: en ACF, usa el tipo de campo Número (Number) para los precios y coloca los símbolos y palabras como «al mes» alrededor del shortcode, no dentro del campo. El formato, el símbolo y los separadores salen entonces de los ajustes de la moneda en WPCS.
Para las entradas en las que el precio está vacío a propósito, el filtro wpcs_price_free_text define el texto que [wpcs_price] imprime en lugar de nada. Se aplica a todos los precios vacíos o iguales a cero del sitio:
/*
* WPCS: text shown by [wpcs_price] when the amount is empty or 0.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('wpcs_price_free_text', function ($text) {
return 'Price on request';
});
Plantillas, repeaters y páginas de opciones: convierte en PHP
En una plantilla del tema, dentro del loop, ejecuta el mismo shortcode: echo do_shortcode('[wpcs_price meta_value=property_price]');. Para los valores que lees con funciones de ACF, pasa el número como value. Esto funciona con cada fila de un repeater:
<?php
// Child theme template: price list from the ACF repeater "prices"
// with the sub fields "label" and "amount" (amounts in the base currency).
if (have_rows('prices')) {
echo '<ul>';
while (have_rows('prices')) {
the_row();
$amount = (float) get_sub_field('amount');
echo '<li>' . esc_html(get_sub_field('label')) . ': '
. do_shortcode('[wpcs_price value=' . $amount . ']') . '</li>';
}
echo '</ul>';
}
// A field of an ACF options page:
$fee = (float) get_field('booking_fee', 'option');
echo do_shortcode('[wpcs_price value=' . $fee . ']');
// A field of a taxonomy term ($term_id is the ID of the term):
$from = (float) get_field('from_price', 'term_' . $term_id);
echo do_shortcode('[wpcs_price value=' . $from . ']');
?>
Si un antiguo campo de texto ya contiene valores como 250,000, límpialos antes de convertir: (float) str_replace(array(',', ' '), '', $raw) convierte 250,000 en 250000. Para mostrar precios, prefiere el shortcode a $WPCS->wpcs_exchange_value(): el shortcode añade el símbolo de la moneda, y solo su salida se redibuja para cada visitante cuando está activada la opción Uso un plugin de caché en mi sitio (I am using cache plugin on my site).
Constructores de páginas y campos dinámicos
Una etiqueta dinámica que muestra un campo de ACF en un constructor de páginas imprime el valor tal como está guardado; no pasa por WPCS. Coloca en su lugar el elemento de shortcode del constructor, con [wpcs_price meta_value=property_price] dentro. En las plantillas de entrada individual y en las plantillas de elemento de loop, la entrada actual es la que se está mostrando, así que cada tarjeta muestra su propio precio.
Dos cosas no funcionan: un shortcode escrito en un campo de texto de ACF (el campo devuelve su texto tal cual, a menos que la plantilla lo pase por do_shortcode()) y [wpcs_price] colocado dentro de una celda o un atributo del shortcode o de la tabla de otro plugin que no procesa shortcodes. En ambos casos el código aparece como texto. Mueve el precio a un lugar que ejecute shortcodes, o imprímelo en PHP.
Lista de comprobación
meta_valueestá en[wpcs_price], con el Nombre del campo (Field Name) de ACF (o el nombre combinado en los campos de grupo y de repeater).- El campo guarda un número simple en la moneda base:
250000o1250.50. - Fuera de la propia página de la entrada,
post_idse indica junto conmeta_value. - Los campos de la página de opciones y de los términos se leen con
get_field()y se convierten condo_shortcode(). - El fragmento temporal que lista los campos meta se ha eliminado.
Si el campo sigue sin mostrar nada, abre un tema en el foro de soporte de WPCS con el shortcode, la clave meta y el valor de la lista de campos meta.