Palladio
Sistema WordPress per la vendita frazionata di immobili
by Cosè Murciano · github.com/cosemurciano/palladio · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/cosemurciano/palladio/archive/refs/heads/main.zipReadme
Palladio
Sistema WordPress per la vendita frazionata di immobili: un edificio, molte unità, una campagna.
Palladio trasforma un sito WordPress in un sistema di regia completo per la vendita di unità immobiliari appartenenti a uno o più edifici. La visione di prodotto completa, il modello dati e la roadmap sono in PALLADIO-Progetto.md.
Stato
Versione 0.9.0 — perimetro completo + i18n a pagine clone + direzione visiva editoriale. Sono implementati tutti i moduli previsti dall'architettura del documento di progetto (§4): Core, Presenter (integrato con PoeTheme), Regia (lead + dashboard), Lingue (i18n nativo a pagine clone per lingua), AI/Composer, Agent conversazionale e Feeds portali. Le schede di edificio e unità adottano una direzione visiva editoriale "Sambiasi" (palette calda, serif da display, hero full-bleed, barra dati sticky, narrazione asimmetrica, scheda tecnica tipografica, unità sorelle, dossier). Le voci residue sono affinamenti di Fase 1 (scenari bundle/split completi, planimetrie SVG interattive, dossier PDF, request_visit/handoff_human, scoring lead, adapter Polylang/WPML).
Direzione visiva editoriale
I template single-pll_unita.php e single-pll_edificio.php implementano lo stile editoriale (assets/css/palladio-editorial.css, font Cormorant Garamond / Marcellus / Hanken Grotesk): hero fotografico full-bleed, barra sticky con prezzo e dati chiave + CTA, narrazione, scheda tecnica tipografica, virtual tour, posizione nell'edificio, unità sorelle e dossier (form lead). Disattivabile via filtro palladio/editorial/enabled. Il tema PoeTheme offre una palette + abbinamento font "Sambiasi" coordinati per header/footer.
Landing dell'edificio e homepage
- Metabox "Dati principali" (
includes/admin/class-fields.php): interfaccia dedicata e tipizzata per i campi commerciali/fisici del modello (§3), finora registrati ma senza UI. Edificio: claim, sottotitolo/secolo, indirizzo, anno, superficie totale, piani, unità in vendita, vincoli, contatti, geo. Unità: codice/etichetta (es. “app. 1 + 2 + 3”), prezzo, superfici, vani/camere/bagni, classe energetica, millesimi, spese, terrazza/giardino, consegna, uso, tour/video. - Edificio come homepage: dal metabox dell'edificio, "Usa questo edificio come homepage del sito" → la landing dell'edificio è servita alla radice (
option palladio_home_building, override intemplate_include), distinta dalle schede delle singole unità. - Landing arricchita (
single-pll_edificio.php): occhiello con indirizzo · sottotitolo, valori chiave dell'edificio, fascia prezzi ("N residenze · €min – €max") calcolata dalle unità, ed elenco delle unità come in grafica (immagine, badge stato, occhiello piano · m² · codice, descrizione breve, prezzo). Helperpalladio_units_price_range()epalladio_unit_eyebrow().
Contenuti strutturati (non testo libero)
Il metabox "Contenuti della scheda" (includes/admin/class-content.php) popola i campi del template con campi dedicati e repeater, non un testo libero, con set differenziati per Edificio e Unità:
- Unità: occhiello, lead, URL walkthrough, capitoli, narrazione asimmetrica, scheda tecnica, planimetria, galleria, posizione.
- Edificio (landing): occhiello, lead, Manifesto (affermazioni con enfasi), Timeline / scroll-telling (occhiello, anno, titolo, testo, immagine), Ambient loop (immagine + didascalia), sezione unità (occhiello, titolo, toggle filtri), galleria (con link "Tutta la galleria" + numero foto).
Salvati in _pll_editorial e letti da palladio_editorial(); immagini scelte con il media picker di WordPress. La landing dell'edificio (single-pll_edificio.php) rende, conforme alle immagini di riferimento: hero, manifesto (reveal allo scroll), timeline con anni, ambient loop a piena larghezza, unità "Scegli le tue stanze" con filtri client-side (Tutte / Piano / Prezzo / Con spazio esterno) e card con scatto/badge/occhiello/descrizione/prezzo, e galleria asimmetrica (masonry). Reveal e filtri sono progressive enhancement in assets/js/palladio.js.
Cosa fa già
- Bootstrap del plugin (
palladio.php) con costanti, autoloader e hook di attivazione/disattivazione. - CPT del modello dati (
includes/core/class-cpt.php):pll_edificio— il contenitore-brand.pll_unita— l'unità in vendita (gerarchica,post_parent→ edificio).pll_scenario— bundle/split di unità.
- Tassonomie delle unità:
pll_tipologia,pll_piano,pll_stato(con i 5 termini di default:disponibile,riservata,in_trattativa,venduta,non_in_vendita, popolati all'attivazione). - Meta strutturati (
includes/core/class-meta.php) per edificio e unità, tuttishow_in_rest(headless-ready) con sanitizzazione eauth_callback. - Scenari (
includes/core/class-scenario.php): meta bundle/split + hook della regola di coerenza (palladio/unit_status_changed). - Attivazione (
includes/class-activator.php): registra i CPT prima del flush delle rewrite rules, popola i termini di stato, assegna le capabilitymanage_palladio/edit_palladio_contentall'administrator. - Presenter / frontend (
includes/frontend/):class-templates.php— instrada i template dei CPT lasciando la precedenza al tema (override via{tema}/palladio/single-pll_unita.php).class-assets.php— carica CSS/JS solo sulle viste del plugin, versionati confilemtime().class-shortcodes.php—[palladio_edifici]per inserire la griglia degli edifici in qualsiasi pagina.template-functions.php— helper di presentazione (prezzo, badge di stato, card unità, specifiche).- Template:
templates/single-pll_edificio.php(hero + fatti chiave + griglia unità filtrabile),single-pll_unita.php(prezzo, stato, tabella caratteristiche, CTA, unità correlate),archive-pll_edificio.php.
- Regia / lead (
includes/leads/,includes/admin/):leads/class-store.php— data layer sulla tabella custom{prefix}palladio_leads(§3.4): creazione/upgrade schema, inserimento sanitizzato, cambio stato, query e conteggi aggregati.leads/class-form.php— form di cattura lead (shortcode[palladio_lead_form]+ iniezione automatica nel pannello contatti dell'unità), con nonce, honeypot, consenso GDPR versionato e notifica email alla regia/agenzia.admin/class-regia.php— menu Palladio → Regia (dashboard KPI: totali, pipeline per stato, fonti, ultimi lead) e Palladio → Lead (pipeline).admin/class-leads-list-table.php—WP_List_Tabledei lead con filtri per stato, ricerca, paginazione e transizioni di stato (row actions con nonce).- Stati lead (§3.4):
nuovo,qualificato,inviato_agenzia,visita,trattativa,chiuso_vinto,chiuso_perso. - Event bus:
palladio/lead_created,palladio/lead_status_changed.
- Lingue / i18n contenuti (
includes/i18n/,includes/admin/class-translations.php) — modalità nativa a zero dipendenze, modello a pagine clone (§5.4.A):- Ogni lingua è una pagina CPT dedicata collegata all'originale da un gruppo di traduzione (
_pll_tgroup) e con la propria lingua (_pll_lang) — non campi dentro il post originale. i18n/class-translator.php— data layer dei gruppi: lingua per post,siblings(),clone_post()(clona titolo/contenuto/meta/tassonomie/immagine in una nuova bozza collegata, con genitore risolto nella stessa lingua) esync_shared()(prezzi, stato, misure e immagine restano sincronizzati tra i cloni; i testi sono per-lingua).i18n/class-languages.php— configurazione sorgente + lingue attive (IT/EN/DE/FR), pagina Palladio → Lingue, lingua corrente derivata dal post visualizzato, filtro archivi per lingua (pre_get_posts), hreflang verso i post collegati e shortcode[palladio_lang_switcher](link alle versioni).admin/class-translations.php— riquadro Lingue sui CPT: mostra la lingua della pagina e, per ogni lingua attiva, Modifica (se la versione esiste) o Crea versione (clona in una nuova pagina editabile).- La traduzione AI (Composer) crea e popola la pagina clone come bozza da rivedere.
- Ogni lingua è una pagina CPT dedicata collegata all'originale da un gruppo di traduzione (
- AI / Composer (
includes/ai/,includes/admin/class-ai.php) — richiede una chiave OpenAI (§5.3, §6):ai/class-crypto.php— cifratura della chiave API con libsodium (chiave derivata dai salt WP, mai memorizzata); fallback offuscato se libsodium assente.ai/class-settings.php— pagina Palladio → AI: chiave API, modelli configurabili, abilitazione e riepilogo uso/costi stimati. La chiave può essere definita inwp-config.phpcondefine( 'PALLADIO_OPENAI_API_KEY', 'sk-...' );(opzione più sicura, ha priorità e rende il campo di sola lettura); in alternativa è salvata cifrata nel database.ai/class-openai.php— client HTTP server-side (Chat Completions + Embeddings) con retry su errori transitori e log token/costo. La chiave non lascia mai il server.ai/class-composer.php— genera la scheda (titolo, abstract, descrizione, meta description, FAQ) dai dati strutturati come bozza rivedibile (_pll_ai_draft), la applica su richiesta, e traduce titolo/riassunto/contenuto salvando nel data layer i18n con statogenerata.admin/class-ai.php— metabox con pulsanti Genera scheda / Applica bozza / Genera traduzione, Costruisci da Storage + Media e Carica documenti su Storage, via AJAX (nonce + capabilityedit_post); nessuna chiamata AI dal browser.- OpenAI Storage + File Search + media (
ai/class-openai.php,ai/class-composer.php): il client supporta Responses API con File Search (vector_store_ids), l'upload file e i vector store.Composer::build_from_sources()interroga i documenti del progetto su OpenAI Storage (File Search) e sceglie le immagini dai media del sito per popolare i campi strutturati (_pll_editorial+ meta) con i contenuti corretti;Composer::upload_documents()carica i documenti allegati (PDF/testo) sul vector store configurato in Palladio → AI.Composer::apply_structured()scrive meta ed editoriale con aggiornamenti parziali (merge sull'esistente).
- Agente Studio (
includes/admin/class-studio.php) — agente di regia consapevole dell'intera struttura e dello Storage:- Pagina Palladio → Agente AI (chat) e pulsante “🪄 Avvia l’agente AI” nel metabox AI di edifici/unità.
- Consapevolezza completa via tool:
get_structure(tutti gli edifici con unità e scenari + dati chiave),get_entity,list_media,search_project_documents(File Search sui documenti su Storage). - Popolamento contenuti:
update_entity(title/excerpt/content, meta, campi editoriali — aggiornamenti parziali),create_unit,create_scenario. - Loop di function calling server-side (nessuna chiamata AI dal browser); nonce + capability
manage_palladio; scritture protette daedit_post. Non inventa dati: prezzi/misure dai documenti, immagini solo dai media del sito.
- Agent conversazionale (
includes/agent/) — concierge di vendita + qualificatore lead (§5.5), richiede l'AI configurata:agent/class-kb.php— Knowledge Base RAG: alla pubblicazione dei CPT indicizza i contenuti in chunk con embeddings nella tabellapalladio_kb; ricerca per cosine similarity in PHP.agent/class-chats.php— log conversazioni nella tabellapalladio_chats(consultabile dalla regia).agent/class-tools.php— function calling:get_unit_detailselist_available_units(prezzi/stati sempre freschi dal DB, mai dalla KB) esave_lead(con consenso, aggancio a Regia).agent/class-rest.php— endpointPOST /palladio/v1/agent/chat: retrieval top-k + chat completion con system prompt parametrico, loop di tool, rate limiting per IP e guardrail (risponde solo dal contesto/tool, disclaimer, consenso prima di salvare dati).agent/class-widget.php+assets/js/agent-widget.js— widget chat embeddabile che dichiara la natura AI (trasparenza, AI Act) e parla solo con l'endpoint REST; nessuna chiave o chiamata AI lato browser. Stili palette-aware inassets/css/palladio-agent.css.- Impostazioni Agent (abilitazione, top-k, rate limit, disclaimer, system prompt) nella pagina Palladio → AI.
- Feeds portali (
includes/feeds/) — distribuzione verso i portali (§5.8):feeds/class-manager.php— endpoint pubblico del feed protetto da token (hash_equals), cache con TTL filtrabile e cron orario di rigenerazione; pagina Palladio → Feeds con gli URL e le azioni (rigenera / reset token).feeds/class-adapter.php— base astratta che mappa i campi Palladio → campi portale (query delle unità in vendita, immagini, geo dall'edificio).feeds/class-kyero.php— export Kyero v3 (XML), formato aperto accettato da Gate-away.com, Kyero e Idealista international (costruito con DOMDocument).feeds/class-csv.php— export CSV generico portabile.- I tracciati proprietari (es. Immobiliare.it) si aggiungono estendendo
Palladio_Feeds_Adaptere registrandoli via il filtropalladio/feeds/adapters.