Ceci est une ancienne révision du document !
# Documentation technique - Projet Immobilier CISN
## 1. Vue d'ensemble du projet
### Objectifs et problématiques adressées Ce projet WordPress développé par CISN (Compagnie Immobilière du Sud de Nantes) vise à : - Présenter et gérer un double catalogue de biens immobiliers neufs et anciens - Intégrer deux flux de données distincts : Leizee (biens neufs) et Hektor/Périclès (biens anciens) - Proposer une recherche unifiée sur l'ensemble des biens disponibles - Fournir des outils de simulation financière (calculateurs) - Assurer la gestion des agences et références immobilières
### Contexte métier et utilisateurs cibles - Utilisateurs finaux : Particuliers recherchant un logement (neuf/ancien, achat/location) - Gestionnaires : Équipes CISN gérant les contenus et programmes - Partenaires :
- Leizee : logiciel de gestion immobilière (programmes neufs)
- Hektor/Périclès : logiciel de gestion des annonces traditionnelles
### Historique du projet et évolutions majeures - Version 2.0 du thème CISN Immobilier - Intégration du plugin WIA Leizee v2.0 pour la synchronisation Leizee - Architecture de recherche unifiée combinant deux sources de données - Système de sécurité CSP (Content Security Policy)
## 2. Architecture technique
### Stack technologique - CMS : WordPress - Thème personnalisé : CISN Immobilier v2.0 - Plugin principal : WIA Leizee v2.0 (interface API Leizee) - Framework CSS : Bootstrap 5 - Bibliothèques JavaScript :
- jQuery, Swiper.js, Leaflet.js, noUiSlider, Lity
- Sources de données :
1. **API Leizee** : Programmes immobiliers neufs 2. **CSV/Fichiers Hektor/Périclès** : Biens anciens (import via `/cisn_pericles`)
### Flux de données dual
#### 1. Flux Leizee (Biens neufs) - Source : API Leizee - Plugin : WIA Leizee v2.0 - Stockage :
- Custom Posts `programme`
- Tables dédiées : `wp_leizee_lot`, `wp_leizee_annexe`
- Synchronisation : Automatique via API
#### 2. Flux Hektor/Périclès (Biens anciens) - Source : Fichiers CSV depuis dossier `../cisn_pericles` - Stockage : Table `wp_pericles_annonce` - Synchronisation : Import batch via endpoint `/api/sync`
### Architecture de recherche unifiée Le système utilise une requête UNION complexe dans `functions-biens.php:searchBiens()` pour interroger simultanément : - Table Hektor : `pericles_annonce` - Table Leizee : `leizee_lot`
Cette architecture permet une recherche transparente sur l'ensemble du catalogue.
## 3. Structure du code
### Organisation des répertoires ``` wp-content/themes/ ├── functions-biens.php (★ logique de recherche unifiée) ├── page-recherche.php (interface de recherche) ├── parts/ │ ├── detail-annonce-hektor.php (template biens anciens) │ ├── detail-annonce-leizee.php (template biens neufs) │ └── detail-annonce-autre.php (template générique) └── css/, js/, blocks/
wp-content/plugins/wia-leizee/ ├── wia-leizee.php └── inc/classes/wia_leizee_import-class.php (★ import API Leizee) ```
### Modules principaux
#### 1. Moteur de recherche unifiée (`functions-biens.php`) - Fonction centrale : `searchBiens($r, $save = TRUE)` - Responsabilités :
- Construction de requêtes SQL parallèles pour Hektor et Leizee
- Unification des résultats via UNION
- Gestion des filtres (prix, surface, lieu, type, dispositifs)
- Mapping des champs entre les deux systèmes
#### 2. Gestion des templates dynamiques - Logique : Détection automatique du type de bien par préfixe ID
- `P` = Hektor/Périclès → `detail-annonce-hektor.php`
- `L` = Leizee → `detail-annonce-leizee.php`
- Implémentation : Hook `template_include` dans `functions-biens.php:125`
#### 3. Plugin WIA Leizee - Import automatique : Synchronisation API Leizee vers WordPress - Tables dédiées : Création de `leizee_lot` et `leizee_annexe` - Actions WordPress : `astraga_wia_leizee_lot` pour post-traitement
## 4. Fonctionnalités clés
### 4.1 Système de recherche dual La recherche combine intelligemment deux sources :
```sql – Exemple simplifié de la logique UNION SELECT * FROM pericles_annonce WHERE [filtres Hektor] UNION SELECT * FROM leizee_lot WHERE [filtres Leizee adaptés] ```
Adaptations par source : - Prix : `pv` (Hektor) vs `prix_valeur` (Leizee) - Surface : `surf_hab` vs `surface_totale_number` - Ville : Gestion spéciale Leizee avec `ville_rattachement`
### 4.2 Filtres de recherche avancés - Types de biens : Appartement, Maison, Terrain, etc. - Géolocalisation : Gestion des villes et rattachements - Budget : Prix d'achat ou loyers - Caractéristiques : Surface, nombre de pièces - Dispositifs : BRS, PSLA (codes 21 et 4 dans Leizee)
### 4.3 Gestion géographique complexe - Fonction : `getRealCityNames()` pour normalisation des noms - Cas spécial : “Pornic” vs “Pornichet” - Leizee : Support `ville_rattachement` + jointures sur CPTs WordPress
## 5. Base de données
### Tables principales
#### Tables Leizee (créées automatiquement) ```sql wp_leizee_lot (
idlot, ville_nom, ville_lat, ville_lon, ville_rattachement, prix_valeur, surface_totale_number, nb_pieces, dispositif_aide
)
wp_leizee_annexe (
idlot, idtype, libelle, surface
) ```
#### Table Hektor/Périclès ```sql wp_pericles_annonce (
no_asp, pv, surf_hab, nb_pce, ville, type_bien, transaction
) ```
### Synchronisation des données
#### Processus Leizee 1. Avant import : Dépublication programmes (`wia_leizee_import_before`) 2. Import API : Création/MAJ Custom Posts + meta fields 3. Post-traitement : Insertion dans `leizee_lot` via action `astraga_wia_leizee_lot` 4. Finalisation : Republication conditionnelle (`wia_leizee_should_skip`)
#### Processus Hektor 1. Import CSV : Lecture fichiers depuis `../cisn_pericles` 2. Endpoint : `/api/sync` pour déclenchement manuel 3. Stockage direct : Table `pericles_annonce`
## 6. Recherche de biens - Analyse technique
### Architecture de la requête unifiée
La fonction `searchBiens()` constitue le cœur du système. Elle génère une requête complexe combinant deux sources :
```php function searchBiens($r, $save = TRUE) {
global $wpdb, $question, $map, $typesBiens;
// 1. Construction des filtres Hektor
$where = array();
$where['type'] = 'type_bien IN (...)';
$where['lieu'] = 'ville = "..."';
$where['prix'] = 'pv BETWEEN ... AND ...';
// 2. Adaptation pour Leizee
$whereLeizee = $where;
$whereLeizee['prix'] = str_replace('pv ', 'prix_valeur ', $where['prix']);
$whereLeizee['lieu'] = '(ville_nom IN (...) OR ville_rattachement IN (...))';
// 3. UNION des deux requêtes
$sql = "SELECT * FROM pericles_annonce WHERE " . implode(' AND ', $where) . "
UNION
SELECT * FROM leizee_lot WHERE " . implode(' AND ', $whereLeizee);
} ```
### Gestion des spécificités par source
#### Mapping des champs ```php $map = array(
'prix' => 'pv', // Hektor 'loyer' => 'loyer_cc', // Hektor 'ville' => 'ville', // Hektor
);
Adaptation automatique pour Leizee : 'pv' → 'prix_valeur' 'surf_hab' → 'surface_totale_number' 'nb_pce' → 'nb_pieces' ```
#### Cas complexes
Gestion géographique Leizee : ```php if (isset($whereLeizee['lieu'])) {
$whereLeizee['lieu'] = '(
ville_nom IN (' . $cities . ')
OR ville_rattachement IN (' . $cities . ')
OR idlot IN (
-- Jointure complexe avec les CPT WordPress ville
select w.meta_value from wp_postmeta w
where w.meta_key="wia_leizee_lot_idlot"
and w.post_id in (...)
)
)';
} ```
Dispositifs d'aide : ```php if ($dispositif === 1) { BRS $where['dispositif'] = 'dispositif_aide = 21'; } elseif ($dispositif === 2) { PSLA
$where['dispositif'] = 'dispositif_aide = 4';
} ```
## 7. API et interfaces
### Endpoints REST - `/api/search` : Recherche unifiée de biens - `/api/sync` : Import données Hektor/Périclès - `/api/rappeler` : Demande de rappel - `/api/contacter` : Contact agence - `/api/envoi-fiche` : Envoi fiche bien
### API Leizee - Authentification : Configurée dans plugin WIA Leizee - Synchronisation : Import programmes + lots automatique - Webhook : Actions WordPress pour post-traitement
### Shortcodes disponibles - `[programmes]` : Liste programmes Leizee avec pagination - `[calculateur_mensualites]` : Simulateur mensualités - `[calculateur_emprunt]` : Simulateur capacité emprunt
## 8. Sécurité et performance
### Content Security Policy ```php $cspWhitelist = [
'cisn.immo', 'leizee.com', 'google.com', 'openstreetmap.org', 'estimator.cityscan.fr'
]; ```
### Optimisations requêtes - Index BDD : Sur `idlot`, `ville_nom`, `prix_valeur` (Leizee) - Pagination : Native WordPress pour programmes - Cache : Sessions PHP pour dernière recherche utilisateur
## 9. Maintenance et évolution
### Points d'attention 1. Synchronisation : Surveillance des imports Leizee et Hektor 2. Mapping champs : Évolutions des APIs externes 3. Performance : Optimisation requêtes UNION 4. Géolocalisation : Maintenance table correspondances villes
### Logs et monitoring - Import Leizee : Actions WordPress `wia_leizee_*` - Erreurs SQL : Logs WordPress standards - API Hektor : Endpoint `/api/sync` avec retours JSON
## 10. Glossaire technique
- UNION SQL : Combinaison des résultats de deux tables distinctes - Leizee : Logiciel immobilier neuf avec API REST - Hektor/Périclès : Logiciel traditionnel avec export CSV - WIA : Web Images Associées (développeur plugin) - CPT : Custom Post Types WordPress - ACF : Advanced Custom Fields - CSP : Content Security Policy