Plugin Immo-Synchro

Guide d'utilisation et de configuration — WordPress + Elementor Pro
Version 1.0 WordPress 6.x Elementor Pro 3.x+ PHP 7.4+ Avril 2026
Table des matières
  1. Introduction & architecture
  2. Configuration initiale
    1. Installation
    2. Page d'administration
    3. Options disponibles
  3. Synchronisation des données
    1. Biens immobiliers
    2. Agents
    3. Projets
    4. Automatisation (CRON)
  4. Formulaires Elementor
    1. Activer l'action personnalisée
    2. Types de formulaires
    3. Mapper les champs
  5. Tags dynamiques Elementor
  6. Custom Post Types & Taxonomies
  7. Référence des clés wai_ (biens)
    1. Identité & localisation
    2. Descriptions multilingues
    3. Surfaces
    4. Infos générales
    5. Proximité
    6. Énergie & administratif
    7. Médias & documents
    8. Agents représentants
  8. Débogage & logs
  9. FAQ

1Introduction & architecture

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 :

MissionDescriptionDéclencheur
SynchronisationImporter les biens, agents et projets depuis le backendManuel ou CRON
AffichageWidgets & tags dynamiques Elementor pour afficher les donnéesÉditeur Elementor
FormulairesReception et transmission des contacts vers le backend → WhiseSoumission visiteur

Schéma d'architecture

┌─────────────────┐     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)             │
└─────────────────┘                              └────────────────────┘

2Configuration initiale

2.1 Installation

1
Uploader le plugin Placer le dossier immo/ dans wp-content/plugins/ via FTP ou l'interface WordPress.
2
Activer le plugin Aller dans Extensions → Extensions installées et activer Immo-Synchro.
3
Vérifier Elementor Pro Le plugin nécessite Elementor Pro 3.x+ pour les widgets, tags dynamiques et l'action de formulaire.
4
Configurer la clé API Naviguer vers Synchronisation dans le menu d'administration WordPress et renseigner la clé API.

2.2 Page d'administration

La page d'administration est accessible via le menu latéral Synchronisation dans le tableau de bord WordPress.

WordPress Admin › Synchronisation
☑ Activer la synchronisation
Active le CPT des biens et les fonctions d'import
☑ Activer les projets ☑ Activer les agents ☑ Activer le multilingue
Clé API formulaires
votre-cle-api-ici...
Envoyée en header x-api-key → https://api.weeb.be/api/formulaire
Enregistrer
Lancer la synchronisation
Supprimer tous les biens

2.3 Options disponibles

Option WordPressRôleValeurs
syncro_activationActive le CPT biens et la synchronisation0 / 1
syncro_projetActive la sync des projets0 / 1
syncro_agentActive la sync des agents0 / 1
wa_multilingueActive le mode multilingue (WPML/Polylang)0 / 1
wa_cronAffiche l'URL de déclenchement CRON0 / 1
wa_api_keyClé API vers le backend (biens + formulaires)Chaîne de caractères
wa_cron_secretSecret généré automatiquement pour l'URL CRONAuto-généré
wa_last_sync_timeHorodatage de la dernière synchronisationFormat MySQL

3Synchronisation des données

3.1 Biens immobiliers

La synchronisation des biens se fait en deux étapes pour éviter les timeouts HTTP :

1
Préparation de la queue Le plugin appelle 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).
2
Import progressif L'interface JS importe les biens un par un via AJAX (wa_import_one_estate) et met à jour la barre de progression en temps réel.

Données importées par bien

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 :

TaxonomieSource APIExemple
transactionwai_objectif.frVente, Location
type_bienwai_categorie.frAppartement, Maison
villewai_code_postal + wai_ville1000 - Bruxelles
⚠️
Timeout — Si la synchronisation échoue avec une erreur de timeout, c'est que le backend met trop longtemps à répondre. Relancer une deuxième fois : les biens déjà mis à jour seront ignorés.

3.2 Agents

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.

MetaContenu
wai_nameNom de famille
wai_firstNamePrénom
wai_emailEmail professionnel
wai_mobileNuméro de mobile
wai_pictureUrlURL photo (importée en thumbnail WP)
wai_officeIdID bureau Whise
wai_id_agentID agent Whise

L'import manuel est disponible via Agents → Importer dans le tableau de bord.

3.3 Projets

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.

3.4 Automatisation (CRON externe)

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"
ℹ️
Ordre d'exécution CRON : 1. Projets → 2. Agents → 3. Biens (500 max par passage). Le secret est régénéré uniquement si vous le supprimez manuellement de la base de données.

4Formulaires Elementor

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.

4.1 Activer l'action dans Elementor

1
Ouvrir le formulaire dans Elementor Éditer la page contenant le formulaire et cliquer sur le widget Formulaire Elementor Pro.
2
Aller dans l'onglet "Contenu" Section Actions après soumission → Cliquer sur Ajouter une action.
3
Sélectionner "Envoyer au backend Immo" La section de configuration apparaît en dessous.
4
Choisir le type de formulaire Sélectionner le type dans le menu déroulant. Les champs de mapping correspondants s'affichent automatiquement.
5
Mapper les champs Pour chaque champ attendu, sélectionner le champ Elementor correspondant dans le menu déroulant (peuplé dynamiquement depuis les champs du formulaire).

4.2 Types de formulaires

TypeIdentifiantUsageChamps 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]

4.3 Champs disponibles par type

Champs communs aux 3 types requis : firstname, lastname, email

firstname*
Prénom
lastname*
Nom
email*
Email
phoneopt
Téléphone
addressStreetopt
Rue
addressNumberopt
Numéro
addressZipopt
Code postal
addressCityopt
Ville
addressBoxopt
Boîte
commentopt
Message
agreementopt
Accord RGPD

Champs supplémentaires — estateForm

estateIdopt
ID Whise du bien (récup. via tag dynamique)

Champs supplémentaires — searchForm

search[purpose]opt
Achat / Location
search[category]opt
Type de bien
search[priceRange]opt
Budget
search[rooms]opt
Nb. de chambres
search[zips]opt
Codes postaux

Payload envoyé au backend

{
  "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"
  }
}
Sécurité — La clé API est envoyée en header HTTP x-api-key. Elle n'est jamais exposée dans le HTML de la page. Le backend valide la clé avant tout traitement.

5Tags dynamiques Elementor

Le plugin enregistre plusieurs tags dynamiques utilisables dans n'importe quel widget Elementor qui accepte des données dynamiques.

Tags — Champs d'un bien (biens)

Groupe : Champ Meta personnalisé. Utiliser le tag Custom Meta et saisir la clé de métadonnée (ex: wai_prix, wai_surface, etc.).

Tags — Données d'un agent (wa_agent)

Groupe : Agent dans le panneau des tags dynamiques.

TagDonnée retournée
Agent — NomNom de famille (wai_name)
Agent — PrénomPrénom (wai_firstName)
Agent — EmailEmail (wai_email)
Agent — MobileNuméro de mobile (wai_mobile)
Agent — PhotoURL de la photo de profil
Agent — IDIdentifiant agent Whise
Agent — Email URLLien mailto:
Agent — Mobile URLLien tel:
Agent — Photo URLURL directe de l'image

Shortcode multilingue

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.

6Custom Post Types & Taxonomies

CPT / TaxonomieSlugDescription
Biens (CPT)biensAnnonces immobilières
Agents (CPT)wa_agentConseillers immobiliers
Projets (CPT)wa_projetsProjets immobiliers groupés
Transaction (Taxo)transactionVente, Location…
Type de bien (Taxo)type_bienAppartement, Maison…
Ville (Taxo)villeCode postal + Ville
ℹ️
Le CPT biens est enregistré uniquement si l'option Activer la synchronisation est cochée. Pensez à vider les permaliens après activation (Réglages → Permaliens → Enregistrer).

7Référence des clés wai_ — Biens immobiliers

Chaque 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).

ℹ️
Convention de nommage : toutes les clés sont préfixées 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.

7.1 Identité & localisation

Clé WordPressSource WhiseTypeDescription
wai_idestate.idIntegerIdentifiant unique Whise du bien
wai_nomestate.nameStringTitre / nom du bien (utilisé comme titre du post WP)
wai_prixestate.priceNumberPrix de vente ou loyer mensuel
wai_dateestate.createDateTimeDateDate de création dans Whise
wai_dateUpdateestate.updateDateTimeDateTimeDate de dernière modification (utilisée pour la sync différentielle)
wai_addresseestate.addressStringRue (sans numéro)
wai_adresse_completeCalculéStringAdresse complète : rue + numéro + CP + ville
wai_code_postalestate.zipStringCode postal
wai_villeestate.cityStringVille
wai_parent_idestate.parentIdIntegerID du bien parent (pour les lots dans un projet)
wai_categorieestate.category.id → lookupObject {fr, nl, en}Catégorie du bien (Appartement, Maison…) — aussi stockée en taxonomie type_bien
wai_objectifestate.purpose.id → lookupObject {fr, nl, en}Objectif de transaction (Vente, Location…) — aussi stocké en taxonomie transaction
wai_statusestate.purposeStatus.id → lookupObject {fr, nl, en}Statut du bien (Disponible, Vendu, Sous offre…)

7.2 Descriptions multilingues

Clé WordPressLangueDescription
wai_short_description_fr🇧🇪 fr-BEDescription courte en français
wai_short_description_nl🇧🇪 nl-BEDescription courte en néerlandais
wai_short_description_en🇬🇧 en-GBDescription courte en anglais
wai_long_description_fr🇧🇪 fr-BEDescription longue en français
wai_long_description_nl🇧🇪 nl-BEDescription longue en néerlandais
wai_long_description_en🇬🇧 en-GBDescription longue en anglais
ℹ️
Utiliser le shortcode [wa_meta wai_long_description] pour afficher automatiquement la description dans la langue de l'utilisateur (WPML/Polylang/locale WP).

7.3 Surfaces

Clé WordPressWhise Detail IDUnitéDescription
wai_surfaceestate.areaSurface habitable principale
wai_surface_du_terrainestate.groundAreaSurface totale du terrain
wai_surface_batieDetail #27Surface bâtie
wai_surface_jardinestate.gardenAreaSurface du jardin
wai_surface_terrasseDetail #874Surface de la terrasse
wai_surface_salonDetail #1009Surface du salon
wai_surface_salle_a_mangerDetail #1010Surface salle à manger
wai_surface_salle_de_bainDetail #1017Surface salle de bain
wai_surface_chambre1Detail #78Surface chambre 1
wai_surface_chambre2Detail #79Surface chambre 2
wai_surface_chambre3Detail #80Surface chambre 3
wai_surface_chambre4Detail #81Surface chambre 4
wai_surface_chambre5Detail #82Surface chambre 5
wai_largeur_de_la_facadeDetail #713mLargeur de la façade
wai_profondeur_du_terrainDetail #718mProfondeur du terrain

7.4 Informations générales

Clé WordPressSourceTypeDescription
wai_nbr_chambreestate.roomsIntegerNombre de chambres
wai_salle_de_bainestate.bathRoomsIntegerNombre de salles de bain
wai_parkingestate.parkingIntegerNombre de places de parking
wai_année_de_constructionDetail #14IntegerAnnée de construction
wai_etagesDetail #15IntegerNombre d'étages
wai_nbr_garageDetail #19IntegerNombre de garages
wai_nombre_de_wcDetail #55IntegerNombre de WC
wai_nbr_terrasseDetail #1005IntegerNombre de terrasses
wai_orientationDetail #23StringOrientation (Nord, Sud, Est, Ouest…)
wai_chauffageDetail #1020StringType de chauffage
wai_type_de_cuisineDetail #1595StringType de cuisine
wai_salle_de_bainsDetail #1596StringType de salle de bains
wai_renovationDetail #585IntegerAnnée de dernière rénovation
wai_meubleestate.furnishedoui/nonBien meublé
wai_garageestate.garageoui/nonPrésence d'un garage
wai_cuisine_equipeeDetail #38oui/nonCuisine équipée
wai_climatisationDetail #43oui/nonClimatisation
wai_ascenseurDetail #372oui/nonAscenseur
wai_piscineDetail #322oui/nonPiscine
wai_double_vitrageDetail #461oui/nonDouble vitrage
wai_isolationDetail #778oui/nonIsolation
wai_alarmeDetail #1752oui/nonSystème d'alarme
wai_eau_couranteDetail #1772oui/nonEau courante
wai_gazDetail #1760oui/nonRaccordement gaz
wai_caveDetail #1798oui/nonCave
wai_loueDetail #824oui/nonActuellement loué
wai_revenu_cadastralDetail #1733NumberRevenu cadastral
wai_revenu_cadastral_indexeDetail #496NumberRevenu cadastral indexé

7.5 Proximité

Clé WordPressWhise Detail IDDescription
wai_plageDetail #115Distance à la plage
wai_centre_villeDetail #111Distance au centre-ville
wai_centre_sportifDetail #116Distance au centre sportif
wai_magasinsDetail #108Distance aux magasins
wai_ecolesDetail #1796Distance aux écoles
wai_transports_en_communDetail #110Distance aux transports en commun
wai_autorouteDetail #1796Distance à l'autoroute

7.6 Énergie & administratif

Clé WordPressSourceDescription
wai_energie_classestate.energyClassClasse PEB (A, B, C… G)
wai_valeur_EPCDetail #2056Valeur EPC (kWh/m²/an)
wai_emission_co2Detail #2090Émission CO₂ (kg CO₂/m²/an)
wai_permis_de_batirDetail #808Permis de bâtir obtenu (oui/non)
wai_permis_de_lotirDetail #812Permis de lotir obtenu (oui/non)
wai_attestation_de_solDetail #820Attestation de sol disponible (oui/non)

7.7 Médias & documents

Clé WordPressTypeDescription
wai_featured_imageURLURL de la première photo (image mise en avant WP)
wai_picturesJSON Array d'URLsToutes les photos du bien (format XXL)
wai_documentsJSON ArrayDocuments attachés — chaque document : {doc_id, doc_name, doc_url, doc_size, doc_updateDateTime}
wai_visite_virtuelleURLLien vers la visite virtuelle 360°
wai_3D_ModelURLLien vers le modèle 3D

7.8 Agents représentants

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_idID Whise de l'agent
wai_firstNamePrénom
wai_nameNom de famille
wai_emailEmail professionnel
wai_mobileNuméro mobile
wai_directLineLigne directe
wai_officeIdID du bureau Whise
wai_pictureUrlURL de la photo de profil
ℹ️
Lier bien ↔ agent WordPress : Le CPT 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'.

8Débogage & logs

Fichier de log personnalisé

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éfixes des entrées de log

PréfixeSignification
✅ [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éeErreur d'enregistrement Elementor

Erreurs fréquentes

🔴
Erreur : "Réponse API invalide"
Cause : La clé API est absente ou incorrecte. Vérifier la valeur de Clé API dans Synchronisation. La clé doit correspondre à la valeur wa_api_key configurée dans le backend.
🔴
Fatal error: Call to undefined method register_action()
Cause : Version Elementor Pro < 3.0. La méthode correcte est register(). Mettre à jour Elementor Pro.
⚠️
Le mapping des champs de formulaire est vide
Cause : Les champs du formulaire dans Elementor n'ont pas d'ID personnalisé défini. Aller dans chaque champ → onglet Avancé → définir un Custom ID (ex: firstname, email).
⚠️
L'action personnalisée n'apparaît pas dans Elementor
Cause : Elementor Pro doit être activé avant le plugin Immo. Désactiver/réactiver le plugin Immo après Elementor Pro.

9FAQ

Comment trouver le Custom ID d'un champ Elementor ?

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.

Peut-on utiliser plusieurs formulaires du même type sur le site ?

Oui. Chaque formulaire configure son propre mapping indépendamment. Deux formulaires de type estateForm peuvent avoir des configurations de mapping différentes.

Comment obtenir la clé API ?

La clé API est générée dans le dashboard d'administration backend (api.weeb.be). Il existe deux types de clés :

La synchronisation prend-elle en compte les biens supprimés de Whise ?

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.

Que se passe-t-il si le backend est indisponible lors d'une soumission de formulaire ?

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.

Comment tester que la clé API est correcte ?

# 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"}}'