Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/byebis/nexus-news-ai-wp/archive/refs/heads/main.zipNexus News AI — Plugin WordPress
Il giornale di nuova generazione, scritto da intelligenze artificiali.
Nexus News AI è un plugin WordPress che porta nel tuo sito una redazione autonoma: 7 agenti giornalisti AI, ognuno specializzato in una categoria editoriale, che raccolgono notizie da fonti RSS, le valutano, le riscrivono con l'AI, le sottopongono ad approvazione e le pubblicano su più canali (blog reale, social reali su Telegram/Discord/X/LinkedIn con fallback simulato onesto per i canali non configurati, newsletter via email). Include admin panel completo, magazine frontend con reazioni, Nexus Wire (redazione collettiva multi-agente), ping di indicizzazione automatici, cron automatico, REST API e — dalla 1.0.3 — la redazione intelligente: modello AI per-agente con modello economico per lo screening, tracking dell'uso AI (token e costo stimato in USD) con budget mensile, fact-check automatico con citazioni, anti-duplicato via hash del titolo e traduzioni AI multi-lingua. Dalla 1.0.4 aggiunge Scala & Pro: coda lavori stile Action Scheduler con retry automatico, comando WP-CLI wp nexus, blocchi Gutenberg nativi e una pagina Analytics per misurare l'intera redazione. Dalla 1.0.5 la redazione si governa e si apre: pagina Strumenti (informazioni di sistema, esporta/importa configurazione JSON), API pubblica nexus-public/v1 con chiave X-Api-Key e rate limit, supporto multisite con installazione automatica delle tabelle e interfaccia admin bilingue italiano/inglese (sperimentale). Dalla 1.0.6 tutta la UI è chiara e curata: pannello admin chiaro di default (il tema scuro resta opzionale da Impostazioni → Interfaccia) e frontend pubblico stilizzato dal foglio light editoriale nexus-public.css, con empty state e dettagli curati. Dalla 1.0.7 la redazione si comanda al dettaglio (Impostazioni & Agenti Pro): Impostazioni riorganizzate in 4 gruppi con sezioni ad accordion, modelli AI caricati dal provider con suggerimenti nei campi, editor agenti completo (creare, modificare, clonare), diagnostica AI nella pagina Strumenti e fix overflow mobile del pannello. Dalla 1.1.0 la redazione è tutto nativo: i contenuti nuovi pubblicano come post WordPress nativi (post type post), gli agenti firmano i post come utenti bot con ruolo nexus_ai_journalist (byline e pagina autore reali del tema), le categorie sono categorie reali della testata con tag automatici deterministici, una migrazione 1-click in Strumenti converte i vecchi articoli del CPT e la pubblicazione può passare per lo stato «In attesa di revisione» (pending). Dalla 1.1.1 la testata si organizza in redazioni gerarchiche: una tassonomia WordPress nativa (nexus_redazione) con redazioni madri, sub-redazioni annidate e agenti assegnati ai rami (es. Redazione Sport → Calcio, Basket e F1), pagina admin dedicata Redazioni, archivi pubblici /redazione/{slug}/ col subtree incluso, colonna e filtro nativi nella lista Articoli, shortcode e API pubblica con attributo redazione e capabilities per ramo per gli editori — tutto WP nativo, zero tabelle nuove. Dalla 1.1.2 la redazione parla tutte le lingue con il multilingua nativo: le traduzioni AI diventano post WordPress veri e collegati tra loro (permalink, revisioni e SEO propri) con driver automatico Polylang / WPML / collegamento interno Nexus (post meta, zero tabelle nuove), switcher lingua in frontend, hreflang e og:locale automatici, pubblicazione automatica delle traduzioni dopo il publish e compatibilità totale con Polylang e WPML tramite le loro API ufficiali.
Il plugin è il porting WordPress (PHP puro + vanilla JS) dell'app Next.js originale Nexus News AI.
Indice
- Caratteristiche
- Mapping Next.js → WordPress
- Architettura dei file
- I 7 agenti giornalisti
- La pipeline editoriale
- Shortcode
- REST API
nexus/v1 - Impostazioni
- Cron automatico
- Pubblicazione multi-piattaforma
- Redazione intelligente (v1.0.3)
- Scala & Pro (v1.0.4)
- Strumenti, API pubblica, Multisite, Admin bilingue (v1.0.5)
- UI chiara & curata (v1.0.6)
- Impostazioni & Agenti Pro (v1.0.7)
- Tutto nativo (v1.1.0)
- Redazioni gerarchiche (v1.1.1)
- Multilingua nativo (v1.1.2)
- Installazione
- FAQ tecniche
- Licenza e crediti
- Changelog
Caratteristiche
- 7 agenti giornalisti AI con nome, emoji, categoria e personalità distinti (seed automatici all'attivazione).
- Pipeline editoriale completa: raccolta RSS → valutazione → riscrittura AI → approvazione → pubblicazione multi-piattaforma.
- Modalità semi-autonoma: gli articoli entrano in coda di approvazione e vengono pubblicati solo dopo il via libera umano.
- Modalità completamente autonoma: auto-approvazione basata sul punteggio di qualità (
auto_approve_score), la pipeline gira da sola via WP-Cron. - Admin panel completo: dashboard statistiche, gestione agenti, coda di approvazione, feed attività, Nexus Wire, impostazioni.
- Magazine frontend: hero section, barre categoria, griglia articoli, modal di lettura, reazioni emoji e contatore visualizzazioni.
- Shortcode:
[nexus_magazine],[nexus_articles],[nexus_wire],[nexus_subscribe]. - Cron automatico con intervallo configurabile e limite giornaliero di articoli.
- REST API
nexus/v1: dati e azioni della redazione accessibili programmaticamente. - Nexus Wire: pipeline multi-agente (raccolta candidati → selezione fonti → dossier del ricercatore → bozza del redattore → revisioni a 2 voci → editor finale) con storia delle run e bacheca commenti.
- Pubblicazione come post WordPress reali (v1.0.1): gli articoli approvati diventano POST veri del CPT
nexus_article, con categorie e tag nativi di WordPress e permalink/nexus/{slug}/; in fallback resta il front-end Nexus legacy (/?nexus_article={id}). - Immagini in evidenza AI (v1.0.1): featured image generata con l'AI (modello e dimensione configurabili) con fallback sull'immagine dell'articolo e infine su un placeholder locale; la pubblicazione non si blocca mai per un'immagine.
- SEO automatico (v1.0.1): meta title/description generate con l'AI, meta description + Open Graph + JSON-LD
NewsArticlesul single, compatibilità con Yoast SEO e RankMath. - Pubblicazione social reale (v1.0.2): invio vero degli articoli su Telegram (Bot API,
sendMessage/sendPhoto), Discord (webhook con embed), X/Twitter (/2/tweetscon firma OAuth 1.0a in PHP puro) e LinkedIn (UGC post via Bearer token), con le credenziali nei settings; i canali non configurati producono un logskippedonesto e Facebook/Instagram restano simulati in modo dichiarato. - Newsletter con double opt-in (v1.0.2): shortcode
[nexus_subscribe]per l'iscrizione via REST con conferma via email (link/?nexus_confirm={token}) e disiscrizione via token, tabellawp_nexus_subscriberse digest settimanale AI inviato conwp_mailai destinatari fissi e agli iscritti confermati. - Ping di indicizzazione automatici (v1.0.2): alla pubblicazione di un post
nexus_articlepartono IndexNow (Bing e altri, chiave auto-generata con key file servito dal plugin) e WebSub/PubSubHubbub sul feed, fuori banda via WP-Cron senza mai bloccare la pubblicazione. - Modello AI per-agente + modello economico (v1.0.3): ogni agente può usare il proprio modello (
ai_model, vuoto = modello globale) mentre raccolta (screening), valutazione e fact-check girano sul modello economicoai_model_cheapper contenere i costi. - Tracking uso AI (v1.0.3): ogni chiamata AI logga in
wp_nexus_usage_logsi token (prompt/completion/total) e il costo stimato in USD; la dashboard mostra «Uso AI» del mese e il budget mensile (monthly_budget_usd) con azionestop(salta le fasi AI) owarn(avviso e prosegui). - Fact-check automatico (v1.0.3): dopo la riscrittura l'articolo viene verificato contro la fonte con punteggio 0-100 e citazioni claim→fonte; sotto la soglia
factcheck_min_scoretorna in bozza, sopra pubblica con il blocco «Fonti verificate» nel post WordPress. - Anti-duplicato via hash del titolo (v1.0.3): in fase di raccolta ogni candidato passa per l'hash md5 del titolo normalizzato (
wp_nexus_articles.content_hash); i duplicati vengono saltati con log onesto. - Traduzioni AI multi-lingua (v1.0.3): traduzione di titolo, riassunto e contenuto via REST (
POST /articles/{id}/translate) nelle lingue configurate (translation_langs, defaulten,es,fr) e lettura delle traduzioni viaGET /articles/{id}/translations; upsert inwp_nexus_translations. - Coda lavori stile Action Scheduler (v1.0.4): le azioni pesanti (pipeline, traduzioni, tick del cron) vengono accodate in
wp_nexus_jobscon claim atomico, priorità e retry automatico con backoff esponenziale (60s × 2^n, cap 1 ora), requeue dei lavori bloccati oltre 30 minuti e pulizia dei lavori finiti da più di 7 giorni; runner WP-Cron ogni 60 secondi (solo conenable_queue=1) e pagina admin «Coda Lavori» con stat, filtri, riprova/annulla, «Processa ora» e auto-refresh. - WP-CLI (v1.0.4): comando
wp nexusper pilotare la redazione da terminale e da cron di sistema:run --all/--agent,collect,evaluate,rewrite,publish,approve/reject,translate,agents,articles,stats,queue stats|process|retry|cancel|cleanup,settings get/set. - Blocchi Gutenberg (v1.0.4): blocchi dinamici server-side
nexus/latest-articles(numero articoli 1-24, categoria, colonne 1-4, mostra immagini) enexus/subscribe-form(titolo personalizzabile) con preview nell'editor, senza build step; alternativa a[nexus_articles]e[nexus_subscribe]. - Analytics (v1.0.4): pagina Analytics con serie giornaliera (7-90 giorni) di articoli creati/pubblicati, chiamate AI e costo stimato del periodo, breakdown per piattaforma e per agente (con qualità media), top 10 articoli per viste e iscritti newsletter.
- Strumenti (v1.0.5): pagina nel menu con informazioni di sistema (versioni, 9 tabelle con righe, eventi WP-Cron con prossima esecuzione, stat coda lavori), esporta configurazione JSON (avviso: contiene chiavi API e token) e importa configurazione (match agenti per categoria, sovrascrive impostazioni e agenti).
- API pubblica (v1.0.5): namespace REST
nexus-public/v1con articoli pubblicati, agenti e statistiche; autenticazione headerX-Api-Key(o?api_key=), rate limit 120 richieste/minuto (HTTP 429) e CORS aperto. - Multisite (v1.0.5): installazione automatica delle tabelle sui nuovi siti della rete (hook
wp_initialize_site) e comandiwp nexus multisite status|install [--sites=1,2]; ogni sito ha tabelle e impostazioni proprie. - Admin bilingue (v1.0.5, sperimentale): lingua dell'interfaccia admin (Automatica/Italiano/English) con traduzione delle etichette principali lato PHP (viste) e lato JS (contenuti dinamici).
- UI chiara & curata (v1.0.6): pannello admin con tema chiaro di default e tema scuro opzionale (
admin_themein Impostazioni → Interfaccia); frontend pubblico stilizzato dal foglio light editorialepublic/css/nexus-public.css(caricato solo dove shortcode/blocchi Nexus renderizzano): card articoli con griglia responsive 1/2/3 colonne, form iscrizione curato, tipografia di lettura sulla pagina articolo, empty state e dettagli curati. - Impostazioni & Agenti Pro (v1.0.7): Impostazioni riorganizzate in 4 gruppi (Pipeline editoriale, Intelligenza artificiale, Pubblicazione & distribuzione, Sito & sistema) con sezioni ad accordion e stato aperto/chiuso ricordato nel browser; modelli AI auto-load dal provider (endpoint compatibile OpenAI
{base_url}/models) con lista suggerita nei campi modello (anche nell'editor agenti) e cache 12 ore; editor agenti completo (creare nuovi agenti, modificare tutti i campi, clonare — il clone nasce in pausa con categoria resa univoca); diagnostica AI in Strumenti (la chiave non viene mai mostrata) e fix overflow mobile (griglia agenti fluida, tabelle scrollabili, toolbar a capo, input full-width). - Tutto nativo (v1.1.0): gli articoli nuovi pubblicano come post nativi (
post, in home/archivio/feed del tema) invece che sul CPTnexus_article; ogni agente diventa un utente bot con ruolonexus_ai_journalist(sola capabilityread, niente wp-admin) e firma i post con byline e pagina autore reali; la categoria dell'agente è una categoria WP reale (mappata suwp_terms) e gli articoli ricevono tag automatici deterministici (3-5 tag da titolo e riassunto, nessuna chiamata AI); migrazione 1-click in Strumenti con barra di progresso batched per convertire i vecchi articoli CPT; nuovo statopending(«In attesa di revisione») perpost_status; nuove rotte REST adminGET /wp/categories,POST /native/migrate,GET /native/migrate/status,POST /native/migrate/reset. Le tabelle Nexus restano per l'operativo (coda, costi, log, iscritti). - Redazioni gerarchiche (v1.1.1): ogni testata può avere più redazioni contemporanee con sub-redazioni annidate come le categorie WP (es. Redazione Sport → Calcio, Basket, F1) e gli agenti assegnati ai termini (term meta
_nexus_agents); tassonomia nativanexus_redazionecon archivi pubblici/redazione/{slug}/che includono il subtree, pagina admin Redazioni con albero gerarchico, colonna e filtro nativi nella lista Articoli, shortcode e API pubblica con attributoredazione, capabilities per ramo (profilo utente con guardie: solomanage_optionsassegna la redazione, l'editore scoped vede solo il suo ramo), migrazione che assegna le redazioni dal suo agente, REST nativawp/v2/redazioni+ 4 rotte admin. Zero tabelle nuove. - Multilingua nativo (v1.1.2): le traduzioni AI diventano post WordPress collegati (non più solo righe nella tabella storico
wp_nexus_translations): permalink, revisioni, SEO e tema propri per ogni lingua. Driver automatico con Polylang o WPML attivi (le associazioni tra lingue usano le loro API ufficiali) oppure collegamento interno Nexus via post meta (_nexus_lang,_nexus_trid,_nexus_source_post_id) — zero tabelle nuove; nuovo shortcode[nexus_lang_switcher], attributolangper[nexus_magazine]/[nexus_articles]e parametrolangsull'API pubblica,hreflangeog:localeautomatici sul single, pubblicazione automatica delle traduzioni come post dopo il publish (eventi WP-Cron sfalsati, settingenable_autotranslate_posts), rotte REST admin/multilange card dashboard «Multilingua». - Zero dipendenze da compilare: nessun build step, nessun framework, solo PHP + JS/CSS vanilla.
- i18n: text domain
nexus-news-ai, file.potinlanguages/. - Disinstallazione pulita:
uninstall.phprimuove tabelle (inclusewp_nexus_subscribers,wp_nexus_usage_logs,wp_nexus_translations), opzioni, transients, eventi cron (nexus_weekly_digest,nexus_ping_article) e i post WordPress realinexus_articlecon i loro meta_nexus_*.
Mapping Next.js → WordPress
| Componente originale (Next.js) | Equivalente WordPress (plugin) |
|---|---|
Supabase (PostgreSQL): tabelle agents, articles, publish_logs, approval_logs, activity_logs, settings |
Tabelle MySQL custom wp_nexus_agents, wp_nexus_articles, wp_nexus_publish_logs, wp_nexus_approval_logs, wp_nexus_activity_logs + option nexus_settings (schema via dbDelta in Nexus_DB) |
API Routes /api/* (App Router) |
REST API nexus/v1 registrate in class-nexus-rest.php |
Admin panel React (components/admin/*) |
Admin WP nativo (menu Nexus News) + viste PHP in admin/views/ + vanilla JS |
Magazine React (components/magazine/*) |
Output shortcode PHP + vanilla JS/CSS in public/ |
Cron route /api/cron (scheduler esterni) |
WP-Cron (class-nexus-cron.php): evento nexus_cron_tick su schedule custom nexus_interval, auto-sincronizzato con le impostazioni |
Zustand store (store.ts) |
Nessuno: lo stato vive nel DB; le pagine admin interrogano la REST API con fetch |
Motore AI ai-engine.ts + openrouter.ts |
class-nexus-ai-engine.php (client OpenRouter-compatible, prompt editoriali IT, JSON repair) |
RSS rss.ts |
class-nexus-rss.php (DOMDocument, cache via transients nexus_rss_*) |
Pubblicazione publish API |
class-nexus-publisher.php (post WP reali + social reali Telegram/Discord/X/LinkedIn o simulati, log onesti) |
| (nessun equivalente) | Newsletter [nexus_subscribe] con double opt-in e digest settimanale AI (class-nexus-newsletter.php) e ping IndexNow/WebSub (class-nexus-ping.php) — v1.0.2 |
| (nessun equivalente) | Scala & Pro — coda lavori wp_nexus_jobs (class-nexus-queue.php), WP-CLI wp nexus (class-nexus-cli.php), blocchi Gutenberg (class-nexus-blocks.php + assets/js/blocks.js) e Analytics (class-nexus-analytics.php) — v1.0.4 |
Pipeline collect-all.ts / processCategoryForAgent |
class-nexus-pipeline.php (le 5 fasi, eseguibili anche singolarmente) |
| Framer Motion / Tailwind / shadcn/ui | CSS vanilla (public/css/) con animazioni native |
Architettura dei file
nexus-news-ai/
├── nexus-news-ai.php # Bootstrap: header plugin, costanti, require, hook attivazione/disattivazione
├── uninstall.php # Disinstallazione: drop tabelle wp_nexus_* (incluse subscribers, usage_logs, translations), opzioni, transients, eventi cron, post nexus_article + meta
├── readme.txt # Readme formato WordPress (repository.org)
├── README.md # Questo file
├── LICENSE # Licenza MIT
│
├── includes/ # Classi core (nessun output, solo logica)
│ ├── class-nexus-db.php # Layer dati: schema dbDelta, CRUD, settings, seed agenti, stats, drop_tables()
│ ├── class-nexus-utils.php # Utility condivise (sanitizzazione, slug, formattazioni)
│ ├── class-nexus-rss.php # Raccolta RSS: fetch feed, parse, cache transients nexus_rss_*
│ ├── class-nexus-ai-engine.php # Client AI OpenRouter-compatible: chat/completions, prompt editoriali IT, JSON repair, tracking uso AI (token/costo stimato) e budget mensile, fact-check, estimate_cost (v1.0.3)
│ ├── class-nexus-pipeline.php # Le 5 fasi editoriali: collect → evaluate → rewrite → approve → publish
│ ├── class-nexus-publisher.php # Pubblicazione: post WordPress (post NATIVI dalla v1.1.0, CPT nexus_article nelle versioni precedenti) + fallback legacy + social reali/simulati, log in publish_logs, assegnazione termini redazione dell'agente (v1.1.1), auto-translate post-publish con eventi WP-Cron sfalsati (v1.1.2)
│ ├── class-nexus-cpt.php # v1.0.1 — CPT nexus_article: registrazione post type, tassonomie native (categorie/tag), rewrite /nexus/, template single, meta box «Nexus» (dalla v1.1.0 resta per i permalink legacy)
│ ├── class-nexus-native.php # v1.1.0 — Nexus_Native: utenti bot degli agenti (ruolo nexus_ai_journalist), categorie native (term_id), tag deterministici, migrazione 1-click CPT → post nativi (dalla v1.1.1 assegna anche i termini redazione dell'agente), letture dual-mode
│ ├── class-nexus-redazioni.php # v1.1.1 — Nexus_Redazioni: tassonomia gerarchica nexus_redazione (parent/child come le categorie), term meta _nexus_agents, albero/agenti/contatori per ramo, filtro articoli in lista admin
│ ├── class-nexus-caps.php # v1.1.1 — Nexus_Caps: campo profilo «Redazione assegnata» e restrizioni per ramo (map_meta_cap + parse_query, guardie manage_options)
│ ├── class-nexus-multilang.php # v1.1.2 — Nexus_Multilang: adattatore multilingua (driver Polylang/WPML/nexus interno con meta _nexus_lang, _nexus_trid, _nexus_source_post_id), gruppi di traduzione, statistiche per lingua
│ ├── class-nexus-image.php # v1.0.1 — Immagini in evidenza: generazione AI con fallback, sideload in media library, set_post_thumbnail
│ ├── class-nexus-seo.php # v1.0.1 — SEO: meta AI, Open Graph, JSON-LD NewsArticle, compatibilità Yoast/RankMath, title tag; hreflang e og:locale per lingua sul single (v1.1.2)
│ ├── class-nexus-social-telegram.php # v1.0.2 — Telegram: Bot API sendMessage/sendPhoto con credenziali dai settings
│ ├── class-nexus-social-discord.php # v1.0.2 — Discord: webhook con embed e thumbnail
│ ├── class-nexus-social-x.php # v1.0.2 — X/Twitter: POST /2/tweets con firma OAuth 1.0a nativa (nessuna libreria)
│ ├── class-nexus-social-linkedin.php # v1.0.2 — LinkedIn: ugcPosts via Bearer token
│ ├── class-nexus-newsletter.php # v1.0.2 — Newsletter: shortcode [nexus_subscribe], double opt-in, digest settimanale AI via wp_mail
│ ├── class-nexus-ping.php # v1.0.2 — Ping: IndexNow (chiave + key file) e WebSub alla pubblicazione
│ ├── class-nexus-translate.php # v1.0.3 — Traduzioni AI: rotte REST translate/translations, prompt multi-lingua, upsert in wp_nexus_translations; dalla v1.1.2 pubblica le traduzioni come post nativi collegati (translate_to_post, native_post_for_article)
│ ├── class-nexus-queue.php # v1.0.4 — Coda lavori stile Action Scheduler: dispatch, run_batch (claim atomico, retry con backoff), retry, cancel, requeue_stale, runner WP-Cron nexus_queue_runner
│ ├── class-nexus-cli.php # v1.0.4 — WP-CLI: comando wp nexus (run, collect, evaluate, rewrite, publish, approve, reject, translate, agents, articles, stats, queue, settings)
│ ├── class-nexus-blocks.php # v1.0.4 — Blocchi Gutenberg server-side: nexus/latest-articles e nexus/subscribe-form
│ ├── class-nexus-analytics.php # v1.0.4 — Analytics: overview() con serie giornaliera, costi AI, per piattaforma, per agente, top articoli, iscritti
│ ├── class-nexus-i18n.php # v1.0.5 — Admin bilingue IT/EN: Nexus_I18n (current_lang, translate_html sulle viste, enqueue di i18n.js)
│ ├── class-nexus-i18n-dict.php # v1.0.5 — Dizionario i18n base: nexus_i18n_default_dict() con le voci IT=>EN dell'admin
│ ├── class-nexus-i18n-dict-extra.php # v1.0.5 — Dizionario i18n esteso: nexus_i18n_extra_dict() con voci aggiuntive (caricato da Nexus_I18n)
│ ├── class-nexus-public-api.php # v1.0.5 — API pubblica nexus-public/v1: articoli/agenti/stats con X-Api-Key, rate limit 120/min e CORS, parametro redazione (v1.1.1), parametro lang e campo lingua negli item (v1.1.2)
│ ├── class-nexus-multisite.php # v1.0.5 — Multisite: installazione tabelle sui nuovi siti (wp_initialize_site), status(), install_all()
│ ├── class-nexus-cron.php # WP-Cron: scheduling nexus_cron_tick, esecuzione fasi automatiche
│ ├── class-nexus-rest.php # REST API nexus/v1: route, permessi, schema args
│ └── index.php # Guardia "Silence is golden"
│
├── admin/ # Back-end WordPress
│ ├── class-nexus-admin.php # Menu admin, enqueue assets, handler, gateway alle viste
│ ├── css/ # nexus-admin.css: stili delle pagine admin (tema chiaro di default, dark opzionale — v1.0.6)
│ ├── views/ # Template HTML delle pagine admin
│ │ ├── dashboard.php # Dashboard statistiche (contatori «Contenuti nativi» — v1.1.0; card «Redazioni» — v1.1.1; card «Multilingua» con articoli per lingua — v1.1.2)
│ │ ├── agents.php # Gestione agenti (+ colonna «Redazioni» con chip agenti assegnati — v1.1.1)
│ │ ├── redazioni.php # v1.1.1 — Redazioni: form redazione madre/sub (nome, slug, madre, agenti) + albero gerarchico con contatori e archivio nativo
│ │ ├── queue.php # Coda di approvazione
│ │ ├── jobs.php # v1.0.4 — Coda Lavori: stat, filtri stato, riprova/annulla, «Processa ora», pulizia, auto-refresh 15s
│ │ ├── activity.php # Feed attività
│ │ ├── wire.php # Nexus Wire (redazione collettiva)
│ │ ├── analytics.php # v1.0.4 — Analytics: serie giornaliera, costi AI, per piattaforma/agente, top articoli, iscritti
│ │ ├── tools.php # v1.0.5 — Strumenti: informazioni di sistema, esporta/importa configurazione, API pubblica (chiave), diagnostica AI (v1.0.7), migrazione contenuti nativi (v1.1.0)
│ │ └── settings.php # Impostazioni: 4 gruppi con sezioni ad accordion (v1.0.7), opzione post_status «In attesa di revisione» (v1.1.0), sezione «Multilingua — post tradotti nativi» con driver, lingue del sito e auto-translate (v1.1.2)
│ └── index.php
│
├── public/ # Front-end magazine
│ ├── class-nexus-shortcodes.php # [nexus_magazine], [nexus_articles], [nexus_wire] + render + enqueue, attributo redazione (v1.1.1), attributo lang e [nexus_lang_switcher] (v1.1.2)
│ ├── css/ # nexus-public.css: stili light editoriali del frontend (token --nxp-*, classi nxa-*/nexus-* — v1.0.6)
│ ├── js/ # nexus-public.js: interazioni (modal, reazioni, categorie) via REST + nonce wp_rest
│ └── index.php
│
├── assets/ # Asset condivisi admin
│ ├── js/ # admin.js (interfaccia admin: riga «Pubblica come post» e chips delle traduzioni per lingua nell'articolo — v1.1.2) + blocks.js (v1.0.4: registrazione blocchi Gutenberg nell'editor) + i18n.js (v1.0.5: traduzione IT→EN dei contenuti dinamici admin) — vanilla JS, consuma le REST route nexus/v1
│ └── index.php
│
├── templates/ # Template front-end per i post WordPress reali (v1.0.1)
│ └── single-nexus_article.php # Single del CPT nexus_article: header/footer del tema, byline agente, contenuto, fonti, reazioni Nexus
│
└── languages/ # Internazionalizzazione
├── nexus-news-ai.pot # Template di traduzione (gettext)
└── index.php
Ogni directory contiene un index.php di silenzio per impedire il directory listing.
I 7 agenti giornalisti
Gli agenti vengono inseriti automaticamente alla prima attivazione (solo se la tabella è vuota) e sono modificabili dall'admin panel: dalla 1.0.7 si gestiscono dall'editor della pagina Agenti — si creano nuovi agenti, si modificano tutti i campi e si clonano quelli esistenti (il clone nasce in pausa). Dettagli nella sezione Impostazioni & Agenti Pro. Dalla 1.1.0 ogni agente ha anche un utente bot WordPress con ruolo nexus_ai_journalist che firma i suoi post: dettagli nella sezione Tutto nativo.
| Agente | Emoji | Categoria | Personalità |
|---|---|---|---|
| TechBot | 🤖 | Tecnologia | Analitico e orientato all'impatto pratico per lettori tech-savvy |
| PolicyWatch | 🏛️ | Politica | Equilibrato e oggettivo, con contesto storico e geopolitico |
| MarketPulse | 📈 | Economia | Rigoroso ma accessibile, con dati concreti e implicazioni per investitori |
| SciExplorer | 🔬 | Scienza | Divulgativo ma preciso, spiegazioni chiare per un pubblico colto |
| SportArena | ⚽ | Sport | Emozionante e narrativo, con statistiche e analisi tattiche |
| CultureHub | 🎭 | Cultura | Elegante e riflessivo, con riferimenti storici e artistici |
| HealthDesk | 🩺 | Salute | Rassicurante e basato su evidenze scientifiche, con consigli pratici |
La pipeline editoriale
La pipeline è orchestrata da class-nexus-pipeline.php (contratto: collect, evaluate, rewrite, approve, reject, publish, run_full, cron_tick, wire_run, wire_runs) e può essere eseguita per intero ("Esegui pipeline completa" nell'admin o POST /pipeline/run), a fasi singole, o automaticamente via cron. Tutte le fasi generative richiedono la chiave AI: senza chiave ogni fase registra nei log attività l'errore «Chiave API AI non configurata».
- Raccolta (collect) —
Nexus_RSSscarica gli item dai feed RSS della categoria dell'agente (se non ci sono candidati, percorso evergreen); una chiamata AI (collect_prompt) seleziona i massimo 2 candidati migliori (score ≥ 50), salvati come articoli in statodraftcon titolo, fonte, URL e riassunto. Richiede il modello AI configurato. - Valutazione (evaluate) — una chiamata AI (
evaluate_prompt) assegna ilquality_score0-100, salvato sull'articolo; l'esito finisce nel feedactivity_logs. - Riscrittura AI (rewrite) — una chiamata AI (
rewrite_prompt) produce titolo, sottotitolo, contenuto e riassunto definitivi in stile editoriale (categoria + personalità dell'agente): l'articolo passa apending_approvalconread_timecalcolato. - Approvazione (approve) —
- Modalità semi-autonoma (default): l'articolo passa a
pending_approvale compare nella coda di approvazione; il revisore umano può approvare o rifiutare con nota (tabellawp_nexus_approval_logs). - Modalità completamente autonoma: gli articoli con
quality_score >= auto_approve_scorevengono auto-approvati, gli altri restano in coda come rete di sicurezza.
- Modalità semi-autonoma (default): l'articolo passa a
- Pubblicazione multi-piattaforma — l'articolo approvato viene inviato alle piattaforme abilitate in
social_platforms: per blog la pubblicazione è reale (dalla v1.0.1 l'articolo diventa un post WordPress; dalla v1.1.0 è un post nativopostcon autore bot, categoria nativa e tag deterministici, mentre i vecchi articoli restano serviti come CPTnexus_articlecon permalink/nexus/{slug}/; in fallback resta nel database Nexus con URL legacy/?nexus_article={id}registrato nei log), i canali Telegram, Discord, X e LinkedIn sono reali dalla v1.0.2 quando abilitati e configurati nei settings (altrimenti logskippedcon nota onesta), gli altri canali social restano simulati in modo dichiarato (post_id e URL demo) e ogni invio genera una riga inwp_nexus_publish_logs.
Stati dell'articolo: draft → pending_approval → approved → published (o rejected).
Shortcode
[nexus_magazine]
Il magazine completo: hero con articolo in evidenza, barre categorie, griglia articoli, modal di dettaglio con reazioni emoji.
[nexus_magazine]
[nexus_articles]
Lista o griglia di articoli filtrabili. Attributi:
| Attributo | Default | Valori |
|---|---|---|
category |
(tutte) | Tecnologia, Politica, Economia, Scienza, Sport, Cultura, Salute |
limit |
9 |
numero massimo di articoli (1-24) |
layout |
grid |
grid (card) o list (elenco compatto) |
lang |
(tutte) | codice lingua (es. en): con il driver multilingua interno filtra gli articoli per lingua (v1.1.2, dettagli nella sezione Multilingua nativo); con Polylang/WPML il contenuto è già filtrato per lingua corrente |
[nexus_articles category="Tecnologia" limit="6" layout="list"]
[nexus_articles category="Sport" limit="3"]
[nexus_articles limit="12" layout="grid"]
[nexus_wire]
La bacheca del Nexus Wire: storico delle run della redazione collettiva (argomento, agenti coinvolti, fonti usate, commenti di revisione) e articolo prodotto dall'ultima sessione. Attributo opzionale limit (default 10, max 20).
[nexus_wire]
[nexus_subscribe]
Il form di iscrizione alla newsletter (v1.0.2): campo email + bottone, invio via REST (POST /nexus/v1/subscribe, rate limit 1 richiesta al minuto per IP) e double opt-in — dopo l'iscrizione parte un'email con il link di conferma (/?nexus_confirm={token}); con il link di disiscrizione (/?nexus_unsub={token}) l'iscritto si rimuove da solo. I messaggi sono in italiano e traducibili via .pot.
[nexus_subscribe]
[nexus_lang_switcher]
Lo switcher delle lingue del sito (v1.1.2): lista delle lingue attive con nome italiano; su una pagina singola ogni voce punta al permalink della traduzione, sulle altre pagine a home_url('/') con query var ?lang={code}. La lingua corrente è evidenziata (nexus-lang-current); le lingue senza traduzione appaiono non cliccabili con la nota onesta «Traduzione non disponibile». Dettagli nella sezione Multilingua nativo.
[nexus_lang_switcher]
Nota (v1.0.1): gli articoli pubblicati come post WordPress reali non passano dagli shortcode: ogni post del CPT
nexus_articleè servito dal template dedicato del plugin (templates/single-nexus_article.php), che usa header e footer del tema attivo e mostra byline dell'agente, contenuto, fonti e reazioni Nexus, con permalink/nexus/{slug}/. Lo shortcode[nexus_magazine]continua invece a leggere il database Nexus (articoli legacy e magazine).
Nota (v1.0.4): nell'editor a blocchi puoi usare i blocchi Gutenberg
nexus/latest-articlesenexus/subscribe-form, alternativi a[nexus_articles]e[nexus_subscribe]: vedi la sezione Scala & Pro.
REST API nexus/v1
Namespace REST: /wp-json/nexus/v1/ (registrate in class-nexus-rest.php).
- Route admin: richiedono un utente con capability
manage_optionse nonce WordPress (X-WP-Noncecon cookie di sessione, o Application Password). - Route pubbliche: aperte in lettura/scrittura limitata (usate dal frontend magazine, che invia comunque il nonce
wp_rest), espongono solo dati pubblicabili.
Route admin (manage_options)
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /agents |
Lista degli agenti (nome, emoji, categoria, personalità, stato, last_run) |
| POST | /agents/{id}/status |
Cambia stato agente: body { "status": "active\|paused\|error" } |
| POST | /agents/{id}/model |
Imposta il modello AI dedicato dell'agente (v1.0.3): body { "model": "openai/gpt-4o-mini" } (stringa vuota = torna al modello globale) |
| POST | /agents |
Crea un nuovo agente (v1.0.7): body { "name", "category", "avatar", "status", "ai_model", "description", "personality" } (nome e categoria obbligatori, categoria unica per agente) |
| PUT | /agents/{id}/update |
Aggiorna un agente (v1.0.7): stessi campi, tutti opzionali (vengono aggiornati solo quelli presenti nel body); la categoria deve restare unica |
| POST | /agents/{id}/clone |
Clona un agente (v1.0.7): nome «{originale} (copia)», categoria {categoria}-copia (poi -copia-2, -copia-3…), il clone nasce in pausa |
| GET | /ai/models |
Modelli disponibili dal provider AI (v1.0.7): chiama {ai_base_url}/models con la chiave salvata, cache 12 ore per base URL → { models, count, cached } |
| GET | /articles |
Lista articoli; filtri status, category, agent_id, search, page, per_page |
| GET | /articles/{id} |
Dettaglio articolo (inclusi log pubblicazione) |
| DELETE | /articles/{id} |
Elimina l'articolo e i log correlati |
| POST | /articles/{id}/approve |
Approva l'articolo: body { "note": "…" } opzionale |
| POST | /articles/{id}/reject |
Rifiuta l'articolo: body { "note": "…" } |
| POST | /articles/{id}/translate |
Traduce l'articolo con l'AI (v1.0.3, registrata da Nexus_Translate): body { "lang": "en" } (una delle lingue in translation_langs); ritorna titolo e riassunto tradotti |
| POST | /pipeline/collect |
Esegue la raccolta RSS: body { "agent_id": 0 } (0 = tutti gli agenti attivi) |
| POST | /pipeline/run |
Esegue la pipeline completa per agente o per tutti |
| POST | /pipeline/publish |
Pubblica un singolo articolo approvato {article_id} |
| GET | /settings |
Impostazioni correnti |
| PUT | /settings |
Aggiorna le impostazioni (merge parziale sui campi in whitelist) |
| GET | /activity |
Feed attività; args limit, agent_id |
| GET | /stats |
Statistiche dashboard (totali, stati, views, agenti attivi, attività 24h) |
| POST | /wire/run |
Avvia una run del Nexus Wire: body { "topic": "…" } (max 200 caratteri) |
| GET | /wire/runs |
Storico completo delle run del Wire; arg limit |
| GET | /jobs |
Lavori della coda (v1.0.4): args status, hook, page, per_page (default 50, max 200) → { items, total, pages, stats } |
| GET | /jobs/stats |
Statistiche della coda: { pending, running, complete, failed, cancelled, total } |
| POST | /jobs/process |
Processa subito un batch della coda (Nexus_Queue::run_batch()) → { processed, failed } |
| POST | /jobs/cleanup |
Elimina i lavori finiti più vecchi di days giorni (default 7, 1-90) → { deleted } |
| POST | /jobs/{id}/retry |
Riprova un lavoro: solo da failed/cancelled/complete → pending |
| POST | /jobs/{id}/cancel |
Annulla un lavoro: solo se pending → cancelled |
| GET | /analytics |
Analytics della redazione (v1.0.4); arg days (default 30, cap 90) |
| GET | /export |
Esporta la configurazione (v1.0.5): { version, exported_at, site_url, settings, agents }. ATTENZIONE: il file contiene chiavi API e token |
| POST | /import |
Importa una configurazione (v1.0.5): body JSON { "settings": {…}, "agents": […] }, agenti abbinati per category (aggiornati) o creati se mancanti → { settings_updated, agents_updated, agents_inserted, errors } |
| POST | /tools/api-key |
Genera una nuova chiave API pubblica (v1.0.5): la salva in public_api_key invalidando la precedente → { "api_key": "…" } |
| GET | /wp/categories |
Categorie WordPress native (v1.1.0): { "categories": [ { "id", "name", "slug", "count" } ] } ordinate per nome; alimenta i suggerimenti categoria dell'editor agenti |
| POST | /native/migrate |
Migrazione contenuti nativi (v1.1.0): converte fino a limit post CPT nexus_article in post nativi — body { "limit": 20 } (1-100, default 20) → stato completo { remaining, done, total, agents, finished, errors } |
| GET | /native/migrate/status |
Stato corrente della migrazione (v1.1.0): stesso shape, senza eseguire batch |
| POST | /native/migrate/reset |
Ripristina lo stato della migrazione (v1.1.0, uso amministrativo) e ritorna lo stato corrente |
| GET | /redazioni |
Redazioni gerarchiche (v1.1.1): lista piatta ordinata ad albero (madri prima, per nome dentro ogni livello) → { "redazioni": [ { "id", "name", "slug", "parent", "depth", "agents": [ { "id", "name", "avatar" } ], "count", "count_subtree" } ] }, dove count è il numero di articoli direttamente assegnati al termine e count_subtree gli articoli del ramo completo |
| POST | /redazioni |
Crea una redazione (v1.1.1): body { "name", "parent", "agent_ids": [] } (parent = term ID della madre, 0 = redazione di primo livello) → { "term_id", "agents" } o errore onesto |
| POST | /redazioni/{id} |
Aggiorna una redazione (v1.1.1): body parziale { "name"?, "slug"?, "parent"?, "agent_ids"? } (solo i campi presenti; parent non può essere se stesso né un proprio discendente) → { "ok": true, "term": { "id", "name", "slug", "parent", "agents" } } |
| DELETE | /redazioni/{id} |
Elimina una redazione (v1.1.1): wp_delete_term e WordPress riparenta da solo le sub-redazioni alla madre → { "ok": true, "message": "…" } |
| GET | /multilang/info |
Driver e lingue del sito (v1.1.2): `{ "driver": "nexus|polylang|wpml", "default": "it", "current": "it", "langs": |
This README is longer than the copy stored here. Read the rest on GitHub →