Moduli, dati dinamici, componenti, bindings e media
Moduli con campi e azioni, componenti PHP del sito, bindings ai dati di WordPress e salvataggio delle immagini.
In questa pagina
01Panoramica
Il blocco nc/native-form descrive un modulo in JSON: campi, passaggi e azioni. Il compilatore salva la configurazione normalizzata nello slot nc/native-form del documento. A ogni richiesta lo slot scrive nonce, post di contesto ed esito. Il visitatore invia il modulo all'endpoint REST nucleo/v1/form/<doc>/<node>. L'endpoint legge la configurazione dal documento pubblicato, valida i valori ed esegue le azioni in ordine.
I componenti sono classi PHP scritte in un plugin del sito. Registrano sorgenti dati per nc/collection e azioni per nc/native-form con l'hook nucleo/register_components.
I bindings collegano una proprietà di un nodo (content.<nome> o settings.<nome>) a un campo di WordPress. Il compilatore scrive subito i valori fissi della pagina. Gli altri diventano token dello slot nc/bind, risolti a ogni richiesta.
La parte media salva immagini nella libreria con controllo del tipo reale e genera copie AVIF e WebP se il sito le accende.
Tutte le funzioni di questo capitolo sono gratuite.
02Modulo nativo: definizione
Configurazione del modulo
Cosa fa: definisce un modulo con campi, passaggi, azioni, testi e opzioni. La configurazione viene normalizzata e le voci non valide si scartano in silenzio.
Come si usa: nodo nc/native-form nel documento. Esempio minimo:
{ "id": "m1", "type": "nc/native-form",
"settings": {
"fields": [ { "name": "email", "type": "email", "label": "Email", "required": true } ],
"actions": [ { "type": "save" }, { "type": "email", "to": "admin", "subject": "Nuovo contatto", "body": "{fields}" } ]
},
"content": { "submitLabel": "Invia" } }Parametri (settings):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
fields | array | oggetti campo (vedi sotto) | [] | Al massimo 40. Oltre il 40° i campi si scartano. |
steps | array | { "title": string } | [] | Un passaggio per voce. Le voci senza title stringa si scartano. |
actions | array | oggetti con type tra otp, save, email, webhook, create-post, component | [] | Le azioni con tipo sconosciuto si scartano. |
redirect | string | home, page:<slug> o un URL | '' | Destinazione dopo l'invio riuscito. Vedi "Esito e redirect". |
captcha | boolean | true, false | true | false toglie il captcha del sito da questo modulo. |
groupNumbering | string | none, letters, numbers, letters-box, numbers-box | none | Numera le legend dei gruppi di campi. Ogni altro valore vale none. |
Testi (content, traducibili):
| Chiave | Default |
|---|---|
submitLabel | Send |
successMessage | Thank you. |
errorMessage | Something went wrong. Try again. |
codeLabel | Verification code |
nextLabel | Next |
backLabel | Back |
sentMessage | We sent a code to your email. |
sendCodeLabel | Get the code |
verifyLabel | Verify |
otpFailedMessage | We could not send the code by email. Try again later. |
expiredMessage | The code has expired. Request a new code: your answers stay in the form. |
captchaMessage | Complete the anti-spam check and try again. |
requiredMark | nessuno |
optionalMark | nessuno |
I default sono stringhe traducibili del dominio nucleo. Un testo vuoto o di soli spazi lascia il default.
Permessi: chi salva il documento.
Edizione: Free
Limiti noti: 40 campi. Nome del campo con ^[a-z][a-z0-9_]{0,31}$. Il blocco non è ammesso dentro una scheda di nc/query o nc/collection (card_block_not_allowed).
Tipi di campo
Cosa fa: ogni campo produce un controllo HTML e una regola di validazione lato server.
Come si usa: voce di settings.fields con name e type.
Parametri (attributi del campo):
| Nome | Tipo | Valori ammessi | Default | Note | |
|---|---|---|---|---|---|
name | string | ^[a-z][a-z0-9_]{0,31}$, unico | obbligatorio | Un campo con nome non valido o ripetuto si scarta. | |
type | string | text, email, tel, url, textarea, number, date, select, radio, checkboxes, checkbox, consent, hidden, context | obbligatorio | Un tipo sconosciuto scarta il campo. | |
label | string | testo | '' | Etichetta o legend. | |
required | boolean | true, false | false | Solo true letterale rende il campo obbligatorio. | |
help | string | testo | '' | Testo di aiuto collegato con aria-describedby. | |
step | integer | >= 0 | 0 | Indice del passaggio. Un indice oltre l'ultimo passaggio va all'ultimo. | |
maxLength | integer | >= 1 | 2000 per textarea, 200 per gli altri | Vale per i tipi testuali. | |
min, max | number o string | numero, oppure data Y-m-d | '' | Per number e date. | |
decimals | integer | >= 0 | 0 | Cifre decimali di number. L'attributo step HTML vale 1 o 10^-decimals (al massimo 15 cifre). | |
placeholder | string | testo | '' | Per text, email, tel, url, textarea. | |
options | array | `{ "value": string\ | number, "label"?: string }` | [] | Per select, radio, checkboxes. Valore vuoto: opzione scartata. Senza label vale value. |
value | string o number | testo | '' | Valore fisso di hidden. | |
from | string | post.id, post.title, post.url | obbligatorio per context | Un campo context senza from valido si scarta. | |
width | string | full, half | full | Due campi half consecutivi stanno affiancati su schermi larghi. | |
group | string | testo | '' | Campi consecutivi con lo stesso group stanno in un fieldset con quella legend. |
Controlli e valori:
type | Controllo | Valore inviato |
|---|---|---|
text, email, tel, url | input del tipo corrispondente con maxlength | stringa senza tag HTML |
textarea | textarea con maxlength | stringa senza tag HTML |
number | input type="number" con min, max, step | stringa numerica |
date | input type="date" con min, max | Y-m-d |
select | select con un'opzione vuota iniziale | un valore delle opzioni |
radio | gruppo di radio in fieldset | un valore delle opzioni |
checkboxes | gruppo di caselle, nome <name>[] | lista di valori delle opzioni |
checkbox, consent | una casella con value="1" | 1 |
hidden | input type="hidden" | sempre value della configurazione |
context | nessun controllo | id, titolo o URL del post di contesto, letto dal server |
Permessi: come la configurazione del modulo.
Edizione: Free
Limiti noti: consent si comporta come checkbox. Nucleo non salva data, testo o versione del consenso. requiredMark e optionalMark non compaiono su checkbox, consent, hidden e context. Il modulo non accetta file.
Passaggi
Cosa fa: divide i campi in passaggi. Ogni passaggio è un fieldset con legend uguale a title.
Come si usa: settings.steps e step su ogni campo. Lo script view.js mostra un passaggio alla volta con i pulsanti nextLabel e backLabel. Senza script tutti i passaggi restano visibili.
Parametri: steps[].title (string).
Permessi: come la configurazione del modulo.
Edizione: Free
Limiti noti: il server valida sempre tutti i campi all'invio finale. Senza steps c'è un solo fieldset senza legend.
Validazione del documento
Cosa fa: controlla la configurazione al salvataggio del documento. Un errore blocca il salvataggio.
Come si usa: automatica, dentro la validazione del documento.
Parametri: Nessuno
Permessi: come il salvataggio del documento.
Edizione: Free
Limiti noti: codici di errore restituiti:
| Codice | Quando |
|---|---|
duplicate_field | Nome di campo ripetuto. |
bad_options | select, radio o checkboxes senza options. |
bad_step | step del campo >= numero di passaggi, oppure > 0 senza passaggi. |
otp_first | otp non è la prima azione, oppure il suo field non è di tipo email. |
otp_step | step dell'azione otp fuori da 0…passaggi-2, oppure campo email in un passaggio dopo step. |
unknown_field | field di otp, to/replyTo con field:x, o segnaposto {field:x} in subject, body, title, fields, input con un campo non dichiarato. |
unverified_recipient | Azione email con to: field:x senza un'azione otp valida sullo stesso campo. |
unknown_post_type | create-post con un tipo di contenuto fuori dal modello. |
bad_status | create-post con status diverso da draft e pending. |
unsafe_url | webhook con url che non inizia con https://. |
unknown_component | Azione component con un nome non registrato. |
03Modulo nativo: invio
Endpoint di invio
Cosa fa: riceve l'invio di un modulo, applica i controlli e restituisce l'esito.
Come si usa: POST /wp-json/nucleo/v1/form/<doc>/<node>, corpo application/x-www-form-urlencoded con i campi del modulo e i campi di servizio. Con l'header X-Nucleo-Form: 1 la risposta è JSON. Senza header la risposta è un redirect 303 a _nc_back con nc_form=<node>, nc_status=done|error|otp|code|verified e, per otp, nc_ticket.
Parametri (campi di servizio):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
_nc_nonce | string | nonce del modulo | obbligatorio | Vedi "Nonce del modulo". |
_nc_hp | string | vuoto | '' | Honeypot. |
_nc_ctx | integer | id di un post | 0 | Post di contesto. Vale solo se pubblicato. |
_nc_back | string | URL dello stesso sito | home | Ritorno per l'invio senza script. Passa da wp_validate_redirect. |
_nc_ticket | string | ticket OTP | '' | Secondo invio OTP o verifica a un passaggio. |
_nc_code | string | 6 cifre | '' | Codice OTP. |
_nc_otp | string | send, verify | '' | Codice a un passaggio intermedio. |
_nc_proof | string | ticket verificato | '' | Invio finale dopo la verifica a un passaggio. |
g-recaptcha-response, h-captcha-response, cf-turnstile-response, frc-captcha-response | string | token del provider | '' | Solo con captcha attivo. |
Ordine dei controlli: documento e nodo, honeypot, nonce, limite di frequenza, captcha, flusso OTP, validazione, azioni.
| Esito | HTTP | code |
|---|---|---|
| Documento non pubblicato, protetto da password, o nodo assente | 404 | nucleo_form_not_found |
| Honeypot compilato | 200 | nessuno: risposta di successo, nessuna azione |
| Nonce non valido | 403 | bad_nonce |
| Limite superato | 429 | rate_limited |
| Captcha non superato | 403 | captcha |
| Campi non validi | 422 | invalid, con errors per campo |
| Codice sbagliato | 422 | otp_wrong |
| Ticket o prova scaduti | 410 | otp_expired |
| Email del codice non partita | 500 | otp_failed |
| Azione fallita | 500 | action_failed |
| Riuscito | 200 | status: done, otp, code o verified |
Permessi: pubblico (permission_callback __return_true). Il campo detail di action_failed arriva solo a chi ha manage_options o con ambiente local o development. Il filtro nucleo/forms/error_detail cambia la scelta.
Edizione: Free
Limiti noti: 5 invii al minuto per IP e modulo. 10 verifiche del codice al minuto per IP e modulo, con un contatore separato. 3 codici OTP ogni 15 minuti per indirizzo normalizzato (minuscole, senza spazi, senza +tag). L'IP viene da REMOTE_ADDR, oppure da X-Forwarded-For se il proxy è nel filtro nucleo/trusted_proxies.
Nonce del modulo
Cosa fa: restituisce un nonce fresco. Il nonce non dipende dall'utente collegato.
Come si usa: GET /wp-json/nucleo/v1/form/<doc>/<node>/nonce. Risposta { "nonce": "…" } con Cache-Control: no-store. Lo script lo chiede prima di ogni invio, perché la cache delle pagine può servire un nonce scaduto.
Parametri: doc e node nel percorso.
Permessi: pubblico.
Edizione: Free
Limiti noti: HMAC di wp_nonce_tick() e dell'azione nucleo_form:<doc>:<node>. Vale per il tick corrente e il precedente, come wp_verify_nonce. 404 se il modulo non esiste nel documento pubblicato.
Validazione dei valori
Cosa fa: valida i valori inviati contro i campi dichiarati. Ignora i campi non dichiarati e i campi context.
Come si usa: automatica a ogni invio.
Parametri: Nessuno
Permessi: pubblico, come l'endpoint.
Edizione: Free
Limiti noti: regole e messaggi:
| Tipo | Regola | Messaggio |
|---|---|---|
| tutti | obbligatorio e vuoto | This field is required. |
email | FILTER_VALIDATE_EMAIL | Enter a valid email address. |
url | URL valido con schema http o https | Enter a valid web address starting with http or https. |
tel | ^[0-9 +().-]{5,30}$ | Enter a valid phone number. |
| testuali | lunghezza <= maxLength | The text is too long. |
number | ^-?[0-9]+(\.[0-9]+)?$, decimali <= decimals, tra min e max | Enter a valid number., Too many decimal places., Enter a value within the allowed range. |
date | data reale Y-m-d tra min e max | Enter a valid date., Enter a date within the allowed range. |
select, radio | valore tra le opzioni | Choose one of the options. |
checkboxes | ogni valore tra le opzioni | Choose one or more of the options. |
checkbox, consent | valore 1 | Invalid value. |
I tipi testuali perdono i tag HTML e gli spazi ai bordi. hidden usa sempre il valore della configurazione, non quello inviato.
Esito e redirect
Cosa fa: mostra il messaggio di esito. Con settings.redirect indica la pagina di destinazione dopo l'invio riuscito.
Come si usa: redirect accetta home, page:<slug> e gli altri riferimenti interni dei link, oppure un URL. Il riferimento interno si risolve come i link della pagina. La risposta JSON done contiene redirect se la destinazione esiste.
Parametri: settings.redirect (string).
Permessi: pubblico.
Edizione: Free
Limiti noti: un riferimento senza contenuto pubblicato non produce redirect. Un URL non sicuro (javascript: ecc.) viene scartato da esc_url_raw. Senza script il redirect 303 torna sempre a _nc_back: lo slot legge nc_status e mostra solo done, error e otp.
04Modulo nativo: azioni
Esecuzione delle azioni
Cosa fa: esegue le azioni dopo la validazione, nell'ordine dichiarato. otp non si esegue qui. Il primo errore ferma le successive.
Come si usa: settings.actions.
Parametri: vedi le sezioni delle singole azioni.
Permessi: pubblico, come l'endpoint.
Edizione: Free
Limiti noti: il visitatore vede errorMessage. Il dettaglio va nel log PHP con il prefisso [nucleo] form <node>, action <type>:. Le azioni già eseguite non si annullano.
Segnaposto nei testi
Cosa fa: sostituisce i segnaposto nei testi delle azioni email, create-post e component.
Come si usa: {field:<nome>}, {post.id}, {post.title}, {post.url}, {site.name}, {fields}. {fields} scrive una riga etichetta: valore per ogni campo non context con un valore. Le liste si uniscono con , .
Parametri: Nessuno
Permessi: pubblico.
Edizione: Free
Limiti noti: una sola passata: un valore inserito non viene riletto come segnaposto. Un segnaposto sconosciuto resta com'è. Il risultato è testo semplice.
Azione save: salvataggio degli invii
Cosa fa: salva l'invio come post privato del tipo nucleo_submission.
Come si usa: { "type": "save" }. Titolo <node> – <Y-m-d H:i:s>. Meta _nc_form (<doc>:<node>), _nc_data (valori), _nc_context (id del post di contesto o 0).
Parametri: Nessuno
Permessi: il tipo nucleo_submission richiede manage_options per creare, modificare, leggere i privati e cancellare.
Edizione: Free
Limiti noti: il tipo ha show_ui attivo ma show_in_menu disattivo: nessuna voce di menu. L'interfaccia mostra solo il titolo, non i valori. Nucleo non cancella gli invii nel tempo né alla disattivazione del plugin. Gli invii non svuotano le cache delle collezioni e non compaiono nelle collezioni.
Azione email
Cosa fa: invia un'email in testo semplice.
Come si usa: { "type": "email", "to": "admin", "subject": "…", "body": "…", "replyTo": "field:email" }.
Parametri:
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
to | string | admin, field:<nome>, indirizzo email | admin | admin è l'opzione admin_email. field:<nome> richiede un'azione otp sullo stesso campo. |
subject | string | testo con segnaposto | '' | Su una riga sola. |
body | string | testo con segnaposto | '' | |
replyTo | string | field:<nome> | nessuno | Solo se il valore è un'email valida. |
Permessi: pubblico.
Edizione: Free
Limiti noti: destinatario non valido: errore invalid recipient. Invio non riuscito: errore wp_mail did not send the message. L'invio passa dal registro delle email di sviluppo: in sviluppo l'email va nel registro.
Azione webhook
Cosa fa: invia l'invio in POST JSON a un URL esterno.
Come si usa: { "type": "webhook", "url": "https://…" }. Corpo: { "form": "<doc>:<node>", "fields": {…}, "context": <id>|null }.
Parametri: url (string, https, obbligatorio).
Permessi: pubblico.
Edizione: Free
Limiti noti: l'URL passa da un controllo di sicurezza: solo https, niente credenziali, niente localhost, solo IP pubblici. Timeout 5 secondi. Errori: unsafe webhook URL, errore di rete, HTTP status <codice> per risposte >= 400. Il codice non firma la richiesta e non ripete i tentativi.
Azione create-post
Cosa fa: crea un contenuto di un tipo del modello e ne scrive i campi.
Come si usa: { "type": "create-post", "postType": "iscrizione", "status": "pending", "title": "{field:nome}", "fields": { "email": "{field:email}" } }.
Parametri:
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
postType | string | slug di un tipo del modello | obbligatorio | |
status | string | draft, pending | obbligatorio | |
title | string | testo con segnaposto | '' | |
fields | object | chiave del modello → testo con segnaposto | {} | Solo valori stringa. |
Permessi: pubblico.
Edizione: Free
Limiti noti: campi non validi: il contenuto creato si cancella e l'errore riporta i dettagli. Errori tipo di contenuto fuori dal modello e status not allowed.
Azione component
Cosa fa: esegue un'azione PHP registrata da un plugin del sito.
Come si usa: { "type": "component", "name": "acme/crm", "input": { "email": "{field:email}" } }. Senza input l'azione riceve tutti i valori dei campi. Con input le stringhe passano dai segnaposto e gli altri valori restano com'erano. Poi l'input si valida contro inputSchema(), si controlla permitted() e si chiama run().
Parametri: name (string), input (object, facoltativo).
Permessi: pubblico. L'azione decide con permitted().
Edizione: Free
Limiti noti: errori component action not registered, component action not permitted, errori di schema in JSON, component action failed o ActionResult::message. ActionResult::data resta sul server.
Codice OTP all'invio finale
Cosa fa: verifica l'indirizzo email prima di eseguire le azioni.
Come si usa: prima azione { "type": "otp", "field": "email" }. Primo invio: validazione, codice di 6 cifre per email, risposta status: "otp" con ticket. Secondo invio con _nc_ticket e _nc_code: verifica, poi le azioni con i valori salvati nel ticket.
Parametri:
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
field | string | nome di un campo email | obbligatorio | |
subject | string | testo | Your verification code | Traducibile. |
body | string | testo | Your code: {code} | |
ttl | integer | 5–30 (minuti) | 15 | Valori fuori intervallo si portano ai limiti. |
step | integer | 0…passaggi-2 | nessuno | Vedi la sezione seguente. |
Permessi: pubblico.
Edizione: Free
Limiti noti: nel testo dell'email OTP valgono solo {code}, {site.name}, {post.title}, {post.url}. Gli altri segnaposto diventano vuoti. Il ticket è un transient nucleo_otp_<md5> con l'hash HMAC del codice. 5 tentativi per ticket: dal sesto il ticket scade. Il ticket si consuma una volta sola, anche con richieste in parallelo. Nel flusso classico il ticket scaduto restituisce errorMessage, non expiredMessage.
Codice OTP a un passaggio intermedio
Cosa fa: chiede e verifica il codice all'uscita dal passaggio step, prima dei passaggi successivi.
Come si usa: { "type": "otp", "field": "email", "step": 0 }.
_nc_otp=send: il server valida i campi dei passaggi fino astep, invia il codice e rispondestatus: "code"conticket. Imposta il cookienucleo_otp_<doc>_<node>(HttpOnly,SameSite=Strict,Securesu HTTPS, 1 ora)._nc_otp=verifycon_nc_tickete_nc_code: rispondestatus: "verified". Il ticket verificato vale 30 minuti dalla prima verifica.- Invio finale con
_nc_proof=<ticket>: validazione completa, poi la prova si consuma una volta sola.
Parametri: come l'azione otp, con step.
Permessi: pubblico.
Edizione: Free
Limiti noti: senza il cookie il ticket non vale. La prova vale solo per lo stesso documento, nodo e indirizzo. Prova non valida: 410 otp_expired con expiredMessage. Senza script il modulo usa il flusso classico.
Consenso per le azioni con effetti esterni
Cosa fa: la regola di qualità form.action.consequential (R4.4) segnala i moduli con azioni che escono dal sito. Sono webhook, create-post, component ed email con to diverso da admin o vuoto.
Come si usa: l'avviso blocca la pubblicazione. L'agente chiede il consenso all'utente e pubblica con acknowledge e il consenso in reason.
Parametri: Nessuno
Permessi: come la pubblicazione, vedi nucleo/doc-publish.
Edizione: Free
Limiti noti: la regola riguarda il consenso di chi pubblica, non il consenso privacy del visitatore. Per il visitatore esiste il tipo di campo consent.
05Modulo nativo: antispam
Honeypot
Cosa fa: aggiunge il campo trappola _nc_hp fuori schermo via CSS. Un invio con il campo pieno riceve un finto successo e nessuna azione.
Come si usa: automatico in ogni modulo.
Parametri: Nessuno
Permessi: pubblico.
Edizione: Free
Limiti noti: Nessuno rilevato.
Captcha
Cosa fa: mostra un captcha sopra i pulsanti di ogni modulo nativo e verifica il token presso il provider.
Come si usa: un provider per sito, nell'opzione nucleo_captcha. Si imposta da Nucleo AI → Impostazioni, scheda Captcha, o con nucleo/settings-set, gruppo captcha. nucleo/settings-get legge provider, chiave del sito, secretSet e soglia, mai il segreto. settings.captcha: false lo toglie da un modulo.
Parametri (gruppo captcha):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
provider | string | '', recaptcha, recaptcha-v3, hcaptcha, turnstile, friendly | '' | '' spegne il captcha. |
siteKey | string | chiave pubblica | '' | Obbligatoria con un provider. |
secret | string | chiave segreta | '' | Obbligatoria con un provider. Sola scrittura. |
threshold | number | 0–1 | 0.5 | Punteggio minimo per recaptcha-v3. |
Permessi: manage_options; scope nucleo:admin per le ability.
Edizione: Free
Limiti noti: il captcha vale per l'invio senza ticket e per _nc_otp=send, non per verifica e invio finale con ticket o prova. Provider non raggiungibile o risposta >= 500: il controllo passa (fail-open). recaptcha-v3 richiede anche l'azione nucleo_form. Chiave sconosciuta nel gruppo: errore Unknown captcha key. Gli script del provider arrivano da CDN esterne (Google, hCaptcha, Cloudflare, jsDelivr per Friendly Captcha).
06Email di Nucleo
Invio ed esito delle email
Cosa fa: invia le email di Nucleo (codici OTP e azioni email) con wp_mail. Registra l'esito dell'ultimo invio nell'opzione nucleo_mail_status.
Come si usa: automatico. Gli hook wp_mail_failed e wp_mail_succeeded aggiornano l'esito. nucleo/site-describe riporta in warnings un fallimento degli ultimi 7 giorni non seguito da un invio riuscito.
Parametri: Nessuno
Permessi: nessuno per l'invio. L'avviso si legge con nucleo/site-describe.
Edizione: Free
Limiti noti: gli hook si registrano in admin, REST, CLI e cron, non nelle richieste frontend. La disattivazione del plugin cancella nucleo_mail_status.
Registro delle email di sviluppo
Cosa fa: in sviluppo salva le email di Nucleo nell'opzione nucleo_dev_mail invece di inviarle. L'invio risulta riuscito.
Come si usa: attivo in local salvo define('NUCLEO_DEV_MAIL', false). In development serve define('NUCLEO_DEV_MAIL', true). In staging e production mai. Il filtro nucleo/dev_mail (default true) lo spegne anche dove è ammesso. Si legge con nucleo/mail-log.
In staging e production il registro non si attiva mai. Il registro contiene i codici OTP in chiaro.
Parametri (nucleo/mail-log):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
limit | integer | 1–20 | 20 | Voci dalla più recente. |
Permessi: manage_options; scope nucleo:admin.
Edizione: Free
Limiti noti: ultime 20 email, al massimo 24 ore. Corpo tagliato a 5000 caratteri. Il registro contiene i codici OTP in chiaro. Un cron (nucleo_dev_mail_prune) toglie le voci scadute ogni giorno. La disattivazione cancella l'opzione. Le email di WordPress e degli altri plugin partono come sempre.
07Componenti estendibili
Registrazione dei componenti
Cosa fa: raccoglie le sorgenti dati e le azioni dei plugin del sito in un registro unico.
Come si usa: il plugin aggancia l'hook nucleo/register_components. La prima chiamata a Components::instance() lo esegue.
add_action('nucleo/register_components', static function (\Nucleo\Extend\Components $components): void {
$components->add(new \Acme\Components\DataSources\Eventi());
$components->add(new \Acme\Components\Actions\Crm());
});API PHP di Nucleo\Extend\Components:
public static function instance(): selfpublic function add(DataSource|Action $component): voidpublic function dataSource(string $name): ?DataSourcepublic function action(string $name): ?Actionpublic function describe(): array— nomi, etichette e schemi, mai il codice.
I blocchi dei componenti usano un altro hook, nucleo/register_blocks. Il comando locale nucleo component new <data-source|action|block> <nome> genera il plugin, le classi e la registrazione.
Parametri: nome del componente con ^[a-z0-9-]{1,40}\/[a-z0-9-]{1,40}$, cioè <vendor>/<nome>.
Permessi: nessuno a runtime. Il plugin si installa e si attiva come un plugin WordPress.
Edizione: Free
Limiti noti: un nome non valido o già usato (anche tra sorgente e azione) si scarta con _doing_it_wrong. Il codice PHP non passa mai da REST, MCP o push.
Sorgente dati (DataSource)
Cosa fa: fornisce elementi a nc/collection con "source": "component".
Come si usa: implementa Nucleo\Extend\DataSource:
public function name(): stringpublic function label(): stringpublic function schema(): array—params,fields,ttlfacoltativopublic function read(array $params, int $page, int $perPage): DataPage
DataPage ha items (lista di mappe di valori scalari o null) e total. Nel documento: "source": "component", "component": "acme/eventi". I filtri param passano i parametri. Nella scheda si legge con il bind { "source": "item", "field": "<campo>" }.
Parametri (schema()):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
params | object | chiave → JSON Schema (string, integer, number, boolean, enum) | obbligatorio | read() riceve parametri già validati. |
fields | object | chiave → {type, label} | obbligatorio | Campi di ogni elemento. |
ttl | integer | >= 0 secondi | 300 | 0 = niente cache. |
Permessi: pubblico in lettura, come la collezione.
Edizione: Free
Limiti noti: parametri non validi o sorgente non registrata: collezione vuota. Al salvataggio una sorgente non registrata dà unknown_component. La collezione non calcola conteggi per opzione.
Azione (Action)
Cosa fa: esegue codice del sito all'invio di un modulo nativo.
Come si usa: implementa Nucleo\Extend\Action:
public function name(): stringpublic function label(): stringpublic function inputSchema(): array— JSON Schema di tipoobjectpublic function permitted(array $input, ActionContext $context): boolpublic function run(array $input, ActionContext $context): ActionResult
ActionContext ha formId (nodo), documentId, contextPostId, ip. ActionResult ha ok, message (per il visitatore) e data (resta sul server), con i costruttori ActionResult::ok(string $message = '') e ActionResult::fail(string $message). Uso nel modulo: vedi "Azione component".
Parametri: Nessuno oltre ai metodi.
Permessi: decide permitted().
Edizione: Free
Limiti noti: vedi "Azione component".
Elenco dei componenti
Cosa fa: restituisce sorgenti dati e azioni registrate, con nome, etichetta e schema.
Come si usa: nucleo/components-list. Risposta { ok, dataSources: [{name, label, schema}], actions: [{name, label, inputSchema}] }.
Parametri: Nessuno
Permessi: edit_pages; scope nucleo:read.
Edizione: Free
Limiti noti: non elenca i blocchi dei componenti: compaiono in catalog-get.
Attivazione di un plugin di componenti
Cosa fa: attiva un plugin di componenti già presente su disco. Non installa nulla e non riceve codice.
Come si usa: nucleo/component-activate con { "plugin": "nucleo-components" }. Il file deve essere WP_PLUGIN_DIR/<plugin>/<plugin>.php con l'intestazione Nucleo Components. Il comando locale nucleo component deploy copia il plugin su un WordPress locale.
Parametri:
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
plugin | string | ^[a-z0-9][a-z0-9-]{0,60}$ | obbligatorio | Cartella e nome del file principale. |
Permessi: activate_plugins; scope nucleo:admin.
Edizione: Free
Limiti noti: errori not_found, not_component, activation_failed. Plugin già attivo: ok con already: true. Ogni chiamata va nel registro di audit.
08Bindings
Sintassi del bind
Cosa fa: collega una proprietà di un nodo a un campo di WordPress.
Come si usa: chiave bind del nodo. La chiave è content.<nome> o settings.<nome> dichiarata dal blocco.
{ "id": "h1", "type": "nc/heading",
"bind": { "content.text": { "source": "post", "field": "title", "fallback": "Senza titolo" } } }Parametri (valore del bind):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
source | string | post, term, author, site, nucleo, acf, metabox, jetengine, woo, user, query, param, item | obbligatorio | |
field | string | non vuota | obbligatorio | Vedi "Sorgenti e campi". |
fallback | string | testo | '' | Valore quando il campo è vuoto o manca. |
Permessi: chi salva il documento.
Edizione: Free
Limiti noti: una chiave non dichiarata dal blocco dà l'errore bind key not declared in the block. Le sorgenti user e query non sono ammesse nelle schede.
Sorgenti e campi
Cosa fa: legge il valore del campo dalla sorgente indicata.
Come si usa: nucleo/bind-fields elenca i campi di un tipo di contenuto.
Parametri:
source | field | Valore |
|---|---|---|
post | title, excerpt, date, url, image, meta:<chiave> | Post corrente. image è l'URL della misura large dell'immagine in evidenza. |
site | name, description, url | Dati del sito. |
author | name, bio, url | Autore del post corrente. |
term | name, description, url, slug, count, oppure chiave di un campo del modello sulla tassonomia | Termine della scheda o termine interrogato. Mai un post. |
user | name | Utente collegato. Vuoto per i visitatori anonimi. |
query | search, found, page | Query principale della richiesta: testo cercato, risultati totali, pagina corrente. Non ammessa nelle schede. |
nucleo | <chiave> oppure <ripetitore>.<indice>.<sottocampo> (indice da 0) | Campo del modello dei contenuti. |
acf | nome del campo | get_field(). Un array con url restituisce l'URL. Senza ACF legge la meta. |
metabox | id del campo | rwmb_meta(). Senza Meta Box legge la meta. |
jetengine | chiave della meta | Meta del post. |
woo | price, regular_price, sale_price, sku, stock_status, rating | Prodotto WooCommerce del post. I prezzi escono da wc_price senza HTML. Vuoto senza WooCommerce o se il post non è un prodotto. |
item | chiave dell'elemento | Elemento corrente di una scheda (sorgente component o riga di nc/repeater). |
param | nome del parametro | Parametro di una sezione riutilizzabile. Si risolve all'espansione della sezione. |
Campi nucleo per tipo: boolean → 1 o vuoto; image → URL dell'allegato; relation → titolo del primo contenuto collegato se pubblicato; select → etichette unite con , ; ripetitore intero → nessun valore.
Permessi: nucleo/bind-fields richiede edit_posts; scope nucleo:read.
Edizione: Free
Limiti noti: solo stringhe e numeri diventano testo. Array, oggetti, false e null danno il fallback. Il filtro nucleo/bind_fields aggiunge campi all'elenco di bind-fields, non sorgenti al resolver.
Valori statici e dinamici
Cosa fa: decide se un bind si risolve al salvataggio o a ogni richiesta.
Come si usa: automatico. Nei documenti di tipo pagina le sorgenti diverse da user, query, woo, term e item si leggono in compilazione. Il valore entra nel nodo e la pagina registra la dipendenza bind:<source>:<field>. Negli altri casi il compilatore scrive un token __NCB<n>__ e lo slot nc/bind lo sostituisce a ogni richiesta. Layout e sezioni sono sempre dinamici.
Parametri: Nessuno
Permessi: nessuno.
Edizione: Free
Limiti noti: un valore statico vuoto usa il fallback. Dentro una scheda il bind legge l'elemento corrente. Fuori, il post interrogato.
Escape dei valori
Cosa fa: applica l'escape adatto a ogni valore dinamico.
Come si usa: automatico. content.html usa wp_kses_post. Le chiavi che finiscono con src, url, href o poster usano esc_url. Le altre usano esc_html.
Parametri: Nessuno
Permessi: nessuno.
Edizione: Free
Limiti noti: Nessuno rilevato.
Ricompilazione al cambio delle meta
Cosa fa: ricompila una pagina quando cambia una meta letta da un suo bind statico.
Come si usa: automatico su added_post_meta e updated_post_meta. Vale per le dipendenze bind:metabox:<chiave>, bind:acf:<chiave>, bind:post:meta:<chiave>.
Parametri: Nessuno
Permessi: nessuno.
Edizione: Free
Limiti noti: le meta con prefisso _ si ignorano. La cancellazione di una meta non ricompila. Il watcher si registra in admin, REST e CLI, non nelle richieste frontend.
09Media
Salvataggio delle immagini
Cosa fa: salva un'immagine come allegato della libreria media, con testo alternativo e titolo.
Come si usa: interno, usato da nucleo/media-import e nucleo/media-upload. Controlla il tipo reale con getimagesizefromstring, non l'header dichiarato. L'estensione del file viene dal tipo reale. Il salvataggio passa da media_handle_sideload, quindi WordPress genera le misure intermedie.
Parametri: Nessuno per l'utente.
Permessi: quelli delle ability che lo usano.
Edizione: Free
Limiti noti: formati image/jpeg, image/png, image/webp, image/gif, image/avif. Contenuto vuoto o >= 10 MB: download_failed. Tipo non ammesso: unsupported_type.
Import da URL
Cosa fa: scarica un'immagine pubblica e la salva nella libreria.
Come si usa: nucleo/media-import. Risposta { ok, id, url, width, height } o { ok: false, error }.
Parametri:
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
url | string | URL https di un host pubblico | obbligatorio | |
alt | string | testo | obbligatorio | Stringa vuota per immagini decorative. |
title | string | testo | nessuno | Titolo dell'allegato. |
Permessi: upload_files; scope nucleo:write.
Edizione: Free
Limiti noti: UrlGuard con risoluzione DNS: errore invalid_url per host privati, localhost, credenziali o schema diverso da https. Timeout 15 secondi. Risposta diversa da 200: download_failed. Nome del file dal percorso dell'URL. Non riconosce i duplicati.
Caricamento da base64
Cosa fa: salva un'immagine inviata in base64. Un file identico già caricato si restituisce senza duplicarlo.
Come si usa: nucleo/media-upload. Risposta { ok, id, url, width, height, file, sha1, existing }.
Parametri:
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
file | string | nome con estensione | obbligatorio | Dà il nome del file salvato. L'estensione viene dal tipo reale. |
data | string | base64 | obbligatorio | |
alt | string | testo | '' | |
title | string | testo | nessuno |
Permessi: upload_files; scope nucleo:write.
Edizione: Free
Limiti noti: base64 non valido: invalid_data. Il duplicato si riconosce con lo SHA-1 nella meta _nucleo_sha1 e con il nome del file originale (<nome> o <nome>-<n>). Le immagini oltre 2560 px si confrontano sul file originale, non sulla copia -scaled.
Formati AVIF e WebP
Cosa fa: genera copie AVIF e WebP dell'originale e delle misure intermedie. nc/image e nc/post-image le offrono in <picture>, con l'originale come fallback.
Come si usa: si accendono con l'opzione del sito imageFormats, per esempio ["avif", "webp"], tramite nucleo/site-options-set. Le immagini caricate dopo ricevono i formati da sole. Per quelle già presenti si usa nucleo/media-formats. Nei blocchi immagine formats: "off" disattiva le sorgenti.
Parametri (nucleo/media-formats):
| Nome | Tipo | Valori ammessi | Default | Note |
|---|---|---|---|---|
ids | array di integer | 1–50 id di allegati immagine | nessuno | Gli altri id si saltano. |
missing | boolean | true, false | false | Solo le immagini senza nessuno dei formati accesi. |
limit | integer | 1–50 | 20 | Vale senza ids. Ordine per id crescente. |
Risposta { ok, done: [{id, formats}], enabled, supported, remaining }.
Permessi: nucleo/media-formats richiede upload_files; scope nucleo:write. nucleo/site-options-set richiede manage_options; scope nucleo:admin.
Edizione: Free
Limiti noti: opzione imageFormats con duplicati o valori diversi da avif e webp: invalid_input. Opzione vuota: media-formats risponde formats_disabled. Si generano solo i formati che l'editor di immagini del server sa scrivere (supported). Il formato uguale all'originale si salta. I file si chiamano <file>.<formato> nella stessa cartella e si elencano nella meta _nucleo_formats. Lo srcset usa solo le misure con le proporzioni dell'originale. La cancellazione dell'allegato cancella anche le copie. Un errore dell'editor su una misura la salta in silenzio.
Questa pagina ti è stata utile?