Outils pour utilisateurs

Outils du site


clients:cisn:immobilier

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 ()

  • 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 :

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

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

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 :

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

$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 :

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 :

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

$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
clients/cisn/immobilier.txt · Dernière modification : 2025/09/09 07:52 de cmantika