Le plugin Immo-Synchro connecte un site WordPress à l'écosystème Weeb Immo composé d'un backend Node.js et de l'API Whise. Il remplit trois missions principales :
| Mission | Description | Déclencheur |
|---|---|---|
| Synchronisation | Importer les biens, agents et projets depuis le backend | Manuel ou CRON |
| Affichage | Widgets & tags dynamiques Elementor pour afficher les données | Éditeur Elementor |
| Formulaires | Reception et transmission des contacts vers le backend → Whise | Soumission visiteur |
┌─────────────────┐ Sync biens/agents ┌────────────────────┐
│ WordPress │ ←─────────────────────────── │ api.weeb.be/api │
│ Plugin Immo │ │ (Backend Node.js) │
│ │ ──── POST /formulaire ──────→ │ │
└─────────────────┘ (contact visiteur) └──────────┬─────────┘
│ │
│ CPT : biens, wa_agent, wa_projets │ Whise API
│ Tags & Widgets Elementor ↓
↓ ┌────────────────────┐
┌─────────────────┐ │ api.whise.eu │
│ Visiteur │ │ (CRM) │
└─────────────────┘ └────────────────────┘
immo/ dans wp-content/plugins/ via FTP ou l'interface WordPress.
La page d'administration est accessible via le menu latéral Synchronisation dans le tableau de bord WordPress.
| Option WordPress | Rôle | Valeurs |
|---|---|---|
syncro_activation | Active le CPT biens et la synchronisation | 0 / 1 |
syncro_projet | Active la sync des projets | 0 / 1 |
syncro_agent | Active la sync des agents | 0 / 1 |
wa_multilingue | Active le mode multilingue (WPML/Polylang) | 0 / 1 |
wa_cron | Affiche l'URL de déclenchement CRON | 0 / 1 |
wa_api_key | Clé API vers le backend (biens + formulaires) | Chaîne de caractères |
wa_cron_secret | Secret généré automatiquement pour l'URL CRON | Auto-généré |
wa_last_sync_time | Horodatage de la dernière synchronisation | Format MySQL |
La synchronisation des biens se fait en deux étapes pour éviter les timeouts HTTP :
GET https://api.weeb.be/api/estates/sync?key=VOTRE_CLE et compare les dates de mise à jour pour ne mettre en queue que les biens nouveaux ou modifiés. La queue est stockée en transient WordPress (15 min).
wa_import_one_estate) et met à jour la barre de progression en temps réel.
Toutes les clés retournées par l'API sont sauvegardées comme métadonnées WordPress (préfixe wai_). Les taxonomies sont créées automatiquement :
| Taxonomie | Source API | Exemple |
|---|---|---|
transaction | wai_objectif.fr | Vente, Location |
type_bien | wai_categorie.fr | Appartement, Maison |
ville | wai_code_postal + wai_ville | 1000 - Bruxelles |
Les agents sont extraits automatiquement depuis les données de biens (wai_representatives). Chaque agent est créé en CPT wa_agent avec sa photo importée dans la médiathèque WordPress.
| Meta | Contenu |
|---|---|
wai_name | Nom de famille |
wai_firstName | Prénom |
wai_email | Email professionnel |
wai_mobile | Numéro de mobile |
wai_pictureUrl | URL photo (importée en thumbnail WP) |
wai_officeId | ID bureau Whise |
wai_id_agent | ID agent Whise |
L'import manuel est disponible via Agents → Importer dans le tableau de bord.
Les projets sont importés depuis GET https://api.weeb.be/api/projets/sync en CPT wa_projets. L'import manuel est disponible via Projets → Importer.
Le plugin génère une URL secrète pour déclencher la synchronisation via un CRON externe (serveur, cPanel, etc.) :
# URL affichée dans l'admin si "Activer le cron" est coché https://votre-site.com/wp-admin/admin-ajax.php?action=wa_cron_sync&secret=VOTRE_SECRET # Exemple de cron Linux (tous les jours à 2h du matin) 0 2 * * * curl -s "https://votre-site.com/wp-admin/admin-ajax.php?action=wa_cron_sync&secret=XXXXX"
Le plugin enregistre une action personnalisée "Envoyer au backend Immo" dans Elementor Pro Forms. Quand un visiteur soumet le formulaire, les données sont envoyées à https://api.weeb.be/api/formulaire qui les transmet ensuite à Whise CRM.
| Type | Identifiant | Usage | Champs spécifiques |
|---|---|---|---|
| Contact général | contactForm | Page de contact standard | — |
| Demande de visite | estateForm | Fiche d'un bien | estateId (ID du bien) |
| Recherche | searchForm | Formulaire de recherche avancé | search[purpose], search[category], search[priceRange], search[rooms], search[zips] |
firstname*lastname*email*phoneoptaddressStreetoptaddressNumberoptaddressZipoptaddressCityoptaddressBoxoptcommentoptagreementoptestateIdoptsearch[purpose]optsearch[category]optsearch[priceRange]optsearch[rooms]optsearch[zips]opt{
"data": {
"firstname": "Jean",
"lastname": "Dupont",
"email": "[email protected]",
"phone": "0470123456",
"comment": "Je suis intéressé par ce bien",
"estateId": "12345" // estateForm uniquement
},
"meta": {
"formType": "estateForm",
"Message": "Demande de visite",
"source": "https://votre-site.com",
"submittedAt": "2026-04-22T10:00:00+02:00"
}
}
x-api-key. Elle n'est jamais exposée dans le HTML de la page. Le backend valide la clé avant tout traitement.Le plugin enregistre plusieurs tags dynamiques utilisables dans n'importe quel widget Elementor qui accepte des données dynamiques.
biens)Groupe : Champ Meta personnalisé. Utiliser le tag Custom Meta et saisir la clé de métadonnée (ex: wai_prix, wai_surface, etc.).
wa_agent)Groupe : Agent dans le panneau des tags dynamiques.
| Tag | Donnée retournée |
|---|---|
| Agent — Nom | Nom de famille (wai_name) |
| Agent — Prénom | Prénom (wai_firstName) |
| Agent — Email | Email (wai_email) |
| Agent — Mobile | Numéro de mobile (wai_mobile) |
| Agent — Photo | URL de la photo de profil |
| Agent — ID | Identifiant agent Whise |
| Agent — Email URL | Lien mailto: |
| Agent — Mobile URL | Lien tel: |
| Agent — Photo URL | URL directe de l'image |
Pour afficher une métadonnée dans la langue courante du visiteur :
[wa_meta wai_description]
Fonctionne avec WPML, Polylang et le locale WordPress natif. Utilisable dans JetEngine via le filtre jet-engine/listings/allowed-shortcodes.
| CPT / Taxonomie | Slug | Description |
|---|---|---|
| Biens (CPT) | biens | Annonces immobilières |
| Agents (CPT) | wa_agent | Conseillers immobiliers |
| Projets (CPT) | wa_projets | Projets immobiliers groupés |
| Transaction (Taxo) | transaction | Vente, Location… |
| Type de bien (Taxo) | type_bien | Appartement, Maison… |
| Ville (Taxo) | ville | Code postal + Ville |
biens est enregistré uniquement si l'option Activer la synchronisation est cochée. Pensez à vider les permaliens après activation (Réglages → Permaliens → Enregistrer).wai_ — Biens immobiliersChaque bien synchronisé est stocké en WordPress avec ces métadonnées (post meta). Elles sont accessibles via le tag dynamique Custom Meta Elementor, le shortcode [wa_meta clé] ou directement en PHP avec get_post_meta($post_id, 'wai_xxx', true).
wai_ (Weeb Agency Immo). Les valeurs booléennes sont stockées sous forme de chaîne 'oui' / 'non'. Les tableaux (descriptifs, images) sont encodés en JSON.| Clé WordPress | Source Whise | Type | Description |
|---|---|---|---|
wai_id | estate.id | Integer | Identifiant unique Whise du bien |
wai_nom | estate.name | String | Titre / nom du bien (utilisé comme titre du post WP) |
wai_prix | estate.price | Number | Prix de vente ou loyer mensuel |
wai_date | estate.createDateTime | Date | Date de création dans Whise |
wai_dateUpdate | estate.updateDateTime | DateTime | Date de dernière modification (utilisée pour la sync différentielle) |
wai_addresse | estate.address | String | Rue (sans numéro) |
wai_adresse_complete | Calculé | String | Adresse complète : rue + numéro + CP + ville |
wai_code_postal | estate.zip | String | Code postal |
wai_ville | estate.city | String | Ville |
wai_parent_id | estate.parentId | Integer | ID du bien parent (pour les lots dans un projet) |
wai_categorie | estate.category.id → lookup | Object {fr, nl, en} | Catégorie du bien (Appartement, Maison…) — aussi stockée en taxonomie type_bien |
wai_objectif | estate.purpose.id → lookup | Object {fr, nl, en} | Objectif de transaction (Vente, Location…) — aussi stocké en taxonomie transaction |
wai_status | estate.purposeStatus.id → lookup | Object {fr, nl, en} | Statut du bien (Disponible, Vendu, Sous offre…) |
| Clé WordPress | Langue | Description |
|---|---|---|
wai_short_description_fr | 🇧🇪 fr-BE | Description courte en français |
wai_short_description_nl | 🇧🇪 nl-BE | Description courte en néerlandais |
wai_short_description_en | 🇬🇧 en-GB | Description courte en anglais |
wai_long_description_fr | 🇧🇪 fr-BE | Description longue en français |
wai_long_description_nl | 🇧🇪 nl-BE | Description longue en néerlandais |
wai_long_description_en | 🇬🇧 en-GB | Description longue en anglais |
[wa_meta wai_long_description] pour afficher automatiquement la description dans la langue de l'utilisateur (WPML/Polylang/locale WP).| Clé WordPress | Whise Detail ID | Unité | Description |
|---|---|---|---|
wai_surface | estate.area | m² | Surface habitable principale |
wai_surface_du_terrain | estate.groundArea | m² | Surface totale du terrain |
wai_surface_batie | Detail #27 | m² | Surface bâtie |
wai_surface_jardin | estate.gardenArea | m² | Surface du jardin |
wai_surface_terrasse | Detail #874 | m² | Surface de la terrasse |
wai_surface_salon | Detail #1009 | m² | Surface du salon |
wai_surface_salle_a_manger | Detail #1010 | m² | Surface salle à manger |
wai_surface_salle_de_bain | Detail #1017 | m² | Surface salle de bain |
wai_surface_chambre1 | Detail #78 | m² | Surface chambre 1 |
wai_surface_chambre2 | Detail #79 | m² | Surface chambre 2 |
wai_surface_chambre3 | Detail #80 | m² | Surface chambre 3 |
wai_surface_chambre4 | Detail #81 | m² | Surface chambre 4 |
wai_surface_chambre5 | Detail #82 | m² | Surface chambre 5 |
wai_largeur_de_la_facade | Detail #713 | m | Largeur de la façade |
wai_profondeur_du_terrain | Detail #718 | m | Profondeur du terrain |
| Clé WordPress | Source | Type | Description |
|---|---|---|---|
wai_nbr_chambre | estate.rooms | Integer | Nombre de chambres |
wai_salle_de_bain | estate.bathRooms | Integer | Nombre de salles de bain |
wai_parking | estate.parking | Integer | Nombre de places de parking |
wai_année_de_construction | Detail #14 | Integer | Année de construction |
wai_etages | Detail #15 | Integer | Nombre d'étages |
wai_nbr_garage | Detail #19 | Integer | Nombre de garages |
wai_nombre_de_wc | Detail #55 | Integer | Nombre de WC |
wai_nbr_terrasse | Detail #1005 | Integer | Nombre de terrasses |
wai_orientation | Detail #23 | String | Orientation (Nord, Sud, Est, Ouest…) |
wai_chauffage | Detail #1020 | String | Type de chauffage |
wai_type_de_cuisine | Detail #1595 | String | Type de cuisine |
wai_salle_de_bains | Detail #1596 | String | Type de salle de bains |
wai_renovation | Detail #585 | Integer | Année de dernière rénovation |
wai_meuble | estate.furnished | oui/non | Bien meublé |
wai_garage | estate.garage | oui/non | Présence d'un garage |
wai_cuisine_equipee | Detail #38 | oui/non | Cuisine équipée |
wai_climatisation | Detail #43 | oui/non | Climatisation |
wai_ascenseur | Detail #372 | oui/non | Ascenseur |
wai_piscine | Detail #322 | oui/non | Piscine |
wai_double_vitrage | Detail #461 | oui/non | Double vitrage |
wai_isolation | Detail #778 | oui/non | Isolation |
wai_alarme | Detail #1752 | oui/non | Système d'alarme |
wai_eau_courante | Detail #1772 | oui/non | Eau courante |
wai_gaz | Detail #1760 | oui/non | Raccordement gaz |
wai_cave | Detail #1798 | oui/non | Cave |
wai_loue | Detail #824 | oui/non | Actuellement loué |
wai_revenu_cadastral | Detail #1733 | Number | Revenu cadastral |
wai_revenu_cadastral_indexe | Detail #496 | Number | Revenu cadastral indexé |
| Clé WordPress | Whise Detail ID | Description |
|---|---|---|
wai_plage | Detail #115 | Distance à la plage |
wai_centre_ville | Detail #111 | Distance au centre-ville |
wai_centre_sportif | Detail #116 | Distance au centre sportif |
wai_magasins | Detail #108 | Distance aux magasins |
wai_ecoles | Detail #1796 | Distance aux écoles |
wai_transports_en_commun | Detail #110 | Distance aux transports en commun |
wai_autoroute | Detail #1796 | Distance à l'autoroute |
| Clé WordPress | Source | Description |
|---|---|---|
wai_energie_class | estate.energyClass | Classe PEB (A, B, C… G) |
wai_valeur_EPC | Detail #2056 | Valeur EPC (kWh/m²/an) |
wai_emission_co2 | Detail #2090 | Émission CO₂ (kg CO₂/m²/an) |
wai_permis_de_batir | Detail #808 | Permis de bâtir obtenu (oui/non) |
wai_permis_de_lotir | Detail #812 | Permis de lotir obtenu (oui/non) |
wai_attestation_de_sol | Detail #820 | Attestation de sol disponible (oui/non) |
| Clé WordPress | Type | Description |
|---|---|---|
wai_featured_image | URL | URL de la première photo (image mise en avant WP) |
wai_pictures | JSON Array d'URLs | Toutes les photos du bien (format XXL) |
wai_documents | JSON Array | Documents attachés — chaque document : {doc_id, doc_name, doc_url, doc_size, doc_updateDateTime} |
wai_visite_virtuelle | URL | Lien vers la visite virtuelle 360° |
wai_3D_Model | URL | Lien vers le modèle 3D |
La méta wai_representatives contient un tableau JSON des agents assignés au bien. La méta wai_id_agent contient l'ID du premier agent (pour les queries simples).
| Sous-clé (dans wai_representatives) | Description |
|---|---|
wai_id | ID Whise de l'agent |
wai_firstName | Prénom |
wai_name | Nom de famille |
wai_email | Email professionnel |
wai_mobile | Numéro mobile |
wai_directLine | Ligne directe |
wai_officeId | ID du bureau Whise |
wai_pictureUrl | URL de la photo de profil |
wa_agent stocke wai_id_agent. Pour requêter les biens d'un agent, utiliser meta_query sur wai_representatives avec LIKE '"wai_id":ID_AGENT'.Le plugin écrit ses logs dans wp-content/custom-debug.log :
# Consulter les logs en temps réel (SSH)
tail -f /var/www/html/wp-content/custom-debug.log | grep "ImmoAction"
| Préfixe | Signification |
|---|---|
✅ [ImmoAction] | Formulaire envoyé avec succès |
❌ [ImmoAction] | Erreur lors de l'envoi (cf. message) |
📤 [ImmoAction] | Tentative d'envoi en cours |
✅ [ImmoMapper] | JS mapping chargé correctement |
❌ Classe ... non trouvée | Erreur d'enregistrement Elementor |
wa_api_key configurée dans le backend.
register(). Mettre à jour Elementor Pro.
firstname, email).
Dans l'éditeur Elementor, cliquer sur le champ du formulaire → onglet Avancé → champ ID. C'est cet identifiant qui doit être saisi dans les options de mapping.
Oui. Chaque formulaire configure son propre mapping indépendamment. Deux formulaires de type estateForm peuvent avoir des configurations de mapping différentes.
La clé API est générée dans le dashboard d'administration backend (api.weeb.be). Il existe deux types de clés :
Non actuellement. Le plugin importe et met à jour les biens, mais ne supprime pas les biens qui ont été retirés de Whise. Pour supprimer tous les biens WordPress, utiliser le bouton "Supprimer tous les biens" puis relancer une synchronisation complète.
Le plugin retourne une erreur et log le message dans custom-debug.log. Elementor affiche le message d'erreur personnalisé au visiteur. Aucune donnée n'est perdue côté WordPress.
# Test CURL depuis terminal curl -X POST https://api.weeb.be/api/formulaire \ -H "Content-Type: application/json" \ -H "x-api-key: VOTRE_CLE" \ -d '{"data":{"firstname":"Test","lastname":"Test","email":"[email protected]"},"meta":{"formType":"contactForm"}}'