DocumentazioneScarica

Moduli, dati dinamici, componenti, bindings e media

Nucleo 0.2+FreeLettura ~26 minAggiornato 31 ottobre 2026

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

NomeTipoValori ammessiDefaultNote
fieldsarrayoggetti campo (vedi sotto)[]Al massimo 40. Oltre il 40° i campi si scartano.
stepsarray{ "title": string }[]Un passaggio per voce. Le voci senza title stringa si scartano.
actionsarrayoggetti con type tra otp, save, email, webhook, create-post, component[]Le azioni con tipo sconosciuto si scartano.
redirectstringhome, page:<slug> o un URL''Destinazione dopo l'invio riuscito. Vedi "Esito e redirect".
captchabooleantrue, falsetruefalse toglie il captcha del sito da questo modulo.
groupNumberingstringnone, letters, numbers, letters-box, numbers-boxnoneNumera le legend dei gruppi di campi. Ogni altro valore vale none.

Testi (content, traducibili):

ChiaveDefault
submitLabelSend
successMessageThank you.
errorMessageSomething went wrong. Try again.
codeLabelVerification code
nextLabelNext
backLabelBack
sentMessageWe sent a code to your email.
sendCodeLabelGet the code
verifyLabelVerify
otpFailedMessageWe could not send the code by email. Try again later.
expiredMessageThe code has expired. Request a new code: your answers stay in the form.
captchaMessageComplete the anti-spam check and try again.
requiredMarknessuno
optionalMarknessuno

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

NomeTipoValori ammessiDefaultNote
namestring^[a-z][a-z0-9_]{0,31}$, unicoobbligatorioUn campo con nome non valido o ripetuto si scarta.
typestringtext, email, tel, url, textarea, number, date, select, radio, checkboxes, checkbox, consent, hidden, contextobbligatorioUn tipo sconosciuto scarta il campo.
labelstringtesto''Etichetta o legend.
requiredbooleantrue, falsefalseSolo true letterale rende il campo obbligatorio.
helpstringtesto''Testo di aiuto collegato con aria-describedby.
stepinteger>= 00Indice del passaggio. Un indice oltre l'ultimo passaggio va all'ultimo.
maxLengthinteger>= 12000 per textarea, 200 per gli altriVale per i tipi testuali.
min, maxnumber o stringnumero, oppure data Y-m-d''Per number e date.
decimalsinteger>= 00Cifre decimali di number. L'attributo step HTML vale 1 o 10^-decimals (al massimo 15 cifre).
placeholderstringtesto''Per text, email, tel, url, textarea.
optionsarray`{ "value": string\number, "label"?: string }`[]Per select, radio, checkboxes. Valore vuoto: opzione scartata. Senza label vale value.
valuestring o numbertesto''Valore fisso di hidden.
fromstringpost.id, post.title, post.urlobbligatorio per contextUn campo context senza from valido si scarta.
widthstringfull, halffullDue campi half consecutivi stanno affiancati su schermi larghi.
groupstringtesto''Campi consecutivi con lo stesso group stanno in un fieldset con quella legend.

Controlli e valori:

typeControlloValore inviato
text, email, tel, urlinput del tipo corrispondente con maxlengthstringa senza tag HTML
textareatextarea con maxlengthstringa senza tag HTML
numberinput type="number" con min, max, stepstringa numerica
dateinput type="date" con min, maxY-m-d
selectselect con un'opzione vuota inizialeun valore delle opzioni
radiogruppo di radio in fieldsetun valore delle opzioni
checkboxesgruppo di caselle, nome <name>[]lista di valori delle opzioni
checkbox, consentuna casella con value="1"1
hiddeninput type="hidden"sempre value della configurazione
contextnessun controlloid, 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:

CodiceQuando
duplicate_fieldNome di campo ripetuto.
bad_optionsselect, radio o checkboxes senza options.
bad_stepstep del campo >= numero di passaggi, oppure > 0 senza passaggi.
otp_firstotp non è la prima azione, oppure il suo field non è di tipo email.
otp_stepstep dell'azione otp fuori da 0…passaggi-2, oppure campo email in un passaggio dopo step.
unknown_fieldfield di otp, to/replyTo con field:x, o segnaposto {field:x} in subject, body, title, fields, input con un campo non dichiarato.
unverified_recipientAzione email con to: field:x senza un'azione otp valida sullo stesso campo.
unknown_post_typecreate-post con un tipo di contenuto fuori dal modello.
bad_statuscreate-post con status diverso da draft e pending.
unsafe_urlwebhook con url che non inizia con https://.
unknown_componentAzione 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):

NomeTipoValori ammessiDefaultNote
_nc_noncestringnonce del moduloobbligatorioVedi "Nonce del modulo".
_nc_hpstringvuoto''Honeypot.
_nc_ctxintegerid di un post0Post di contesto. Vale solo se pubblicato.
_nc_backstringURL dello stesso sitohomeRitorno per l'invio senza script. Passa da wp_validate_redirect.
_nc_ticketstringticket OTP''Secondo invio OTP o verifica a un passaggio.
_nc_codestring6 cifre''Codice OTP.
_nc_otpstringsend, verify''Codice a un passaggio intermedio.
_nc_proofstringticket verificato''Invio finale dopo la verifica a un passaggio.
g-recaptcha-response, h-captcha-response, cf-turnstile-response, frc-captcha-responsestringtoken del provider''Solo con captcha attivo.

Ordine dei controlli: documento e nodo, honeypot, nonce, limite di frequenza, captcha, flusso OTP, validazione, azioni.

EsitoHTTPcode
Documento non pubblicato, protetto da password, o nodo assente404nucleo_form_not_found
Honeypot compilato200nessuno: risposta di successo, nessuna azione
Nonce non valido403bad_nonce
Limite superato429rate_limited
Captcha non superato403captcha
Campi non validi422invalid, con errors per campo
Codice sbagliato422otp_wrong
Ticket o prova scaduti410otp_expired
Email del codice non partita500otp_failed
Azione fallita500action_failed
Riuscito200status: 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:

TipoRegolaMessaggio
tuttiobbligatorio e vuotoThis field is required.
emailFILTER_VALIDATE_EMAILEnter a valid email address.
urlURL valido con schema http o httpsEnter a valid web address starting with http or https.
tel^[0-9 +().-]{5,30}$Enter a valid phone number.
testualilunghezza <= maxLengthThe text is too long.
number^-?[0-9]+(\.[0-9]+)?$, decimali <= decimals, tra min e maxEnter a valid number., Too many decimal places., Enter a value within the allowed range.
datedata reale Y-m-d tra min e maxEnter a valid date., Enter a date within the allowed range.
select, radiovalore tra le opzioniChoose one of the options.
checkboxesogni valore tra le opzioniChoose one or more of the options.
checkbox, consentvalore 1Invalid 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:

NomeTipoValori ammessiDefaultNote
tostringadmin, field:<nome>, indirizzo emailadminadmin è l'opzione admin_email. field:<nome> richiede un'azione otp sullo stesso campo.
subjectstringtesto con segnaposto''Su una riga sola.
bodystringtesto con segnaposto''
replyTostringfield:<nome>nessunoSolo 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:

NomeTipoValori ammessiDefaultNote
postTypestringslug di un tipo del modelloobbligatorio
statusstringdraft, pendingobbligatorio
titlestringtesto con segnaposto''
fieldsobjectchiave 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:

NomeTipoValori ammessiDefaultNote
fieldstringnome di un campo emailobbligatorio
subjectstringtestoYour verification codeTraducibile.
bodystringtestoYour code: {code}
ttlinteger5–30 (minuti)15Valori fuori intervallo si portano ai limiti.
stepinteger0…passaggi-2nessunoVedi 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 }.

  1. _nc_otp=send: il server valida i campi dei passaggi fino a step, invia il codice e risponde status: "code" con ticket. Imposta il cookie nucleo_otp_<doc>_<node> (HttpOnly, SameSite=Strict, Secure su HTTPS, 1 ora).
  2. _nc_otp=verify con _nc_ticket e _nc_code: risponde status: "verified". Il ticket verificato vale 30 minuti dalla prima verifica.
  3. 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):

NomeTipoValori ammessiDefaultNote
providerstring'', recaptcha, recaptcha-v3, hcaptcha, turnstile, friendly'''' spegne il captcha.
siteKeystringchiave pubblica''Obbligatoria con un provider.
secretstringchiave segreta''Obbligatoria con un provider. Sola scrittura.
thresholdnumber0–10.5Punteggio 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.

Attenzione

In staging e production il registro non si attiva mai. Il registro contiene i codici OTP in chiaro.

Parametri (nucleo/mail-log):

NomeTipoValori ammessiDefaultNote
limitinteger1–2020Voci 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(): self
  • public function add(DataSource|Action $component): void
  • public function dataSource(string $name): ?DataSource
  • public function action(string $name): ?Action
  • public 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(): string
  • public function label(): string
  • public function schema(): array — params, fields, ttl facoltativo
  • public 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()):

NomeTipoValori ammessiDefaultNote
paramsobjectchiave → JSON Schema (string, integer, number, boolean, enum)obbligatorioread() riceve parametri già validati.
fieldsobjectchiave → {type, label}obbligatorioCampi di ogni elemento.
ttlinteger>= 0 secondi3000 = 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(): string
  • public function label(): string
  • public function inputSchema(): array — JSON Schema di tipo object
  • public function permitted(array $input, ActionContext $context): bool
  • public 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:

NomeTipoValori ammessiDefaultNote
pluginstring^[a-z0-9][a-z0-9-]{0,60}$obbligatorioCartella 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):

NomeTipoValori ammessiDefaultNote
sourcestringpost, term, author, site, nucleo, acf, metabox, jetengine, woo, user, query, param, itemobbligatorio
fieldstringnon vuotaobbligatorioVedi "Sorgenti e campi".
fallbackstringtesto''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:

sourcefieldValore
posttitle, excerpt, date, url, image, meta:<chiave>Post corrente. image è l'URL della misura large dell'immagine in evidenza.
sitename, description, urlDati del sito.
authorname, bio, urlAutore del post corrente.
termname, description, url, slug, count, oppure chiave di un campo del modello sulla tassonomiaTermine della scheda o termine interrogato. Mai un post.
usernameUtente collegato. Vuoto per i visitatori anonimi.
querysearch, found, pageQuery 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.
acfnome del campoget_field(). Un array con url restituisce l'URL. Senza ACF legge la meta.
metaboxid del camporwmb_meta(). Senza Meta Box legge la meta.
jetenginechiave della metaMeta del post.
wooprice, regular_price, sale_price, sku, stock_status, ratingProdotto WooCommerce del post. I prezzi escono da wc_price senza HTML. Vuoto senza WooCommerce o se il post non è un prodotto.
itemchiave dell'elementoElemento corrente di una scheda (sorgente component o riga di nc/repeater).
paramnome del parametroParametro 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:

NomeTipoValori ammessiDefaultNote
urlstringURL https di un host pubblicoobbligatorio
altstringtestoobbligatorioStringa vuota per immagini decorative.
titlestringtestonessunoTitolo 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:

NomeTipoValori ammessiDefaultNote
filestringnome con estensioneobbligatorioDà il nome del file salvato. L'estensione viene dal tipo reale.
datastringbase64obbligatorio
altstringtesto''
titlestringtestonessuno

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

NomeTipoValori ammessiDefaultNote
idsarray di integer1–50 id di allegati immaginenessunoGli altri id si saltano.
missingbooleantrue, falsefalseSolo le immagini senza nessuno dei formati accesi.
limitinteger1–5020Vale 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.

Esc
↑↓ per scegliere↵ per aprireEsc per chiudereRicerca locale, nessun dato inviato