Convertir les prix des annonces immobilières dans une autre devise sous WordPress
Pour convertir les prix des annonces immobilières dans une autre devise sous WordPress, le prix doit passer par le sélecteur de devises. Un thème immobilier, de petites annonces, de location ou de réservation affiche ses prix avec son propre code ; lorsqu'un visiteur choisit une autre devise dans le sélecteur WPCS, ces prix ne bougent donc pas. WPCS convertit ce qu'affichent son propre shortcode [wpcs_price] et ses fonctions PHP. La solution consiste à faire passer le prix du thème par ces outils. Cela revient généralement à modifier un fichier de template ou une fonction dans un thème enfant, et les étapes sont les mêmes pour les annonces de biens, de locations, de voyages et de petites annonces.
Pourquoi les prix du thème et des annonces ne changent pas de devise
Le sélecteur n'analyse pas la page à la recherche de nombres. Il mémorise la devise du visiteur, et chaque prix affiché avec [wpcs_price] est calculé dans cette devise : le montant dans votre devise de base multiplié par le taux, formaté, puis affiché avec le symbole de la devise. Un thème qui lit property_price dans les meta de l'article et affiche $250,000 avec son propre formatage ne demande jamais rien à WPCS ; ses prix ne peuvent donc pas changer.
Deux points doivent être corrects avant de commencer :
- Les montants que le thème enregistre doivent être dans la devise de base de WPCS, celle dont le bouton radio est coché dans l'onglet Devises (Currencies) et dont le taux est 1. Si les annonces sont saisies en euros, faites de EUR la devise de base.
- La valeur enregistrée doit être un nombre simple comme
250000ou1250.50. Un texte comme250,000,$250kou Prix sur demande est lu comme un mauvais nombre ou pas du tout ; les prix en texte demandent donc le traitement distinct présenté plus bas, et les nombres formatés doivent d'abord être nettoyés.
Trouver où le thème affiche le prix
Ouvrez une annonce et regardez le HTML du prix dans l'inspecteur du navigateur : sa classe CSS (par exemple item-price ou listing-price) est un bon terme de recherche. Cherchez ensuite cette classe dans le dossier du thème, ainsi que les appels à get_post_meta à proximité. Vous trouverez l'un de ces trois cas :
- Un fichier de template (une carte, une page d'annonce seule) qui lit le champ meta et l'affiche avec echo ;
- une fonction du thème comme
theme_listing_price(), qui construit le HTML du prix et est appelée depuis plusieurs templates ; - un shortcode du thème ou un widget qui affiche le prix.
La même recherche vous donne la clé meta qui contient le montant, le second argument de get_post_meta(). Si le thème est complexe, son auteur peut indiquer le template, la fonction et la clé meta en une seule réponse. Faites chaque modification dans un thème enfant, car une mise à jour du thème remplace les fichiers du thème parent.
Afficher le prix avec [wpcs_price]
Dans la boucle ou sur une page d'annonce seule, le shortcode peut lire lui-même le champ meta ; meta_value est la clé meta et l'article courant est utilisé :
<?php echo do_shortcode('[wpcs_price meta_value="property_price"]'); ?>
En dehors de la boucle (une barre latérale, une infobulle de carte, un bloc d'annonces similaires), ajoutez post_id : [wpcs_price post_id="123" meta_value="property_price"]. Lorsque le code du thème détient déjà le montant dans une variable, passez-le dans value, et conservez les prix en texte tels quels :
<?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
}
?>
Retirez le symbole monétaire propre au thème autour de l'ancienne sortie : [wpcs_price] affiche lui-même le symbole de la devise sélectionnée, sinon vous obtenez deux symboles. Les préfixes et suffixes comme À partir de ou / mois restent tels quels ; convertissez chaque nombre séparément lorsqu'une annonce a un prix de vente et un loyer.
Fichiers de template
Les fichiers que le thème charge avec get_template_part() ou locate_template() peuvent être surchargés : copiez le fichier au même emplacement dans le thème enfant et modifiez la copie. WordPress charge d'abord la version du thème enfant.
Fonctions du thème
De nombreux thèmes déclarent leurs fonctions de template dans un bloc if ( ! function_exists( 'theme_listing_price' ) ). Le functions.php du thème enfant est chargé avant celui du thème parent ; une fonction du même nom définie à cet endroit remplace donc la version du thème partout où elle est utilisée. Copiez la fonction d'origine, conservez ce qu'elle renvoie ou affiche, et ne changez que le montant :
/*
* 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, par exemple, construit les prix des annonces dans houzez_listing_price(), déclarée de cette manière. Vérifiez la version de votre thème avant de copier une fonction, car son fonctionnement interne change d'une version à l'autre.
Shortcodes du thème
Lorsque le prix provient d'un shortcode du thème, enregistrez un nouveau gestionnaire pour la même balise une fois que le thème a enregistré le sien :
/*
* 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 le thème propose un filtre sur l'affichage de son prix, c'est le meilleur endroit : renvoyez le résultat de [wpcs_price] depuis la fonction de rappel de votre filtre, et rien n'a besoin d'être copié dans le thème.
Plugins d'annonces, de réservation et constructeurs de pages
Lorsque les annonces proviennent d'un plugin (annuaire, location ou réservation) ou d'un widget de constructeur de pages, le prix est affiché par le code de ce plugin, et la même règle s'applique : sa sortie doit passer par [wpcs_price]. Cherchez l'un de ces éléments, dans cet ordre :
- un hook de filtre sur le HTML du prix ou sur le montant formaté ;
- un système de surcharge des templates (de nombreux plugins chargent d'abord leurs templates depuis un dossier du thème actif) ;
- un template de carte que vous concevez vous-même. Dans un template Loop Item d'Elementor Pro, par exemple, placez un widget Shortcode avec
[wpcs_price meta_value="your_price_key"]à l'endroit du prix ; le shortcode lit le champ meta de chaque annonce de la boucle.
Si aucun n'existe, demandez à l'auteur du plugin un hook ou le chemin du template. Un prix situé dans un widget qui n'offre ni hook, ni template, ni réglage pour cela ne peut pas être converti de l'extérieur.
Totaux calculés : convertir en PHP
Les totaux que calcule votre code, comme le nombre de nuits multiplié par le prix par nuit, un acompte ou des frais, doivent être calculés dans la devise de base et convertis une seule fois, à l'affichage :
<?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() renvoie une chaîne formatée avec les séparateurs de la devise sélectionnée ; ne faites donc pas de calculs avec son résultat. Affichez le code de la devise à côté avec $WPCS->current_currency si vous en avez besoin. Sur un site avec cache de pages, préférez le shortcode : lorsque J'utilise un plugin de cache sur mon site (I am using cache plugin on my site) est activé, seule la sortie de [wpcs_price] est redessinée pour chaque visiteur (voir le sélecteur de devises et les plugins de cache).
Vérifier le résultat et connaître les limites
- Changez de devise sur une carte d'annonce et sur une page d'annonce seule : le montant, le symbole et le format doivent changer sur les deux.
- Les prix d'annonces dans une devise que les services de taux ne couvrent pas demandent un taux saisi à la main ; voir les erreurs de taux de change.
- Les filtres de recherche et le tri par prix du thème continuent de fonctionner avec les montants enregistrés dans la devise de base ; ils ne convertissent rien.
- WPCS modifie l'affichage des prix. Les paiements, les paiements de réservation, les factures et les e-mails restent dans la devise qu'utilise le thème ou le plugin de réservation. Pour une boutique WooCommerce, le plugin frère FOX change aussi la devise du panier et de la caisse ; voir WPCS ou FOX.
Si le thème affiche ses prix d'une manière qu'aucune de ces méthodes n'atteint, ouvrez un sujet sur le forum d'assistance WPCS en indiquant le nom du thème, le template ou la fonction qui affiche le prix et la clé meta qu'il lit.