📖 Brief Progetto
Il Gestionale Discover è il cuore operativo della rete MCL Media: un sistema PHP/SQLite che orchestra la pubblicazione automatizzata di articoli su oltre 280 siti WordPress ottimizzati per Google Discover, con revenue interamente da Hb Agency. Il gestionale governa l'intero ciclo di vita editoriale — dalla selezione delle fonti alla generazione dei titoli, dalla composizione degli articoli alla distribuzione push — attraverso un'architettura a tier (ELITE, MID, GROWTH, CRISIS, ZOMBIE) che adatta volume, boost e rotazione al rendimento di ciascun sito. A questo si affianca una rete di 26 siti Google News, 7 siti stranieri e 401 siti in parking, per un totale di 443 domini gestiti e oltre 254.000 iscritti push.
Il sistema è pienamente operativo nella sua configurazione più avanzata. Il PED Compositor v2, attivo dal 10 marzo, gestisce la composizione intelligente con cinque fonti per sito più le strategie sperimentali Discover Extra e Pillar Extra. Il PED Claude, deployato il 13 marzo, genera titoli tramite Claude Sonnet 4.6 con logica long tail/PAA, cooldown tre giorni e boost push calibrati sugli iscritti. Dashboard iscritti push e Trend Accessi con heatmap oraria sono in produzione.
Nella sessione del 19 marzo il lavoro si è concentrato sull'ottimizzazione del PED Claude per il periodo turbolento di Google Discover. Sono state implementate e deployate in produzione tre innovazioni principali. La prima è la modalità Conservative: una soglia di 500 accessi Google ieri determina se un sito riceve il trattamento completo (9 titoli, push normale per iscritti) o conservativo (4 titoli, max 1 push ogni 4 giorni con cooldown tracciato via last_push_date in sites.json, orari sparsi alle 06:00, 11:20, 16:40 e 22:00 con jitter). La seconda è il sistema Siti Verticali: un flag permanente configurabile da Gestione Siti (checkbox con campi condizionali nel modale) che associa al sito una categoria fissata e un articolo seme. I siti verticali usano un prompt Claude dedicato SEO strategico con approccio topic cluster — il seme funge da pillar, i titoli generati coprono angolazioni diverse del campo semantico. La terza innovazione è il fix del bug iscritti push N/D causato da CORS: il frontend ora legge subscribers_count direttamente da sites.json (alimentato dal cron notturno) con fallback fetch live.
Sono stati inoltre fixati due bug: la regola 7 anti-marchi mancante nel Path C di ped.php (aggiunta a tutte e 5 le lingue) e il cron subscribers-scan.php che non includeva i siti stranieri nella scansione. In totale sono stati deployati 6 file: gestisci.php, sites.php, ped_claude.php, ped-rilancio.php, ped.php, subscribers-scan.php.
Il prossimo step concreto resta il deploy del pacchetto del 15 marzo ancora in attesa: caricare i file rimanenti del gestionale (helpers.php, ped_engine.php, compositor.php, database.php), deployare il CMA v127 su tutti i siti attivi, e attivare il cron GNewsXity dopo almeno un giorno di enrichment attivo. A seguire: PED Parking per i 401 siti dormienti e eliminazione del vecchio sistema Farming.
Il sistema è pienamente operativo nella sua configurazione più avanzata. Il PED Compositor v2, attivo dal 10 marzo, gestisce la composizione intelligente con cinque fonti per sito più le strategie sperimentali Discover Extra e Pillar Extra. Il PED Claude, deployato il 13 marzo, genera titoli tramite Claude Sonnet 4.6 con logica long tail/PAA, cooldown tre giorni e boost push calibrati sugli iscritti. Dashboard iscritti push e Trend Accessi con heatmap oraria sono in produzione.
Nella sessione del 19 marzo il lavoro si è concentrato sull'ottimizzazione del PED Claude per il periodo turbolento di Google Discover. Sono state implementate e deployate in produzione tre innovazioni principali. La prima è la modalità Conservative: una soglia di 500 accessi Google ieri determina se un sito riceve il trattamento completo (9 titoli, push normale per iscritti) o conservativo (4 titoli, max 1 push ogni 4 giorni con cooldown tracciato via last_push_date in sites.json, orari sparsi alle 06:00, 11:20, 16:40 e 22:00 con jitter). La seconda è il sistema Siti Verticali: un flag permanente configurabile da Gestione Siti (checkbox con campi condizionali nel modale) che associa al sito una categoria fissata e un articolo seme. I siti verticali usano un prompt Claude dedicato SEO strategico con approccio topic cluster — il seme funge da pillar, i titoli generati coprono angolazioni diverse del campo semantico. La terza innovazione è il fix del bug iscritti push N/D causato da CORS: il frontend ora legge subscribers_count direttamente da sites.json (alimentato dal cron notturno) con fallback fetch live.
Sono stati inoltre fixati due bug: la regola 7 anti-marchi mancante nel Path C di ped.php (aggiunta a tutte e 5 le lingue) e il cron subscribers-scan.php che non includeva i siti stranieri nella scansione. In totale sono stati deployati 6 file: gestisci.php, sites.php, ped_claude.php, ped-rilancio.php, ped.php, subscribers-scan.php.
Il prossimo step concreto resta il deploy del pacchetto del 15 marzo ancora in attesa: caricare i file rimanenti del gestionale (helpers.php, ped_engine.php, compositor.php, database.php), deployare il CMA v127 su tutti i siti attivi, e attivare il cron GNewsXity dopo almeno un giorno di enrichment attivo. A seguire: PED Parking per i 401 siti dormienti e eliminazione del vecchio sistema Farming.
📁 File Progetto
0 file
Max 64M · zip, pdf, docx, xlsx, immagini, codice…
📊 Avanzamento
0%
✅ To Do List
0/0
Nessuna task
📝 Note
PED Compositor v2 su discover.gestionemcl.it — OPERATIVO dal 10/03/2026.
PED Claude su PED Rilancio — DEPLOYATO 13/03/2026.
PED Claude Multilingua + Conservative + Verticali — DEPLOYATO 19/03/2026.
Dashboard Iscritti Push — OPERATIVA dal 13/03/2026.
Trend Accessi con tab Parking — OPERATIVO dal 14/03/2026.
v126 Quality Upgrade prompt — PRONTO PER DEPLOY (15/03/2026).
Perplexity Enrichment + GNewsXity — CODICE COMPLETO, PRONTO PER DEPLOY (15/03/2026).
Child Master Admin v127 — ZIP PRONTO PER DEPLOY (15/03/2026).
Fix regola 7 anti-marchi Path C — DEPLOYATO 19/03/2026.
Fix iscritti push CORS + cron stranieri — DEPLOYATO 19/03/2026.
=== MODALITÀ CONSERVATIVE + SITI VERTICALI (19/03/2026) ===
Soglia traffico 500 accessi Google ieri applicata in ped_claude.php: legge traffic_hourly_history.json, se ieri < 500 visite → modalità CONSERVATIVE (4 titoli invece di 9, max 1 push ogni 4 giorni). Il push cooldown è gestito via last_push_date in sites.json, aggiornato da ped.php al momento dell'invio boost. Gli orari dei 4 articoli conservative sono distribuiti equamente tra 06:00-22:00 (slot fissi 06:00, 11:20, 16:40, 22:00 con ±10min jitter). Il frontend ped-rilancio.php mostra badge 🔴/🟢 per ogni sito con conteggio visite e numero articoli.
Siti Verticali: nuova tipologia configurabile da Gestione Siti (checkbox + campi condizionali nel modale). Tre campi in sites.json: is_vertical (bool), vertical_category (stringa), vertical_seed (titolo seme). I siti verticali usano un prompt Claude dedicato SEO strategico: il seme funge da pillar, i titoli generati sono spoke del topic cluster, con copertura semantica del settore (guide, confronti, errori comuni, target diversi). Il modale categoria nel PED Claude viene automaticamente saltato per i verticali. Badge 🎯 VERTICALE visibile sulle card siti e nel log.
Fix iscritti push N/D: il frontend faceva fetch cross-origin dal browser verso i siti WordPress, bloccata da CORS. Ora legge prima subscribers_count da sites.json (aggiornato dal cron notturno 03:00) con fallback fetch live. Il cron subscribers-scan.php ora include anche status 'straniero'.
Fix regola 7 anti-marchi: aggiunta a tutte e 5 le lingue nelle $rules_map del Path C di ped.php (MAI brand negativi, MAI persone reali non verificate, MAI inventare dati, NO fonti [1][2][3]).
File deployati (19/03): pages/siti/gestisci.php, handlers/sites.php, handlers/ped_claude.php, pages/piano-editoriale/ped-rilancio.php, handlers/ped.php, cron/subscribers-scan.php.
=== PED CLAUDE MULTILINGUA (18/03/2026) ===
Supporto siti stranieri (ES/FR/DE) nel flusso PED Claude. Due file modificati:
- pages/piano-editoriale/ped-rilancio.php: filtro siti esteso a status='straniero', nationality propagata nel globalScannedData e nel FormData verso il backend, bandierine nel log.
- handlers/ped_claude.php: riceve nationality (default 'it'), mappa $lang_map con 4 lingue contenente nome, istruzione Claude, label localizzate. Default prompt parametrizzato con lingua + riga 'LINGUA OBBLIGATORIA'. System prompt localizzato. Retrocompatibile.
=== v127 PERPLEXITY ENRICHMENT + GNEWSXITY (15/03/2026) ===
Perplexity Enrichment: ogni articolo discover standard (Path C ped.php + ped_engine.php + compositor.php) viene arricchito con dati verificati da Perplexity sonar-pro prima della generazione del prompt di scrittura. La funzione perplexity_enrich_title() in helpers.php chiama Perplexity con il titolo e la categoria, riceve un JSON con brief (3-5 fatti concreti) e sources (max 4 fonti). Il brief viene iniettato nel prompt come 'DATI VERIFICATI'. Le fonti vengono inviate al Child come sources_json nel payload incoming-article. Il Child (CMA v127) le salva come _mcl_article_sources post_meta. Il modulo utils/sources/core.php renderizza il box fonti in fondo all'articolo e inietta JSON-LD Article con citation nel <head>. Costo: ~$49/mese ($0.009/chiamata × 180/giorno).
Brand safety doppio filtro: Filtro 1 nel prompt Perplexity ('NON citare marchi o brand in contesto negativo/comparativo, preferisci fonti istituzionali'). Filtro 2 nelle rules di scrittura (regola 7 in 5 lingue, deployata 19/03).
GNewsXity: cron giornaliero ore 10:00. Seleziona 4 siti discover attivi (2 con più iscritti push + 2 con meno, cooldown 3gg in gnewsxity_sources.json). Da ciascuno prende 1 articolo di oggi (o ieri) con perplexity_brief non vuoto dal DB strategy_reports. Claude Sonnet 4.6 genera 9 titoli per sorgente (4-5 prefissati NEWS: + 4-5 DISCOVER:) = max 36 titoli. Distribuzione round-robin sui 26 siti GNews. Prompt di scrittura con brief iniettato + backlink randomizzato all'articolo discover sorgente (10 pattern editoriali). Fonti nel box: Perplexity originali + articolo discover come fonte aggiuntiva. Programmazione: 18 pomeriggio (15-19 oggi) + 18 mattina (9-13 domani). Tracking: gnewsxity_sources.json (cooldown), gnewsxity_log.json (storico run 30gg).
File gestionale modificati (completi, sostituzione 1:1 dopo backup):
- handlers/helpers.php (+92 righe): funzione perplexity_enrich_title() alla fine
- handlers/ped.php (+41 righe): Path C con chiamata Perplexity, brief nel prompt, sources nel payload, salvataggio DB
- handlers/ped_engine.php (+39 righe): stessa logica su 3 tentativi INSERT
- handlers/compositor.php (+37 righe): enrichment solo discover standard
- config/database.php (+19 righe): auto-patch colonne perplexity_brief + sources_json
- cron/gnewsxity.php (NUOVO, 516 righe)
- data/gnewsxity_sources.json (NUOVO, file vuoto iniziale)
Child Master Admin v127 (ZIP pronto):
- child-master-admin.php: versione 127.0, require utils/sources/core.php
- endpoint/generator.php: accetta sources_json, valida, salva come _mcl_article_sources
- utils/sources/core.php (NUOVO): filtro the_content (box fonti) + filtro wp_head (JSON-LD citation)
- utils/sources/style.css (NUOVO): CSS box fonti, responsive
Crontab da aggiungere:
- 0 10 * * * gnewsxity.php (dopo 1+ giorno di enrichment attivo)
=== v126 QUALITY UPGRADE (15/03/2026) ===
Analisi competitor: 10 siti analizzati, Network A (P.IVA 07082780821) identificato come best in class. Gap principali del network MCL: keyword stuffing, incipit enciclopedici, hash Pixabay nei filename, homepage mono-categoria.
Interventi gestionale:
- Nuovo prompt_meta_generator: istruzioni precise per GPT-4o-mini su incipit narrativo 2ª persona, angolo editoriale specifico per titolo, struttura H2 come domande del lettore, dati concreti obbligatori, regole anti-pattern nel meta-prompt.
- Rules tecniche: da 3 generiche a 7 precise in 5 lingue (IT/ES/FR/DE/EN) con anti-keyword-stuffing esplicito (keyword MAX 2-3, bold MAX 3-4), anti-filler, tono colloquiale 2ª persona, paragrafi MAX 3-4 righe, regola 7 anti-marchi.
- Aggiornate in: handlers/ped.php (Path A standard + Path B viral booster + Path C), handlers/ped_engine.php (PED automatico), handlers/compositor.php (discover articles).
Test confronto articolo 'Formiche nell'orto':
- PRIMA: 22 bold meccanici su 7 keyword forzate, H2 'Introduzione/Conclusione', incipit 'Le formiche nell'orto rappresentano...', 'Negli ultimi anni...'
- DOPO: 3 bold su 1 keyword (solo per enfasi reale), H2 come domande ('Perché le formiche compaiono nell'orto?'), incipit scena sensoriale ('Ti trovi nel tuo orto, il profumo della terra...'), dati concreti (2 cucchiai, 20-30 cm, 24-48 ore, 3-5 giorni)
Flusso prompt invariato: GPT-4o-mini genera meta-prompt ad-hoc per titolo (adattivo al topic) → gestionale prepende intro lingua → gestionale appende rules v126 → prompt finale al Child come _aag_custom_prompt.
=== ARCHITETTURA 3 LAYER ===
Intelligence (cron notturni: category-mapper 02:00, score-tracker 23:00, pool-harvester dom 04:00, subscribers-scan 03:00, traffic-logger ogni ora) → Compositor (composizione per tier con 5 fonti + discover_extra) → Interfaccia (one-click + tabella editabile).
Trend Accessi: heatmap oraria/giornaliera (10gg) per tutti i siti del network. Tab dinamici: Tutti i Siti (parking escluso per non inquinare totale), Siti Attivi, Google News, Stranieri, Parking. Dot colorati per categoria (verde=attivo, rosso=gnews, blu=straniero, grigio=parking). Cron traffic-logger.php ogni ora (:01 via Plesk) con scansione a batch da 50 siti tramite curl_multi + curl_multi_select. 443 siti totali (9 attivi + 26 gnews + 7 stranieri + 401 parking). Primo run corretto: 17.443 visite rilevate. Log in data/cron_traffic.log.
Dashboard Iscritti Push: pannello in home con card per ogni sito attivo (iscritti + delta giornaliero ▲/▼ + fascia boost 1/3/4 con colore oro/blu/grigio). Barra totali: attivi + 📰 G-News totale + 🅿️ Parking totale + 📊 Network totale. Storico in data/subscribers_history.json (30gg, formato {count, status} per sito). Aggiornamento automatico: PED Claude (da sites.json cached), pagina Notifiche (manuale), cron subscribers-scan.php (03:00 notturno, include status straniero). Il cron scansiona tutti i siti attivi + gnews + parking + stranieri via PerfectyPush REST API.
PED Claude: nuova strategia in PED Rilancio con Claude Sonnet 4.6. Flusso: scansione cat+iscritti push+traffico → soglia 500 (full 9 art vs conservative 4 art) → skip modale per verticali → modale per Generale (cat + titolo partenza) → generazione titoli con prompt standard o verticale (topic cluster) + cooldown 3gg articoli sorgente → boost: full = per iscritti push (>5K=1, 1K-5K=3, <1K=4), conservative = max 1 push/4gg con cooldown last_push_date → orari conservative sparsi (06:00, 11:20, 16:40, 22:00) → Top Boost automatico 3 siti con meno iscritti (24h). Iscritti letti da sites.json (cron notturno) con fallback fetch live. Prompt personalizzabile da Impostazioni. Modello selezionabile. Supporto multilingua. Costo stimato ~$5-9/mese.
Boost Checker v2: per URL ?p=ID usa REST API /wp-json/wp/v2/posts/{ID} (senza auth, solo post pubblici) invece di cURL diretto (che prendeva 404 dalla cache LiteSpeed). Fallback cURL per permalink puliti. Fix deployato 13/03.
Tier: ELITE (≥20k ieri), MID (≥5k), GROWTH (trend +10% e sett ≥5k), CRISIS (sett ≥10k, zeros ≤2), ZOMBIE (resto).
Stato 11/03: 2 ELITE (Tenuta 160k, Residence 163k) + 3 MID (Energia 11.9k, Slpc 9.7k, Fin 10k) + 1 GROWTH (Baba 1.1k trend +11%) + 0 CRISIS + 21 ZOMBIE.
Ricetta per tier: ELITE 3A+3T+2C+1W+1P, MID 4A+2T+2C+1W+1P, GROWTH 2A+4T+2C+1W+1P, CRISIS 2A+2T+2C+3W+1P (full) o 2P (pillar-only), ZOMBIE 5A+2T+1C+1W+1P (full) o 2P (pillar-only).
Sui tier forti (ELITE/MID/GROWTH) 1 TREND o ANCHOR viene promosso a discover_extra (pipeline pillar completo, tracciato separatamente).
Rotazione: ELITE/MID/GROWTH sempre full. Max 2 CRISIS + 2 ZOMBIE full/giorno, resto pillar-only. Tabella compositor_rotation traccia chi fa cosa.
Dedup: stesso sito = MAI riproporre (senza scadenza). Cross-sito = cooldown 3gg. Sessione giornaliera cross-sito per evitare duplicati nello stesso batch. PED Claude: cooldown 3gg su articoli-sorgente via claude_source_title.
Boost Compositor: ELITE 2, MID 2, GROWTH 3, CRISIS 3, ZOMBIE 2.
Boost Rilancio/Claude: doppia modalità. Full (≥500v): dinamico per iscritti push (>5K=1, 1K-5K=3, <1K=4), gap 2h stesso sito, slot 15min 05:00-22:45. Conservative (<500v): max 1 push/4gg con cooldown last_push_date, orari sparsi 06-22.
Top Boost Compositor: cross-network via promoted_articles.json, solo per CRISIS/ZOMBIE full (max 4 siti/giorno), 24h.
Top Boost Rilancio/Claude: 3 siti con meno iscritti, automatico post-invio, 24h.
Pillar: Perplexity sonar-pro per research → GPT-4.1 con dati reali + link interni (2 top + 1 recente). Prompt per categoria. Anti-ripetizione storica (ultimi 30gg di pillar dal DB). Divieto 'Ecco come/cosa/perché'. Contesto anno 'Oggi siamo nel 2026' in tutti i system prompt di generazione titolo.
Discover Extra (A/B test automatico): 1 articolo TREND/ANCHOR per sito ELITE/MID/GROWTH promosso a pipeline pillar completo (Perplexity + link interni). Al Child inviato come content_type=pillar. Nel gestionale tracciato come content_type=discover_extra.
Pillar Extra Discover (strategia manuale): bottone viola in PED Promptizzato. Per ogni sito ELITE/MID/GROWTH genera 1 pillar basato sul top article del momento (Perplexity research + backlink al top article + link interni recenti). Popola tabella per revisione, invio tramite 'Invia Piano'. Boost sempre ON. Content type: discover_extrapromptizzato. Backend: handle_process_pillar_extra_site + content_type_override in handle_process_single_prompted_article.
Pillar Extra GNews (12/03): 4 pillar da siti ZOMBIE Discover con backlink obbligatorio, pubblicati su 4 siti GNews diversi.
- Logica: 2 ZOMBIE di IERI (articoli già live con URL validi) + 2 ZOMBIE di OGGI (articoli in pubblicazione).
- Rotazione GNews: 4 siti diversi, no reuse per 7 giorni, gnews_pillar_rotation.json.
- Bottone manuale + Cron automatico ore 16:00 (pubblicazione 17:18 intervallo 10min).
GNewsXity (15/03): amplificazione articoli Discover su rete Google News.
- Cron ore 10:00, 4 sorgenti discover (2 top push + 2 low push, cooldown 3gg).
- Claude genera 36 titoli (9/sorgente), distribuiti round-robin su 26 siti GNews.
- Brief Perplexity riutilizzato dal DB (zero costi extra Perplexity).
- Backlink randomizzato al discover sorgente (10 pattern editoriali).
- Split programmazione: 18 pomeriggio (15-19) + 18 mattina dopo (9-13).
AI Models: GPT-4.1 (Compositor titoli + Child scrittura), GPT-4o-mini (prompt builder meta-prompt + SEO/immagini), Claude Sonnet 4.6 (PED Claude titoli + GNewsXity titoli), Perplexity sonar-pro (research pillar + enrichment articoli discover).
Child Master Admin v127: sources_json nel payload, box fonti HTML, JSON-LD Article citation. Retrocompatibile: articoli senza fonti non mostrano il box.
Flusso quotidiano: cron 01:00 aggiorna intel → cron 03:00 scansione iscritti push (incl. stranieri) → sera ~20:00 Componi + Invia + Top Boost auto → cron 10:00 GNewsXity → cron 16:00 Pillar Extra GNews auto → opzionale Pillar Extra Discover da Promptizzato → opzionale PED Claude da Rilancio → cron 22:00 score-tracker.
Content types nel gestionale: discover (standard), pillar (Compositor), discover_extra (A/B test auto nel Compositor), discover_extrapromptizzato (Pillar Extra manuale Discover + Pillar Extra GNews).
Crontab completo (root):
- 0 2 * * * category-mapper.php (intel siti)
- 0 3 * * * subscribers-scan.php (iscritti push network, incl. stranieri)
- 0 10 * * * gnewsxity.php (amplificazione GNews — da attivare dopo 1+ giorno enrichment)
- 0 16 * * * pillar-extra-gnews.php (da deployare)
- 0 23 * * * score-tracker.php (title_score)
- 0 4 * * 0 pool-harvester.php (alimentazione pool dom)
Crontab Plesk:
- Hourly :01 traffic-logger.php (traffico Google, batch 50)
PHP: /opt/plesk/php/8.3/bin/php
Server: root@compassionate-bassi
Path: /var/www/vhosts/gestionemcl.it/discover.gestionemcl.it
📜 Changelog
Deploy modalità Conservative + Siti Verticali + fix anti-marchi. PED Claude ora opera con soglia 500 accessi Google ieri: siti ≥500 ricevono 9 titoli (full), siti <500 ricevono 4 titoli (conservative) con max 1 push ogni 4 giorni (cooldown via last_push_date in sites.json) e orari sparsi 06:00-22:00. Nuova tipologia Siti Verticali: flag permanente in sites.json con categoria fissata + titolo seme, prompt Claude dedicato SEO strategico (topic cluster), skip automatico modale categoria. Gestione Siti aggiornata con checkbox 🎯 Sito Verticale + campi condizionali nel modale. 6 file deployati: gestisci.php, sites.php, ped_claude.php, ped-rilancio.php, ped.php, subscribers-scan.php.
2026-03-19 15:30 · claude
Fix regola 7 anti-marchi nel Path C di ped.php: aggiunta a tutte e 5 le lingue (IT/ES/FR/DE/EN) nelle $rules_map — MAI brand/marchi negativi, MAI persone reali con fatti non verificati, MAI inventare dati, NON inserire fonti [1][2][3]. La regola era presente nei Path A e B ma mancava nel Path C (quello usato dal PED Promptizzato e PED Claude).
2026-03-19 15:00 · claude
Fix iscritti push N/D (CORS) + cron stranieri: il frontend ped-rilancio.php faceva fetch cross-origin dal browser verso i siti WordPress, bloccata da CORS. Ora legge prima subscribers_count da sites.json (popolato dal cron notturno) con fallback fetch live. Il cron subscribers-scan.php non includeva status 'straniero' nella lista di scansione — aggiunto. Cron già attivo alle 03:00 (verificato: 384 siti, 254.953 iscritti totali).
2026-03-19 14:30 · claude
Tracking last_push_date in ped.php: quando un articolo boost viene inviato tramite handle_process_rilancio_single_article, il sistema aggiorna last_push_date nel sites.json con lock file. Questo alimenta il cooldown 4 giorni per i siti in modalità conservative nel frontend ped-rilancio.php.
2026-03-19 14:00 · claude
PED Claude multilingua per siti stranieri — 2 file prodotti pronti per deploy. ped-rilancio.php: filtro siti attivi esteso a status='straniero', nationality propagata nel globalScannedData e passata al backend via FormData, bandierine (🇮🇹/🇪🇸/🇫🇷/🇩🇪) nel log di scansione e generazione. ped_claude.php: riceve $_POST['nationality'] (default 'it'), mappa $lang_map con 4 lingue (it/es/fr/de) contenente nome lingua, istruzione per Claude, label localizzate (visite/media/no data/pool vuoto). Default prompt riscritto con lingua parametrica + riga 'LINGUA OBBLIGATORIA: tutti i titoli DEVONO essere scritti in {lingua}'. System prompt completamente localizzato. Retrocompatibile: siti italiani funzionano identicamente.
2026-03-18 09:00 · claude
Child Master Admin v127 — Perplexity Sources + JSON-LD Citation: nuovo modulo utils/sources/ con core.php (filtro the_content per box fonti HTML + filtro wp_head per JSON-LD Article citation, entrambi attivi solo se post ha _mcl_article_sources) e style.css (design coerente con box In Breve). endpoint/generator.php aggiornato: accetta sources_json nel payload incoming-article, valida ogni fonte (title + URL), salva come _mcl_article_sources post_meta. Log ricezione aggiornato con conteggio fonti. Versione bumped a 127.0, require modulo sources nel main plugin file. ZIP pronto per deploy WordPress.
2026-03-15 15:00 · claude
GNewsXity cron completo — cron/gnewsxity.php: seleziona 4 siti discover attivi (2 top push + 2 bottom push, cooldown 3gg da gnewsxity_sources.json), recupera 1 articolo/sorgente con perplexity_brief dal DB (oggi o fallback ieri), Claude Sonnet 4.6 genera 9 titoli/sorgente (4-5 NEWS + 4-5 DISCOVER prefix), distribuzione round-robin su 26 siti GNews, prompt con brief iniettato + backlink randomizzato (10 pattern editoriali), fonti combinate (Perplexity + discover sorgente), split 18 pomeriggio (15-19 oggi) + 18 mattina (9-13 domani). Tracking: gnewsxity_sources.json (cooldown) + gnewsxity_log.json (run history 30gg). Crontab: 0 10 * * *.
2026-03-15 14:00 · claude
Perplexity Enrichment — file gestionale COMPLETI (non patch): helpers.php (+92 righe, funzione perplexity_enrich_title alla fine), ped.php (+41 righe, 4 modifiche in Path C: chiamata Perplexity → iniezione brief DATI VERIFICATI → sources_json nel payload Child → salvataggio DB con colonne extra), ped_engine.php (+39 righe, stessa logica su 3 tentativi INSERT anti-crash), compositor.php (+37 righe, enrichment solo per discover standard, pillar/discover_extra invariati), database.php (+19 righe, auto-patch colonne perplexity_brief TEXT + sources_json TEXT su strategy_reports + archive). Brand safety: Filtro 1 nel prompt Perplexity (no marchi negativi/comparativi, preferenza fonti istituzionali), Filtro 2 nelle rules di scrittura (MAI brand negativi). Fallback graceful: se Perplexity non trova dati → brief vuoto → articolo esce come prima senza fonti.
2026-03-15 12:00 · claude
v126 Quality Upgrade — Gestionale: nuovo prompt_meta_generator configurato in Impostazioni con istruzioni dettagliate (incipit narrativo 2ª persona, angolo editoriale, H2 come domande, dati concreti, anti-pattern). Rules tecniche aggiornate da 3 a 6 regole in 5 lingue (IT/ES/FR/DE/EN) su handlers/ped.php, handlers/ped_engine.php, handlers/compositor.php. Anti-keyword-stuffing (MAX 2-3 keyword, MAX 3-4 bold), anti-filler, tono 2ª persona, paragrafi MAX 3-4 righe, dati concreti obbligatori. Test confronto articolo 'Formiche nell'orto': PRIMA 22 bold meccanici + H2 'Introduzione/Conclusione' + incipit enciclopedico → DOPO 3 bold + H2 domande lettore + scena sensoriale in 2ª persona con dati concreti (2 cucchiai, 24-48 ore, 3-5 giorni).
2026-03-15 08:00 · claude
Analisi competitor Discover: 10 siti analizzati in dettaglio (homepage + articolo ciascuno), 4 network identificati. Ranking: re-mark.it 7.5, genesistechstore.it 7.5, folladornurseryschool.it 7, hostariaapicius.it 6.5, bionikeresort.it 6, mbrenergia.it 5.5, tenutavaldorso.it 5.5, taxsi.it 5.5, cardonexperience.it 5, sophiestique.it 4.5, casatazzi.it 4. Network A (P.IVA 07082780821) = best in class per tono narrativo e immagini. KefaBlog (MCL) = 3 siti con keyword stuffing e hash Pixabay. Gap principali tradotti in 6 fix implementati nel CMA v126 + 3 fix nel gestionale.
2026-03-15 06:00 · claude
Traffic Logger batch: riscritta scansione curl_multi con batch da 50 siti + curl_multi_select. Causa root del problema: 443 siti (di cui 401 parking aggiunti questa sessione) in parallelo simultaneo causavano crash silenzioso con 0 visite registrate. Con batch: 9 batch × 50 siti, ~17.443 visite rilevate nel primo run corretto. File aggiornato in produzione.
2026-03-14 07:00 · claude
Traffic Logger cron: diagnostica completa. Il cron era presente in Plesk (Hourly at 01 min) ma non aveva mai girato correttamente perché il file cron_traffic.log non esisteva. Creato log con chmod 666. Aggiunto anche in crontab root come doppione (poi rimosso). Problema principale: curl_multi con 443 connessioni parallele crashava silenziosamente restituendo 0 visite nonostante l'API Plausible rispondesse correttamente (verificato: 6.323 visite su sophiestique.it via curl singolo).
2026-03-14 06:30 · claude
Trend Accessi — tab Parking: aggiunto rilevamento dinamico $exists_parking nel loop siti, tab '🅿️ Parking' appare solo se esistono siti parking. Fix filtro selezione: prima logica errata mostrava tutti i siti anche selezionando Parking. Logica corretta: parking escluso da 'Tutti i Siti' (per non inquinare totale network), visibile solo nel tab dedicato. Aggiunto dot CSS .dot-pk grigio (#94a3b8). Deploy: trend-accessi.php aggiornato.
2026-03-14 06:00 · claude
Traffic Logger — parking aggiunto: incluso 'parking' in status_map del cron traffic-logger.php. Siti parking ora scansionati da Plausible ogni ora e salvati in traffic_hourly_history.json con status normalizzato 'parking'. Questo ha portato da 42 a 443 siti target (401 parking).
2026-03-14 05:45 · claude
Dashboard iscritti push v2: aggiunta barra totali con G-News totale + delta e Parking totale + delta + Network totale (somma attivi+gnews+parking). Backend handle_get_subscribers_dashboard aggiornato per restituire gnews e parking aggregati. _save_subscribers_history salva ora tutti i tipi (attivi+gnews+parking) con formato {count, status}. Retrocompatibile con vecchio formato.
2026-03-13 08:15 · claude
Cron subscribers-scan.php: scansione notturna di tutti i siti (attivi + gnews + parking) via PerfectyPush, aggiorna sites.json e subscribers_history.json. Configurato in crontab alle 03:00 (spostato da 02:00 per non collidere con category-mapper). Log su data/cron_subscribers.log.
2026-03-13 08:00 · claude
Dashboard iscritti push in home: pannello '📱 Iscritti Push Network' con card per ogni sito attivo (iscritti + delta ▲/▼ + fascia boost 1/3/4 con colore). Barra totali con somma iscritti e delta giornaliero. Backend: handle_get_subscribers_dashboard + handle_save_subscribers_from_scan + _save_subscribers_history. Storico in data/subscribers_history.json (30gg). PED Claude salva automaticamente nello storico durante scansione.
2026-03-13 07:45 · claude
Fix ajax-handler.php routing: i case get_subscribers_dashboard e save_subscribers_from_scan erano mescolati nel blocco originale sites.php, rompendo il routing di get_subscriber_counts, send_broadcast_notification, system_total_reset e get_site_scheduling_status. Separati in blocco dedicato con proprio break.
2026-03-13 07:30 · claude
Fix Boost Checker v2 (REST API): il vecchio checker faceva cURL diretto su URL ?p=ID che riceveva 404 dalla cache LiteSpeed (verificato: curl dal server restituisce 404 su ?p=198 senza cookie, ma 200 con cookie). Nuovo metodo: se URL contiene ?p=ID, chiama /wp-json/wp/v2/posts/{ID}?_fields=id,link,status senza auth. Post publish → restituisce link pulito (200). Post future → restituisce 401 (rest_forbidden) → riprova al giro dopo. Fallback cURL classico per permalink già puliti. Testato live: articolo 16281 rilevato PUBBLICATO al secondo tentativo via REST con permalink completo. Resettati 5 FAILED di oggi.
2026-03-13 06:30 · claude
Debug Boost Checker: investigazione su 5 articoli FAILED (tutti con publication_date 04:00-05:00 UTC). Test curl dal server: URL ?p=198 restituisce 404 (cache LiteSpeed blocca permalink brutti per richieste senza sessione), permalink pulito restituisce 200, ?p=198 con cookie restituisce 200 (redirect al permalink). Causa root identificata: plugin cache blocca ?p=ID per visitatori non autenticati.
2026-03-13 06:00 · claude
ℹ️ Info
URL
discover.gestionemcl.it
Siti attivi
9
Siti totali
443
Siti parking
401
Siti GNews
26
Siti stranieri
7
Plugin
Child Master Admin v127 (Perplexity sources + JSON-LD citation), v126 in produzione
Push
254k+ (384 siti scansionati)
Revenue
Hb Agency
Compositor
Tier-based (ELITE/MID/GROWTH/CRISIS/ZOMBIE), 5 fonti (ANCHOR/TREND/CROSS/WILD/PILLAR) + DISCOVER EXTRA (A/B test auto) + PILLAR EXTRA (strategia manuale da PED Promptizzato)
Perplexity Enrichment
Chiamata sonar-pro per ogni titolo discover (Path C ped.php + ped_engine.php + compositor.php). Brief 3-5 fatti verificati iniettato come DATI VERIFICATI nel prompt. sources_json inviato al Child per box fonti + JSON-LD citation. Brief salvato in strategy_reports per riutilizzo GNewsXity. Brand safety doppio filtro: prompt Perplexity (no marchi negativi) + rules scrittura (regola 7 in 5 lingue). Costo ~$49/mese ($0.009/chiamata × 180/giorno).
GNewsXity
Cron ore 10:00. Seleziona 4 siti discover (2 top push + 2 low push, cooldown 3gg). Prende 1 articolo/sorgente con brief Perplexity dal DB. Claude genera 9 titoli/sorgente (4-5 NEWS + 4-5 DISCOVER) = 36 titoli. Distribuzione round-robin su 26 siti GNews. Scrittura con brief iniettato + backlink randomizzato (10 pattern). Programmazione: 18 pomeriggio (15-19) + 18 mattina dopo (9-13). Fonti: Perplexity originali + discover sorgente. Tracking: gnewsxity_sources.json + gnewsxity_log.json.
PED Claude
Strategia con Claude Sonnet 4.6 in PED Rilancio. Soglia traffico 500 accessi Google ieri: ≥500 = modalità FULL (9 titoli, push normale per iscritti), <500 = modalità CONSERVATIVE (4 titoli, max 1 push ogni 4 giorni con cooldown via last_push_date in sites.json). Orari conservative sparsi: 06:00, 11:20, 16:40, 22:00 (±10min jitter). Siti Verticali: flag is_vertical + vertical_category + vertical_seed in sites.json, prompt SEO strategico topic cluster (articolo seme come pillar, titoli come spoke), skip modale categoria. Push per iscritti (solo modalità full): >5K=1, 1K-5K=3, <1K=4, gap 2h stesso sito. Iscritti letti da sites.json (cron notturno) con fallback fetch live. Supporto multilingua: ES/FR/DE con prompt localizzati.
PED Claude Multilingua
ped-rilancio.php include siti con status='straniero' nel pool attivo. Il campo nationality viene propagato da sites.json → globalScannedData → FormData → backend ped_claude.php. Backend: $lang_map con 4 lingue (it/es/fr/de), ogni lingua ha nome, istruzione per Claude, label localizzate (visite/media/no data/no pool). Default prompt riscritto con lingua parametrica + riga 'LINGUA OBBLIGATORIA'. System prompt localizzato. Log con bandierine (🇮🇹/🇪🇸/🇫🇷/🇩🇪). Retrocompatibile: siti italiani funzionano identicamente (default 'it').
Siti Verticali
Flag permanente in sites.json con is_vertical (bool), vertical_category (stringa) e vertical_seed (titolo seme). Configurabili da Gestione Siti (modale con checkbox + campi condizionali). Il sito verticale è sempre trattato con la stessa categoria e con titoli generati ad hoc dal seme. Claude usa prompt SEO strategico: topic cluster con seme come pillar e titoli come spoke, copertura semantica del settore (guide, confronti, errori comuni, target diversi). Stessa logica soglia 500 per volume (4 sotto, 9 sopra). Badge 🎯 VERTICALE su card siti e log PED Claude. Skip modale categoria automatico.
Prompt Quality v126
Nuovo prompt_meta_generator con istruzioni dettagliate (incipit narrativo 2ª persona, angolo editoriale, struttura H2 come domande, dati concreti, anti-pattern). Rules tecniche da 3 a 7 regole per 5 lingue (IT/ES/FR/DE/EN) su ped.php + ped_engine.php + compositor.php. Regola 7: MAI brand/marchi negativi, MAI persone reali con fatti non verificati, MAI inventare dati, NON inserire fonti [1][2][3] nel testo.
Boost Rilancio
Push intelligente con doppia modalità. FULL (≥500 accessi Google ieri): basato su iscritti (>5000=1/giorno, 1000-5000=3/giorno, <1000=4/giorno), slot 05:00-22:45 ogni 15min, gap 2h stesso sito. CONSERVATIVE (<500 accessi): max 1 push ogni 4 giorni con cooldown via last_push_date in sites.json, orari articoli sparsi (06:00, 11:20, 16:40, 22:00 ±jitter). Top Boost 24h automatico per i 3 siti con meno iscritti.
Boost Compositor
Push adattivo per tier (ELITE 2, MID 2, GROWTH 3, CRISIS 3, ZOMBIE 2) + Top Boost cross-network 24h solo per CRISIS/ZOMBIE full (max 4 siti/giorno)
Rotazione
ELITE/MID/GROWTH sempre full + max 2 CRISIS + 2 ZOMBIE full/giorno, resto pillar-only
Tier attuale (11/03)
2 ELITE + 3 MID + 1 GROWTH + 0 CRISIS + 21 ZOMBIE
Dedup
Stesso sito: MAI riproporre (senza scadenza). Cross-sito: cooldown 3gg. Sessione giornaliera cross-sito. PED Claude: cooldown 3gg su articoli-sorgente via colonna claude_source_title.
Discover Extra
1 TREND/ANCHOR per sito ELITE/MID/GROWTH promosso a pipeline pillar (Perplexity + link interni), inviato al Child come pillar, tracciato come discover_extra per A/B test
Pillar Extra
Strategia manuale da PED Promptizzato: 1 pillar per sito forte basato sul top article del momento, con Perplexity research + backlink al top article, boost sempre ON, tracciato come discover_extrapromptizzato
Pillar Extra GNews
4 pillar da siti ZOMBIE Discover (2 di ieri con articoli già live + 2 di oggi in pubblicazione) con backlink obbligatorio, distribuiti su 4 siti GNews diversi con rotazione 7gg. Bottone manuale in PED Promptizzato GNews + cron automatico ore 16:00 con pubblicazione 17:18 intervallo 10min.
Boost Checker
v2 con REST API: per URL ?p=ID chiama /wp-json/wp/v2/posts/{ID} (no auth, post pubblici) invece di cURL diretto (che prendeva 404 dalla cache LiteSpeed). Fallback cURL classico per permalink puliti.
Dashboard Iscritti
Pannello in home con card per ogni sito attivo (iscritti + delta ▲/▼ + fascia boost). Barra totali: attivi + G-News + Parking + Network totale. Storico in subscribers_history.json (30gg). Aggiornamento: PED Claude auto (da sites.json cached), pagina Notifiche manuale, cron notturno 03:00 (subscribers-scan.php). Cron aggiornato: scansiona anche status 'straniero'.
Trend Accessi
Heatmap oraria/giornaliera (10gg) su tutti i siti. Tab dinamici: Tutti (escluso parking), Attivi, GNews, Stranieri, Parking. Cron traffic-logger ogni ora (:01 via Plesk) con scansione a batch da 50 siti tramite curl_multi + curl_multi_select. Log in data/cron_traffic.log.
Analisi competitor
10 siti analizzati (15/03/2026): re-mark.it 7.5, genesistechstore.it 7.5, folladornurseryschool.it 7, hostariaapicius.it 6.5, bionikeresort.it 6, mbrenergia.it 5.5, tenutavaldorso.it 5.5, taxsi.it 5.5, cardonexperience.it 5, sophiestique.it 4.5, casatazzi.it 4. Network A (P.IVA 07082780821) = best in class.
AI Models
GPT-4.1 (Compositor, Child), GPT-4o-mini (prompt builder meta-prompt ad-hoc per titolo, SEO/immagini), Claude Sonnet 4.6 (PED Claude titoli + GNewsXity titoli), Perplexity sonar-pro (research pillar + enrichment articoli discover)
Prossimo step
Deploy pacchetto 15 marzo (helpers.php, ped_engine.php, compositor.php, database.php). Deploy CMA v127 su tutti i siti. Attivare cron GNewsXity dopo 1+ giorno di enrichment attivo. Deploy Pillar Extra GNews. PED Parking. Eliminare Farming.
🛠 Tech Stack
🔗 Link
📘 README
# Gestionale Discover
**Pannello di controllo centralizzato per la gestione operativa di una rete di 280+ siti web italiani ottimizzati per Google Discover.**
Sviluppato da **MCL Media SRL** — stack PHP/SQLite con frontend HTML/CSS/JS vanilla, progettato per funzionare su server Plesk (VPS OVH).
---
## Panoramica
MCL Control Center è il gestionale interno che orchestra l'intero flusso editoriale, dalla generazione AI dei contenuti alla pubblicazione automatizzata, passando per il monitoraggio del traffico in tempo reale, la gestione delle notifiche push, la distribuzione WhatsApp e l'indicizzazione Google.
Il sistema gestisce tre tipologie principali di siti — **Discover** (core business), **Google News** e **Stranieri** (mercati esteri) — con un modulo aggiuntivo di **Franchise** per collaboratori esterni.
**URL di produzione:** `discover.gestionemcl.it`
---
## Architettura
```
mcl-control-center/
│
├── index.php # Entry point → redirect a /pages/home.php
├── login.php # Autenticazione multi-ruolo
├── health.php # Health check (browser, CLI, token)
├── ajax-handler.php # Router AJAX principale
├── ajax-handler-extra.php # Handler AJAX secondario
├── cron_runner.php # Orchestratore cron jobs
├── cron-ped.php # Cron specifico Piano Editoriale
│
├── config/
│ ├── database.php # Schema SQLite + init tabelle
│ ├── functions.php # Logica cron (Boost, Strategie, Pulizia)
│ ├── auth_check.php # Middleware autenticazione sessione
│ ├── access_control.php # Filtro siti per ruolo (admin/franchise)
│ ├── logger.php # Sistema di logging
│ ├── sites_cache.php # Cache lista siti
│ └── service-account.json # Credenziali Google API
│
├── handlers/ # Logica backend (business logic)
│ ├── ped.php # PED core — generazione articoli (Gemini Flash)
│ ├── ped_engine.php # PED Engine — classificazione siti e calcolo piano
│ ├── ped_generator.php # PED Generator — proposta editoriale (OpenAI + Plausible)
│ ├── ped_update_v1.php # PED Update V1 — sistema editoriale expertise-based
│ ├── ped_launch_v1.php # Lancio nuovi siti con PED V1
│ ├── ped_v18.php # Legacy PED v18
│ ├── helpers.php # Funzioni helper condivise
│ ├── stats.php # Plausible Analytics + SEOZoom API
│ ├── sites.php # CRUD siti
│ ├── whatsapp.php # WhatsApp Channels auto-post (WAHA API)
│ ├── google_indexing.php # Google Indexing API (via proxy)
│ ├── promoted_article.php # Sistema "Boost" articoli promossi
│ ├── franchise.php # Logica modulo Franchise
│ ├── images.php # Gestione immagini
│ ├── images_analysis.php # Analisi qualità immagini
│ ├── images_archive.php # Archivio immagini
│ ├── authors.php # Gestione autori
│ ├── plugins.php # Gestione plugin WordPress remoti
│ ├── report_strategie_api.php # API report strategie editoriali
│ ├── servers.php # Gestione server
│ ├── titles.php # Gestione titoli
│ ├── social.php # Canali social
│ ├── earnings.php # Tracking guadagni
│ ├── mass_nuke_logic.php # Eliminazione massiva articoli
│ ├── seozoom-logic.php # Integrazione SEOZoom
│ └── google-news/ # Sub-handlers Google News
│ ├── logic.php # Logica base GNews
│ ├── logic-sanremo.php # Copertura eventi Sanremo
│ ├── logic-championship.php # Copertura campionati sportivi
│ ├── logic-league.php # Copertura leghe
│ ├── logic-frasi.php # Generazione frasi/citazioni
│ ├── logic-oroscopo.php # Generazione oroscopo
│ ├── logic-tv.php # Trending TV
│ └── logic-nuke.php # Pulizia articoli GNews
│
├── cron/ # Job schedulati (crontab)
│ ├── traffic-logger.php # Log orario traffico da Plausible
│ ├── boost-refresh.php # Refresh pool articoli boost
│ ├── whatsapp-queue.php # Processore coda WhatsApp (ogni 15 min)
│ ├── whatsapp.php # Worker WhatsApp
│ ├── aggiorna.php # Aggiornamento dati generale
│ ├── frasi-runner.php # Runner frasi/citazioni
│ ├── oroscopo-runner.php # Runner oroscopo
│ ├── news-scout-runner.php # Scout automatico notizie
│ └── test.php # Test cron
│
├── pages/ # Frontend (interfacce utente)
│ ├── home.php # Dashboard principale con live stats
│ │
│ ├── piano-editoriale/ # Modulo Piano Editoriale
│ │ ├── ped-update-v1.php # PED Update V1 (principale)
│ │ ├── ped-launch-v1.php # Lancio nuovi siti
│ │ ├── ped-update-v1-profili.php # Profili editoriali per sito
│ │ ├── ped-update-v1-dizionario.php # Dizionario tematico
│ │ ├── ped-update-v1-test.php # Test singolo prompt
│ │ ├── ped-update-v1-test-v2.php # Confronto modelli AI
│ │ ├── ped-promptizzato.php # PED con prompt personalizzati
│ │ ├── ped-rilancio.php # Rilancio siti in calo
│ │ ├── ped-books.php # PED verticale libri
│ │ ├── avvio-nuovo-sito.php # Wizard avvio nuovo sito
│ │ ├── avvio-farming.php # Avvio fase farming
│ │ ├── genera-ped.php # Generazione manuale PED
│ │ ├── archivio-ped.php # Archivio storico PED
│ │ └── debug-gpt.php # Debug prompt AI
│ │
│ ├── analisi/ # Modulo Analisi e Report
│ │ ├── trend-accessi.php # Trend traffico nel tempo
│ │ ├── guadagni.php # Dashboard guadagni
│ │ ├── articoli-top-boost.php # Top articoli boostati
│ │ ├── whatsapp-channels.php # Analisi canali WhatsApp
│ │ ├── top-articoli.php # Classifica articoli
│ │ ├── analisi-autori.php # Performance autori
│ │ ├── analisi-titoli.php # Analisi titoli
│ │ ├── analisi-immagini.php # Analisi immagini
│ │ ├── top-keyword.php # Top keyword
│ │ ├── analisi-pool.php # Analisi pool contenuti
│ │ ├── analisi-boost.php # Analisi boost dettagliato
│ │ ├── analisi-franchise.php # Analisi franchise
│ │ ├── report-boost.php # Report singolo boost
│ │ ├── report-strategie.php # Report strategie editoriali
│ │ ├── google-indexing.php # Status indicizzazione Google
│ │ ├── classifiche.php # Classifiche generali
│ │ ├── controllo-accessi.php # Log accessi
│ │ ├── seo-strategy.php # Strategia SEO
│ │ ├── trend-focus.php # Focus trend specifici
│ │ └── traffico.php # Panoramica traffico
│ │
│ ├── gestione/ # Modulo Gestione Operativa
│ │ ├── impostazioni.php # Impostazioni generali (API keys, config)
│ │ ├── gestione-immagini.php # Interfaccia grafico (Salvina)
│ │ ├── gestione-autori.php # Gestione autori
│ │ ├── archivio-immagini.php # Archivio immagini
│ │ ├── plugin.php # Gestione plugin WP remoti
│ │ ├── server.php # Gestione server
│ │ ├── social.php # Canali social
│ │ ├── franchise.php # Config franchise
│ │ ├── check-siti.php # Health check siti
│ │ ├── elimina-articoli.php # Eliminazione massiva
│ │ └── health.php # System health dettagliato
│ │
│ ├── siti/
│ │ └── gestisci.php # Gestione siti (CRUD + status)
│ │
│ ├── farming/ # Modulo Farming (crescita nuovi siti)
│ │ ├── dashboard.php # Dashboard farming
│ │ └── debug_index.php # Debug indicizzazione farming
│ │
│ ├── franchise/ # Area Franchise (utenti esterni)
│ │ ├── home-franchise.php # Dashboard franchise
│ │ ├── ped-franchise.php # Invio articoli franchise
│ │ ├── ped-libri.php # PED libri franchise
│ │ ├── guadagni_franchise.php # Guadagni franchise
│ │ ├── articoli_mensili.php # Report mensile articoli
│ │ └── siti.php # Siti assegnati
│ │
│ ├── google-news/ # Modulo Google News
│ │ ├── home.php # Dashboard Google News
│ │ ├── sanremo-2026.php # Copertura Sanremo 2026
│ │ ├── league-manager.php # Gestione campionati
│ │ ├── campionato.php # Copertura campionato
│ │ ├── tv-trends.php # Trend TV
│ │ ├── news-scout.php # News Scout automatico
│ │ ├── news-scout-manager.php # Gestione News Scout
│ │ ├── ped-frasi.php # PED frasi
│ │ ├── ped-oroscopo.php # PED oroscopo
│ │ ├── ped-gnews.php # PED Google News
│ │ ├── ped-promptizzato-news.php # PED news con prompt
│ │ ├── siti.php # Siti Google News
│ │ ├── elimina.php # Pulizia articoli
│ │ └── debug-plausible.php # Debug Plausible
│ │
│ ├── stranieri/ # Modulo Siti Esteri
│ │ ├── home.php # Dashboard esteri
│ │ ├── avvio.php # Avvio sito estero
│ │ ├── ped-stranieri.php # PED esteri
│ │ ├── ped.php # PED base esteri
│ │ ├── siti.php # Siti esteri
│ │ ├── notifiche.php # Notifiche esteri
│ │ └── titoli.php # Titoli esteri
│ │
│ ├── titoli/ # Modulo Titoli
│ │ ├── elenco.php # Elenco titoli per pool
│ │ └── aggiorna-top.php # Aggiornamento titoli top
│ │
│ ├── addons/
│ │ └── notifiche.php # Gestione push notifications
│ │
│ └── log/
│ └── log.php # Visualizzatore log
│
├── templates/ # Template condivisi
│ ├── header.php # Header + navigazione admin
│ ├── header-google-news.php # Header Google News
│ ├── header-stranieri.php # Header esteri
│ └── footer.php # Footer
│
├── assets/
│ └── style.css # Foglio di stile principale
│
├── data/ # Dati persistenti (JSON + SQLite)
│ ├── gestionale.db # Database SQLite principale
│ ├── sites.json # Registry siti
│ ├── impostazioni.json # Configurazione globale (API keys)
│ ├── ped_rules.json # Regole PED Engine
│ ├── site_profiles.json # Profili editoriali per sito
│ ├── traffic_hourly_history.json # Storico traffico orario
│ └── promoted_articles.json # Configurazione boost attivi
│
└── vendor/ # Dipendenze Composer
└── google/ # Google API Client (Indexing, Search Console)
```
---
## Sistema di Autenticazione
Il gestionale implementa un sistema di autenticazione a tre ruoli con permessi differenziati:
| Ruolo | Accesso | Descrizione |
|-------|---------|-------------|
| **Admin** | Completo | Dashboard operativa, tutti i moduli, tutte le analisi, gestione sistema |
| **Graphic** | Limitato | Solo gestione immagini e analisi immagini (interfaccia per la grafica) |
| **Franchise** | Limitato | Dashboard franchise, invio articoli, PED libri, siti assegnati |
L'autenticazione avviene tramite sessione PHP con password hashate (`password_verify`). Il sistema supporta anche accesso token-based per gli endpoint di health check e le API interne.
---
## Moduli Principali
### 1. Dashboard Operativa (`pages/home.php`)
La homepage mostra in tempo reale lo stato dell'intera rete, con auto-refresh ogni 5 minuti:
- **Health Bar** — stato sistema (Cron, DB, Coda)
- **Totali live** — visitatori attivi aggregati per tipo (Discover, Google News, Esteri, Franchise)
- **Griglia siti attivi** — card per ogni sito con traffico live, trend, stato
- **Sezioni collassabili** — Attivi, Google News, Esteri, Farming
### 2. Piano Editoriale (PED)
Il cuore del sistema. Genera piani editoriali automatizzati per ogni sito basandosi su dati di traffico, keyword e AI.
**PED Update V1** (sistema attuale) opera con un approccio "expertise-based":
- Analizza il traffico via Plausible Analytics per identificare le tematiche forti di ogni sito
- Genera profili editoriali verticali per ciascun sito
- Usa un dizionario tematico personalizzabile per mantenere coerenza
- Produce articoli ottimizzati tramite AI (Gemini Flash / OpenAI GPT-4o)
- Supporta confronto tra modelli AI diversi per quality assurance
**PED Engine** classifica i siti in fasce di performance:
- **Elite** (>20.000 visitatori/settimana) → piano intensivo
- **Mid** (>5.000) → piano standard
- **Growth** (in crescita settimanale) → investimento
- **Crisis** (in calo con giorni a zero) → intervento urgente
**Altre strategie PED:**
- **Promptizzato** — articoli con prompt personalizzati per tema
- **Rilancio** — piano dedicato a siti in calo
- **Books** — verticale libri/recensioni
- **Launch V1** — piano per nuovi siti
### 3. Sistema Boost
Automatizza la promozione degli articoli appena pubblicati:
- Monitora lo stato di pubblicazione (PENDING → PUBLISHED / FAILED)
- Verifica URL con follow redirect e detection homepage
- Max 3 tentativi per articolo
- Push notification automatica al raggiungimento dello stato PUBLISHED
- Report dettagliato per articolo e per strategia
### 4. WhatsApp Channels
Distribuzione automatica degli articoli sui canali WhatsApp via WAHA API:
- Mappatura categoria → canale WhatsApp
- Coda con scheduling intelligente (finestra 7:00–21:00, intervallo minimo 3h per canale)
- Processore coda ogni 15 minuti via cron
- Log completo di ogni invio
### 5. Google Indexing
Integrazione con Google Indexing API per forzare la scansione degli articoli:
- Invio URL tramite proxy (`gestionale-wf.mclmedia.eu`) per aggirare blocchi IP
- Check indicizzazione via Serper API
- Integrazione Google Search Console via Service Account
- Dashboard con stato indicizzazione per sito
### 6. Analisi e Report
Suite completa di strumenti analitici:
- **Trend Traffico** — grafici storici con dati Plausible
- **Guadagni** — tracking revenue per sito e periodo
- **Top Articoli / Keyword** — classifiche basate su performance reale
- **Analisi Autori** — performance per autore
- **Analisi Immagini** — qualità e copertura immagini
- **Report Strategie** — efficacia delle diverse strategie PED
- **SEO Strategy** — integrazione SEOZoom per keyword analysis
### 7. Farming
Modulo per la crescita dei nuovi siti (fase pre-Discover):
- Dashboard dedicata con metriche di indicizzazione
- Wizard avvio farming con configurazione automatica
- Debug indicizzazione per troubleshooting
### 8. Google News
Gestione dei siti Google News con strumenti dedicati:
- Copertura automatizzata eventi (Sanremo, campionati sportivi, trend TV)
- News Scout per scoperta automatica notizie
- PED specifici (frasi, oroscopo, news promptizzate)
- Header e navigazione dedicati
### 9. Franchise
Area per collaboratori esterni con accesso limitato:
- Dashboard personalizzata con soli siti assegnati
- Interfaccia invio articoli semplificata
- Report guadagni e articoli mensili
- PED Libri dedicato
---
## Integrazioni Esterne
| Servizio | Utilizzo | Configurazione |
|----------|----------|----------------|
| **Plausible Analytics** | Traffico real-time e storico | API key in `impostazioni.json` |
| **Google Gemini Flash** | Generazione contenuti AI (PED core) | API key in `impostazioni.json` |
| **OpenAI GPT-4o** | Generazione contenuti AI (PED Generator) | API key in `impostazioni.json` |
| **Google Indexing API** | Indicizzazione forzata URL | Service Account + proxy |
| **Google Search Console** | Dati search e indicizzazione | Service Account |
| **SEOZoom** | Keyword research e analisi domini | API key in `impostazioni.json` |
| **WAHA** | WhatsApp Business API self-hosted | Server dedicato |
| **Serper** | Google Search API per index check | API key |
| **WordPress REST API** | Pubblicazione articoli sui siti | Bearer token per sito |
---
## Database
Il sistema utilizza **SQLite** (`data/gestionale.db`) con le seguenti tabelle principali:
| Tabella | Scopo |
|---------|-------|
| `pools` | Pool di contenuti tematici |
| `articles` | Articoli associati ai pool |
| `servers` | Registry server con SSH |
| `server_additional_ips` | IP aggiuntivi per server |
| `boost_articles` | Coda e storico articoli boost |
| `strategy_reports` | Report strategie editoriali |
| `sent_notifications` | Storico notifiche push |
| `users` | Utenti gestionale (admin, graphic) |
| `whatsapp_config` | Configurazione canali WhatsApp |
| `whatsapp_queue` | Coda invii WhatsApp |
| `whatsapp_log` | Log invii WhatsApp |
Il file JSON `data/sites.json` funge da registry principale per tutti i siti della rete, con URL, nome, status, e metadati associati.
---
## Cron Jobs
| Job | Frequenza | File | Funzione |
|-----|-----------|------|----------|
| Traffic Logger | Ogni ora | `cron/traffic-logger.php` | Salva totale visitatori giornaliero da Plausible |
| Boost Refresh | Ogni ora | `cron/boost-refresh.php` | Aggiorna pool articoli boost |
| WhatsApp Queue | Ogni 15 min | `cron/whatsapp-queue.php` | Processa coda invii WhatsApp |
| Aggiorna | Periodico | `cron/aggiorna.php` | Aggiornamento dati generale |
| Frasi Runner | Periodico | `cron/frasi-runner.php` | Generazione frasi/citazioni |
| Oroscopo Runner | Periodico | `cron/oroscopo-runner.php` | Generazione oroscopo |
| News Scout | Periodico | `cron/news-scout-runner.php` | Scoperta automatica notizie |
| PED Cron | Periodico | `cron-ped.php` | Esecuzione piano editoriale |
---
## Health Check
L'endpoint `/health.php` supporta tre modalità di accesso:
- **Browser** — richiede login attivo
- **CLI** — `php health.php --cli` (output testuale)
- **Monitor** — `curl .../health.php?token=SECRET` (accesso token)
Verifica: stato database, esecuzione cron, validità API key, spazio disco, dimensione log, integrità `sites.json`.
---
## Stack Tecnologico
| Componente | Tecnologia |
|------------|------------|
| Backend | PHP 8.x |
| Database | SQLite 3 |
| Frontend | HTML5, CSS3, JavaScript vanilla |
| Server | Plesk su VPS OVH (54.36.100.203) |
| API Google | Google API Client (Composer) |
| Hosting siti | WordPress multi-site su server dedicati |
| Analytics | Plausible (self-hosted) |
---
## Statistiche Codebase
| Metrica | Valore |
|---------|--------|
| File PHP | 161 |
| Righe di codice totali | ~51.600 |
| File più grande | `handlers/ped.php` (2.727 righe) |
| Pagine frontend | 55+ |
| Handler backend | 25+ |
| Cron job | 8 |
---
## Note di Sviluppo
- **Nessun framework PHP** — l'applicazione è costruita in PHP vanilla per massima semplicità e controllo
- **JSON come storage primario** — i dati di configurazione e i registry usano file JSON per velocità di accesso e semplicità di backup
- **SQLite per dati relazionali** — boost, strategie, notifiche e utenti risiedono nel DB
- **AJAX-driven** — l'interfaccia usa chiamate AJAX per tutte le operazioni, con `ajax-handler.php` come router centrale
- **Ruoli con menu dinamici** — il menu di navigazione si adatta automaticamente al ruolo dell'utente
- **Proxy per API bloccate** — l'Indexing API passa attraverso un server secondario per evitare blocchi IP
⚠️ Zona Pericolosa
clicca per espandere