Convertir un champ de prix ACF dans une autre devise sous WordPress
Pour convertir un champ de prix ACF dans une autre devise sous WordPress, laissez WPCS lire le champ lui-même : [wpcs_price meta_value=property_price] prend le champ personnalisé property_price de l'article courant et l'affiche dans la devise choisie par le visiteur. Lorsque cela ne fonctionne pas, le résultat est soit vide, soit 0.00, et la cause est presque toujours la clé meta ou le format de la valeur enregistrée. Vous trouverez ci-dessous la configuration, la façon de trouver la vraie clé, ce que signifie chaque mauvais résultat, et que faire avec les répéteurs, les pages d'options et les constructeurs de pages.
Placez meta_value sur [wpcs_price], pas sur [wpcs]
WPCS propose deux shortcodes distincts. [wpcs] dessine le sélecteur ; [wpcs_price] affiche un prix. meta_value est un attribut du shortcode de prix : [wpcs meta_value=property_price] n'affiche qu'un sélecteur et rien d'autre, et le champ ne change donc jamais. Utilisez les deux, chacun à sa place :
<?php
// header.php of a child theme: the switcher
echo do_shortcode('[wpcs show_flags=1 txt_type="desc"]');
?>
Et dans le contenu, à l'endroit du prix : [wpcs_price meta_value=property_price]. Le shortcode lit le champ de l'article courant, le considère comme un montant dans votre devise de base et le convertit au taux actuel. Pour le champ d'un autre article, ajoutez son ID : [wpcs_price meta_value=property_price post_id=123]. Indiquez toujours meta_value avec post_id : avec post_id seul, le shortcode cherche un champ nommé wpcs_price.
Les montants du champ doivent être dans la devise de base, celle qui est sélectionnée dans l'onglet Devises (Currencies) (voir comment fonctionne la devise de base). Si le champ contient plutôt votre propre montant pour chaque devise, comme USD:15,EUR:20, ajoutez type=fixed, comme décrit dans les prix fixes par devise.
Trouver la vraie clé meta du champ
Un champ ACF possède trois identifiants, et un seul fonctionne :
- Libellé du champ (Field Label), par exemple « Prix du bien » : le texte que voient les éditeurs. Ce n'est pas une clé.
- Nom du champ (Field Name), par exemple
property_price: c'est la clé meta sous laquelle ACF enregistre la valeur. Utilisez-la dansmeta_value. - Clé du champ (Field Key), par exemple
field_5fb9732bdda1e: l'ID interne d'ACF, stocké dans une seconde ligne meta masquée,_property_price. Elle ne contient aucun prix.
Les champs placés dans d'autres champs ACF sont enregistrés sous des noms combinés. Un sous-champ amount du groupe pricing est stocké sous pricing_amount. Les lignes du répéteur prices sont stockées sous prices_0_amount, prices_1_amount et ainsi de suite, en comptant à partir de 0 ; [wpcs_price meta_value=prices_0_amount] affiche donc la première ligne. Les champs d'une page d'options ACF et des termes de taxonomie ne sont pas du tout des meta d'article ; le shortcode ne peut pas les lire, et ils se convertissent en PHP comme indiqué plus bas.
Les thèmes et plugins qui affichent les prix par leurs propres fonctions d'aide masquent la clé : le nom d'une telle fonction, ou le mot qu'on lui passe, n'est pas forcément la clé meta, et on ne peut pas passer une fonction au shortcode. Pour voir ce qu'un article enregistre réellement, ajoutez ce snippet pour un moment, ouvrez l'article en étant connecté comme administrateur et lisez la liste sous le contenu :
/*
* 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;
});
Une entrée comme [property_price] => Array ( [0] => 250000 ) vous donne à la fois la clé et la valeur enregistrée. Pour un champ ACF, la clé sans trait de soulignement contient la valeur et celle avec trait de soulignement contient la clé du champ. Pour un pas-à-pas propre à un thème, consultez convertir les prix des annonces d'un thème.
Pourquoi le prix ACF converti n'affiche rien ou 0.00
Le plugin lit le texte enregistré comme un nombre à partir de son premier caractère et s'arrête au premier caractère qui ne fait pas partie d'un nombre simple. Cela explique tous les résultats étranges :
| Enregistré dans le champ | Affiché dans la devise de base, format 1,000.00 | Pourquoi |
|---|---|---|
| Rien, ou mauvaise clé | Rien | La valeur est vide ; une valeur vide ou 0 n'affiche aucun prix |
250000 ou 1250.50 | 250,000.00 / 1,250.50 | Correct |
$250,000 ou € 250 | 0.00 | Un symbole avant le nombre est lu comme 0 |
250,000 | 250.00 | La lecture s'arrête à la virgule |
1.250 (milliers avec un point) | 1.25 | Le point est lu comme séparateur décimal |
12,50 | 12.00 | Une virgule décimale met fin au nombre |
Un résultat vide signifie donc que la clé est erronée ou que le champ est vide pour cet article ; 0.00 ou un montant bien trop petit signifie que la clé est bonne et que le format enregistré est mauvais. La solution est un champ qui ne peut contenir qu'un nombre simple : dans ACF, utilisez le type de champ Nombre (Number) pour les prix, et placez les symboles et les mots comme « par mois » autour du shortcode, pas dans le champ. Le format, le symbole et les séparateurs viennent alors des réglages de la devise dans WPCS.
Pour les articles dont le prix est vide volontairement, le filtre wpcs_price_free_text définit le texte que [wpcs_price] affiche à la place de rien. Il s'applique à tous les prix vides ou nuls du site :
/*
* 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';
});
Templates, répéteurs et pages d'options : convertir en PHP
Dans un template de thème, à l'intérieur de la boucle, exécutez le même shortcode : echo do_shortcode('[wpcs_price meta_value=property_price]');. Pour les valeurs que vous lisez avec les fonctions ACF, passez le nombre dans value. Cela fonctionne pour chaque ligne d'un répéteur :
<?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 ancien champ texte contient déjà des valeurs comme 250,000, nettoyez-les avant de convertir : (float) str_replace(array(',', ' '), '', $raw) transforme 250,000 en 250000. Pour l'affichage, préférez le shortcode à $WPCS->wpcs_exchange_value() : le shortcode ajoute le symbole de la devise, et seul son résultat est redessiné pour chaque visiteur lorsque J'utilise un plugin de cache sur mon site (I am using cache plugin on my site) est activé.
Constructeurs de pages et champs dynamiques
Une balise dynamique qui affiche un champ ACF dans un constructeur de pages renvoie la valeur telle qu'elle est enregistrée ; elle ne passe pas par WPCS. Placez à la place l'élément shortcode du constructeur, avec [wpcs_price meta_value=property_price] à l'intérieur. Dans les templates d'article seul et les templates d'élément de boucle, l'article courant est celui qui est affiché, de sorte que chaque carte montre son propre prix.
Deux choses ne fonctionnent pas : un shortcode saisi dans un champ texte ACF (le champ renvoie son texte tel quel, sauf si le template le passe par do_shortcode()), et [wpcs_price] placé dans une cellule ou un attribut du shortcode ou du tableau d'un autre plugin qui ne traite pas les shortcodes. Dans les deux cas, le code apparaît sous forme de texte. Déplacez le prix à un endroit qui exécute les shortcodes, ou affichez-le en PHP.
Liste de contrôle
meta_valueest sur[wpcs_price], avec le Nom du champ (Field Name) ACF (ou le nom combiné pour les champs de groupe et de répéteur).- Le champ contient un nombre simple dans la devise de base :
250000ou1250.50. - En dehors de la page propre à l'article,
post_idest indiqué avecmeta_value. - Les champs de page d'options et de terme sont lus avec
get_field()et convertis avecdo_shortcode(). - Le snippet temporaire de liste des meta est supprimé.
Si le champ n'affiche toujours rien, ouvrez un sujet sur le forum d'assistance WPCS en indiquant le shortcode, la clé meta et la valeur issue de la liste des meta.