Table des matières

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

Contexte métier et utilisateurs cibles

Historique du projet et évolutions majeures

2. Architecture technique

Stack technologique

Flux de données dual

1. Flux Leizee (Biens neufs)

2. Flux Hektor/Périclès (Biens anciens)

Architecture de recherche unifiée

Le système utilise une requête UNION complexe dans functions-biens.php:searchBiens() pour interroger simultanément :

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

2. Gestion des templates dynamiques

3. Plugin WIA Leizee

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 :

4.2 Filtres de recherche avancés

4.3 Gestion géographique complexe

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 Leizee

Shortcodes disponibles

8. Sécurité et performance

Content Security Policy

$cspWhitelist = [
    'cisn.immo', 'leizee.com', 'google.com', 
    'openstreetmap.org', 'estimator.cityscan.fr'
];

Optimisations requêtes

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

10. Glossaire technique