{"id":48491,"date":"2021-10-21T13:39:08","date_gmt":"2021-10-21T11:39:08","guid":{"rendered":"https:\/\/kinsta.com\/?p=105115"},"modified":"2023-06-08T09:27:49","modified_gmt":"2023-06-08T08:27:49","slug":"blocchi-gutenberg","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/","title":{"rendered":"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi"},"content":{"rendered":"<p>Sono in molti a lamentarsi delle difficolt\u00e0 che si incontrano quando si inizia a creare blocchi e app per Gutenberg. La curva di apprendimento \u00e8 ripida, soprattutto a causa della difficolt\u00e0 dell&#8217;installazione e della configurazione dell&#8217;ambiente di sviluppo. In pi\u00f9, solide conoscenze di JavaScript, Node.js, React e Redux sono ingredienti indispensabili per una ricetta decisamente complessa.<\/p>\n<p>Il <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Block Editor Handbook ufficiale di WordPress<\/a> fornisce agli sviluppatori un&#8217;enorme quantit\u00e0 di informazioni, ma in quel mare di informazioni ci si pu\u00f2 smarrire rapidamente.<\/p>\n<p>E vale la pena ricordare quanto ha affermato Mat\u00edas Ventura, lead architect del progetto Gutenberg, in una <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">intervista per WP Tavern<\/a>:<\/p>\n<blockquote><p><em>Anche se ci sono persone che possono imparare velocemente, la barriera all&#8217;ingresso \u00e8 ancora molto alta. Penso che ci siano diversi livelli in questo; la documentazione potrebbe essere migliorata di un ordine di grandezza sia nell&#8217;organizzazione che nella presentazione. Spero che riusciremo fare molto di pi\u00f9 in questi ambiti.<\/em><\/p><\/blockquote>\n<p>Partendo da queste considerazioni, abbiamo deciso di offrire un tutorial passo passo volto ad aiutare i nostri lettori ad iniziare a sviluppare blocchi per Gutenberg.<\/p>\n<p>Vi sembra interessante? Allora seguiteci!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Prerequisiti per lo Sviluppo dei Blocchi Gutenberg<\/h2>\n<p>Per questo tutorial, le uniche competenze richieste sono una buona conoscenza dello sviluppo di plugin WordPress e almeno una <a href=\"https:\/\/kinsta.com\/it\/blog\/best-practice-html\/\">conoscenza di base di HTML<\/a>, CSS, JavaScript e React.<\/p>\n<p>\u00c8 un progetto ambizioso? Ci potete scommettere!<\/p>\n<p>Non \u00e8 stato facile trovare il giusto compromesso tra completezza e semplicit\u00e0 e decidere quali argomenti includere e quali tralasciare.<\/p>\n<p>Speriamo solo che i lettori intermedi e avanzati ci perdonino per non aver approfondito concetti come <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">stati di React<\/a>, <a href=\"https:\/\/redux.js.org\/api\/store\">store di Redux<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">high order component<\/a> e cos\u00ec via. Questi argomenti richiedono maggiore spazio e attenzione e sono probabilmente troppo avanzati per chi inizia a sviluppare blocchi (a meno che non siate gi\u00e0 sviluppatori React).<\/p>\n<p>Per lo stesso motivo, non tratteremo alcuni degli argomenti pi\u00f9 avanzati relativi allo sviluppo dei blocchi di Gutenberg, come i <a href=\"https:\/\/kinsta.com\/it\/blog\/blocchi-dinamici\/\">blocchi dinamici<\/a> e i <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">meta box<\/a>.<\/p>\n<p>Ma con le conoscenze che avrete acquisito alla fine di questo articolo, potrete iniziare ed essere produttivi e divertirvi da subito.<\/p>\n<p>Una volta che avrete iniziato a costruire blocchi, potrete progressivamente migliorare le vostre abilit\u00e0 e creare da soli blocchi Gutenberg sempre pi\u00f9 avanzati.<\/p>\n\n<h2>Cosa \u00c8 un Blocco Gutenberg?<\/h2>\n<p>Da quando \u00e8 stato rilasciato per la prima volta nel dicembre 2018, <a href=\"https:\/\/kinsta.com\/it\/blog\/gutenberg-editor-wordpress\/\">l&#8217;editor di blocchi<\/a> \u00e8 stato notevolmente migliorato sotto tutti gli aspetti: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">API pi\u00f9 potenti<\/a>, un&#8217;interfaccia utente pi\u00f9 avanzata, una migliore usabilit\u00e0, un sacco di nuovi blocchi, le <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">prime implementazioni del Full Site Editing<\/a> e molto altro.<\/p>\n<p>In breve, anche se Gutenberg \u00e8 ancora in fase di sviluppo, ha fatto molta strada e oggi l&#8217;editor di blocchi \u00e8 un candidato a pieno titolo come costruttore affidabile e funzionale sia di pagine che di siti.<\/p>\n<p>Dal punto di vista di uno sviluppatore, Gutenberg \u00e8 una <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">Single Page Application<\/a> (SPA) basata su React che permette agli utenti di WordPress di creare, modificare e cancellare contenuti in modo semplice e veloce. Ma questo non deve far pensare a una versione migliorata del <a href=\"https:\/\/kinsta.com\/blog\/wordpress-tinymce-editor\/\">tradizionale editor di contenuti<\/a>.<\/p>\n<p>Vogliamo chiarire questo punto:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg <em>non<\/em> \u00e8 un normale editor WYSIWYG, ma ridefinisce l&#8217;intera esperienza di editing in WordPress.<\/strong><\/p>\n<\/aside>\n\n<p>In Gutenberg, il contenuto \u00e8 diviso in blocchi, che sono i &#8220;mattoni&#8221; che gli utenti possono utilizzare per creare articoli e pagine o i loro interi siti web.<\/p>\n<p>Ma cos&#8217;\u00e8 tecnicamente un blocco?<\/p>\n<p>Ci piace <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">la definizione di WordPress<\/a>:<\/p>\n<blockquote><p><em>&#8220;Blocco&#8221; \u00e8 il termine astratto utilizzato per descrivere unit\u00e0 di markup che, composte insieme, formano il contenuto o il layout di una pagina web. L&#8217;idea combina i concetti di ci\u00f2 che in WordPress oggi otteniamo con shortcode, HTML personalizzato e embed discovery in un&#8217;unica API coerente e nell&#8217;esperienza dell&#8217;utente.<\/em><\/p><\/blockquote>\n<p>Titoli, paragrafi, colonne, immagini, gallerie e tutti gli elementi che compongono l&#8217;interfaccia dell&#8217;editor, dai pannelli della sidebar ai controlli della barra degli strumenti dei blocchi, sono tutti componenti React.<\/p>\n<p>E quindi cosa sono i componenti React? W3Schools fornisce la <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">seguente definizione<\/a>:<\/p>\n<blockquote><p><em>I componenti sono blocchi di codice indipendenti e riutilizzabili. Hanno lo stesso scopo delle funzioni JavaScript, ma lavorano in modo isolato e restituiscono HTML tramite una funzione <code>render()<\/code>.<\/em><\/p><\/blockquote>\n<figure id=\"attachment_105117\" aria-describedby=\"caption-attachment-105117\" style=\"width: 2874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105117 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/working-with-blocks.jpg\" alt=\"Lavorare con i blocchi Gutenberg in WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Lavorare con i blocchi Gutenberg in WordPress 5.8.<\/figcaption><\/figure>\n<p>Mentre l&#8217;esperienza di editing offerta da Gutenberg \u00e8 nuova rispetto al classico editor di WordPress, il modo in cui WordPress memorizza i contenuti nel database non cambia affatto. Questo perch\u00e9 Gutenberg \u00e8 un&#8217;applicazione che lavora all&#8217;interno di WordPress, ma non cambia il modo in cui il CMS funziona al suo core.<\/p>\n<p>I post (e questo comprende post, pagine e tipi di post personalizzati) creati con Gutenberg sono sempre memorizzati nella tabella <code>wp_posts<\/code>, esattamente come nell&#8217;editor classico.<\/p>\n<p>Ma in un post creato con Gutenberg, troverete nella tabella altre informazioni che fanno una differenza fondamentale tra i post creati tramite l&#8217;editor classico e i post creati con Gutenberg.<\/p>\n<p>Queste informazioni assomigliano ai commenti HTML e hanno una funzione specifica: delimitare i blocchi:<\/p>\n<figure id=\"attachment_105118\" aria-describedby=\"caption-attachment-105118\" style=\"width: 1522px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105118 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/code-editor-view.jpg\" alt=\"Un post nella vista dell'editor di codice.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Un post nella vista dell&#8217;editor di codice.<\/figcaption><\/figure>\n<p>I <strong>delimitatori di blocco<\/strong> dicono a WordPress quale blocco deve essere reso sullo schermo. Oltre a questo, forniscono i valori per le propriet\u00e0 del blocco in un oggetto JSON. Queste propriet\u00e0 stabiliscono il modo in cui il blocco deve essere reso sullo schermo:<\/p>\n<figure id=\"attachment_105119\" aria-describedby=\"caption-attachment-105119\" style=\"width: 1630px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105119 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/post-content.jpg\" alt=\"Un post memorizzato nella tabella wp_posts.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Un post memorizzato nella tabella <code>wp_posts<\/code>.<\/figcaption><\/figure>\n<h2>Configurazione dell&#8217;Ambiente di Sviluppo di WordPress<\/h2>\n<p>La configurazione di un moderno ambiente di sviluppo JavaScript richiede una solida conoscenza di tecnologie avanzate come <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> e <a href=\"https:\/\/facebook.github.io\/jsx\/\">JSX<\/a>, <a href=\"https:\/\/babeljs.io\/docs\/en\/index.html\">Babel<\/a>, <a href=\"https:\/\/eslint.org\/\">ESLint<\/a>, ecc.<\/p>\n<p>Intimiditi? Non dovete esserlo! La comunit\u00e0 di WordPress ci viene in soccorso con potenti strumenti che permettono di evitare una complicata procedura di configurazione manuale.<\/p>\n<p>Per mantenere le cose semplici, in questo articolo non tratteremo il <a href=\"https:\/\/kinsta.com\/it\/blog\/traspiling-php\/\">transpiling<\/a> (anche se consigliamo di approfondire l&#8217;argomento una volta che avrete acquisito le basi dello sviluppo dei blocchi). Invece, presenteremo due strumenti alternativi utili per configurare un moderno ambiente di sviluppo JavaScript in pochi minuti. Sta a voi scegliere lo strumento che troverete pi\u00f9 conveniente e comodo per il vostro progetto.<\/p>\n<p>La configurazione di un ambiente di sviluppo JavaScript per costruire i blocchi di Gutenberg si sviluppa in tre fasi:<\/p>\n<ol>\n<li><a href=\"#node-npm\">Installazione di Node.js e npm<\/a><\/li>\n<li><a href=\"#dev-environment\">Installazione dell&#8217;Ambiente di Sviluppo<\/a><\/li>\n<li><a href=\"#block-plugin\">Installazione del Plugin del Blocco<\/a><\/li>\n<\/ol>\n<p>Cominciamo.<\/p>\n<h3 id=\"node-npm\">1. Installare Node.js e npm<\/h3>\n<p>Prima di installare l&#8217;ambiente di sviluppo e registrare il vostro primo blocco, dovrete installare <a href=\"https:\/\/kinsta.com\/it\/blog\/node-js\/\">Node.js<\/a> e il gestore di pacchetti Node (npm).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> \u00e8 un runtime JavaScript costruito sul motore JavaScript V8 di Chrome. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, comunemente conosciuto come il gestore di pacchetti di Node, \u00e8 considerato &#8220;il pi\u00f9 grande registry di software del mondo.&#8221;<\/p>\n<\/aside>\n\n<p>Potete <a href=\"https:\/\/kinsta.com\/it\/blog\/come-installare-node-js\/\">installare Node.js e npm<\/a> in <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">diversi modi<\/a>. Ma prima dovreste controllare se il software \u00e8 gi\u00e0 installato sulla vostra macchina.<\/p>\n<p>Per farlo, avviate il terminale ed eseguite il seguente comando:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Se il risultato \u00e8 <code>command not found<\/code>, allora Node.js non \u00e8 installato sul vostro computer e potete procedere con l&#8217;installazione.<\/p>\n<p>Per questo articolo, abbiamo scelto l&#8217;opzione di installazione pi\u00f9 semplice, che \u00e8 il <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Tutto quello che dovete fare \u00e8 scaricare la versione corrispondente al vostro sistema operativo e lanciare la procedura di installazione guidata:<\/p>\n<figure id=\"attachment_105120\" aria-describedby=\"caption-attachment-105120\" style=\"width: 1974px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105120 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/nodejs-downloads.jpg\" alt=\"Pagina di download di Node.js.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">Pagina di download di Node.js.<\/figcaption><\/figure>\n<p>Una volta che avete installato Node.js, eseguite nuovamente il comando <code>node -v<\/code> nel terminale. Potete anche eseguire il comando <code>npm -v<\/code> per avere la conferma di avere anche il pacchetto npm.<\/p>\n<p>Ora siete equipaggiati con i seguenti strumenti:<\/p>\n<ul>\n<li>Il package runner di Node.js <code>npx<\/code> (<a href=\"https:\/\/nodejs.dev\/learn\/the-npx-nodejs-package-runner\">vedi la documentazione<\/a>). Questo vi permette di eseguire un comando <code>npm<\/code> senza doverlo installare prima.<\/li>\n<li>Il gestore di pacchetti di Node.js <code>npm<\/code> (<a href=\"https:\/\/docs.npmjs.com\/\">vedi la documentazione<\/a>). Questo viene utilizzato per installare le dipendenze ed eseguire gli script.<\/li>\n<\/ul>\n<p>Il passaggio successivo \u00e8 l&#8217;installazione dell&#8217;ambiente di sviluppo.<\/p>\n<h3 id=\"dev-environment\">2. Installare l&#8217;Ambiente di Sviluppo<\/h3>\n<p>Una volta che avete le ultime versioni di Node.js e npm sulla vostra macchina locale, avrete bisogno di un ambiente di sviluppo per WordPress.<\/p>\n<p>Potete utilizzare un ambiente di sviluppo locale come DevKinsta o utilizzare lo strumento ufficiale di WordPress. Diamo un&#8217;occhiata a entrambe le opzioni.<\/p>\n<h4 id=\"devkinsta\">Opzione 1: Ambiente di Sviluppo Locale (DevKinsta)<\/h4>\n<p>Con pochi click, potete <a href=\"https:\/\/kinsta.com\/it\/ebooks\/wordpress\/wordpress-sviluppo-locale\/\">installare WordPress in locale<\/a> utilizzando <a href=\"https:\/\/kinsta.com\/it\/devkinsta\/\">DevKinsta<\/a>, il nostro moderno strumento di sviluppo locale di WordPress. In alternativa, potete optare per un altro strumento di sviluppo locale, come <a href=\"https:\/\/kinsta.com\/it\/blog\/installare-wordpress-in-locale\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> o <a href=\"https:\/\/kinsta.com\/it\/blog\/installare-wordpress-in-locale\/#how-to-install-wordpress-locally-using-xampp\">XAMPP<\/a>:<\/p>\n<figure id=\"attachment_105122\" aria-describedby=\"caption-attachment-105122\" style=\"width: 2502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105122 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/dev-kinsta-create-new-site.jpg\" alt=\"Creare un nuovo sito WordPress in DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Creare un nuovo sito WordPress in DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Opzione 2: wp-env<\/h4>\n<p>Potete anche optare per lo <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">strumento ufficiale <code>wp-env<\/code><\/a>, che fornisce un ambiente di sviluppo locale di WordPress che pu\u00f2 essere lanciato direttamente dalla riga di comando. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">lo definisce come segue<\/a>:<\/p>\n<blockquote><p><em>Gli ambienti WordPress locali sono ora semplici come l&#8217;esecuzione di un singolo comando. <\/em><code><em>wp-env<\/em><\/code> <em>\u00e8 uno strumento a configurazione zero per ambienti WordPress locali privi di difficolt\u00e0. Fornisce decisioni sulle opzioni in modo che gli utenti possano far girare rapidamente WordPress senza perdere tempo. Infatti, l&#8217;obiettivo \u00e8 quello di rendere questi ambienti facilmente accessibili a tutti &#8211; sviluppatori, designer, manager, o chiunque altro.<\/em><\/p><\/blockquote>\n<p>Se decidete di fare un tentativo, l&#8217;installazione di <code>wp-env<\/code> richiede uno sforzo minimo. Basta seguire questi passaggi:<\/p>\n<h5>Passo 1: Verificare l&#8217;Installazione di Docker e Node.js<\/h5>\n<p>Per soddisfare i requisiti tecnici, dovrete prima installare sul vostro computer sia <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> che Node.js. Questo perch\u00e9 <code>wp-env<\/code> crea un&#8217;istanza di Docker che esegue un sito WordPress. Qualsiasi modifica apportata al codice si riflette immediatamente nell&#8217;istanza di WordPress.<\/p>\n<h5>Passo 2: Installare <code>@wordpress\/env<\/code> dalla Riga di Comando<\/h5>\n<p>Con Docker e Node.js in esecuzione, procedete e installate <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">l&#8217;ambiente di sviluppo<\/a> per WordPress.<\/p>\n<p>Potete installare <code>wp-env<\/code> sia a livello globale che locale. Per installarlo a livello globale, avrete bisogno di eseguire il seguente comando dall&#8217;interno della directory dei plugin (maggiori informazioni su questo punto nel box di avviso &#8220;Importante&#8221; qui sotto):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>Scomponiamo il tutto:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">installa il pacchetto<\/a>.<\/li>\n<li><code>-g<\/code> aggiunto al comando <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">installa globalmente il pacchetto specificato<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> \u00e8 il <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">pacchetto che state per installare<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Di default, su Mac o Linux <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">i pacchetti Node sono installati<\/a> in <strong>\/usr\/local\/lib\/node_modules<\/strong>.<\/p>\n<p>Se l&#8217;utente corrente non ha privilegi di scrittura su quella directory, verr\u00e0 emesso un errore EACCES. Si legga come <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">risolvere gli errori di autorizzazione EACCES quando si installano i pacchetti a livello globale<\/a>.<\/p>\n<\/aside>\n\n<p>Per verificare che <code>wp-env<\/code> \u00e8 stato installato correttamente, eseguite questo comando:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Dovreste vedere la versione corrente di <code>wp-env<\/code>, il che significa che ora potete lanciare l&#8217;ambiente con il seguente comando <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">dalla cartella del vostro plugin<\/a>:<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>\u00c8 possibile accedere alla bacheca di WordPress utilizzando questo indirizzo:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>Le credenziali predefinite sono le seguenti:<\/p>\n<ul>\n<li>Nome utente: <code>admin<\/code><\/li>\n<li>Password: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Installare il Plugin del Blocco<\/h3>\n<p>Ora avete bisogno di un plugin iniziale su cui costruire il blocco. Ma invece di creare manualmente un plugin di sviluppo con tutti i file e le cartelle necessarie, si pu\u00f2 semplicemente utilizzare uno strumento di sviluppo che fornisce tutti i file e le configurazioni necessarie per iniziare a sviluppare blocchi.<\/p>\n<p>Anche in questo caso, avete a disposizione un paio di soluzioni.<\/p>\n<h4 id=\"create-block\">Opzione 1: Installare un Plugin di Blocco con @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> \u00e8 lo strumento ufficiale a configurazione zero per creare blocchi Gutenberg:<\/p>\n<blockquote><p><em>Create Block \u00e8 la soluzione ufficiale per la registrazione di un blocco con un plugin WordPress. Offre una moderna configurazione di build che non richiede alcuna configurazione. Genera codice PHP, JS, CSS e tutto quello di cui avete bisogno per avviare il progetto.<\/em><\/p>\n<p>\u00c8 in gran parte ispirato a <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Complimenti a <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, a tutto il team di Facebook e alla comunit\u00e0 React.<\/p><\/blockquote>\n<p>Una volta che il vostro ambiente locale \u00e8 attivo, potrete configurare un blocco iniziale semplicemente eseguendo il <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">comando<\/a> <code>npx @wordpress\/create-block<\/code> e questo fornir\u00e0 tutti i file e le cartelle di cui avete bisogno per <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">creare l&#8217;impalcatura del plugin<\/a> e registrare un nuovo blocco.<\/p>\n<p>Facciamo un test per vedere come funziona.<\/p>\n<p>Dalla linea di comando, spostatevi nella directory <strong>\/wp-content\/plugins\/<\/strong> ed eseguite questo comando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>Quando vi viene chiesta conferma, inserite <code>y<\/code>:<\/p>\n<figure id=\"attachment_105124\" aria-describedby=\"caption-attachment-105124\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105124 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-my-first-block.jpg\" alt=\"Creare un blocco con @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Creare un blocco con @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Il processo impiega pochi istanti. Quando si sar\u00e0 concluso, vedrete la seguente risposta:<\/p>\n<figure id=\"attachment_105125\" aria-describedby=\"caption-attachment-105125\" style=\"width: 1134px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105125 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/wordpress-create-block-completed.jpg\" alt=\"Il plugin del blocco \u00e8 stato creato.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">Il plugin del blocco \u00e8 stato creato.<\/figcaption><\/figure>\n<p>E questo \u00e8 tutto!<\/p>\n<p>Ora lanciate il vostro ambiente di sviluppo WordPress e andate alla schermata dei <strong>plugin<\/strong> nella bacheca di WordPress. Dovrebbe essere stato aggiunto un nuovo plugin chiamato &#8220;My First Block&#8221; al vostro elenco di plugin:<\/p>\n<figure id=\"attachment_105126\" aria-describedby=\"caption-attachment-105126\" style=\"width: 1956px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105126 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/my-first-block-plugin.jpg\" alt=\"Il plugin del blocco \u00e8 stato installato con successo.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">Il plugin del blocco \u00e8 stato installato con successo.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se state usando lo strumento <code>wp-env<\/code> ed eseguite <code>wp-env start<\/code> dalla directory contenente il plugin, questo monter\u00e0 e attiver\u00e0 automaticamente il plugin. Se invece eseguite <code>wp-env start<\/code> da qualsiasi altra directory, verr\u00e0 creato un generico ambiente WordPress (vedi anche <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress Development Site<\/a>).<\/p>\n<\/aside>\n\n<p>Attivate il plugin se necessario, create un nuovo post, scorrete il pannello di inserimento dei blocchi fino alla sezione <strong>Widget<\/strong> e selezionate il vostro nuovo blocco:<\/p>\n<figure id=\"attachment_134071\" aria-describedby=\"caption-attachment-134071\" style=\"width: 2190px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134071\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Un blocco di esempio creato con @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Ora tornate al terminale e cambiate la directory corrente in <strong>my-first-block<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>Poi eseguite il comando:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Questo permette di eseguire il plugin in modalit\u00e0 di sviluppo. Per creare il codice di produzione, dovrete invece usare il comando:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Opzione 2: Configurare un Plugin di Blocco con create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> \u00e8 uno strumento di sviluppo di terze parti per la creazione di blocchi Gutenberg:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> \u00e8 uno strumento di sviluppo a configurazione zero (#0CJS) per sviluppare blocchi Gutenberg in WordPress in pochi minuti senza dover configurare React, webpack, ES6\/7\/8\/Next, ESLint, Babel, ecc.<\/em><\/p><\/blockquote>\n<p>Esattamente come lo strumento ufficiale <code>create-block<\/code>, <code>create-guten-block<\/code> \u00e8 basato su <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> e pu\u00f2 aiutarvi a generare il vostro primo plugin di blocco senza problemi.<\/p>\n<p>Il toolkit fornisce tutto il necessario per creare un moderno plugin per WordPress, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">compreso quanto segue<\/a>:<\/p>\n<blockquote>\n<ul>\n<li>Supporto della sintassi di React, JSX e ES6.<\/li>\n<li>Processo di build webpack di sviluppo\/produzione dietro le quinte.<\/li>\n<li>Extra del linguaggio oltre ES6 come l&#8217;operatore di object spread.<\/li>\n<li>CSS con prefisso automatico, quindi non avete bisogno di -webkit o altri prefissi.<\/li>\n<li>Uno script di compilazione per impacchettare JS, CSS e immagini per la produzione con le mappe di origine.<\/li>\n<li>Aggiornamenti senza problemi per gli strumenti di cui sopra con una sola dipendenza cgb-scripts.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Ma si noti il seguente avvertimento:<\/p>\n<blockquote><p><em>Il compromesso \u00e8 che questi strumenti sono preconfigurati per lavorare in un modo specifico. Se il vostro progetto ha bisogno di maggiore personalizzazione, potete &#8220;<a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">espellerlo&#8221;<\/a> e personalizzarlo, ma poi dovrete mantenere questa configurazione.<\/em><\/p><\/blockquote>\n<p>Una volta che avete un sito WordPress locale a portata di mano, lanciate il vostro strumento da linea di comando, spostatevi nella cartella <strong>\/wp-content\/plugins<\/strong> della vostra installazione ed eseguite questo comando:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Dovrete aspettare un minuto o due mentre viene creata la struttura del progetto e scaricate le dipendenze:<\/p>\n<figure id=\"attachment_105147\" aria-describedby=\"caption-attachment-105147\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105147 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block.jpg\" alt=\"Creare un blocco Gutenberg con create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Creare un blocco Gutenberg con create-guten-block.<\/figcaption><\/figure>\n<p>Quando il processo \u00e8 terminato, dovreste vedere la seguente schermata:<\/p>\n<figure id=\"attachment_105132\" aria-describedby=\"caption-attachment-105132\" style=\"width: 1130px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105132 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-complete.jpg\" alt=\"Blocco Gutenberg creato con successo con create-guten-block.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Blocco Gutenberg creato con successo con create-guten-block.<\/figcaption><\/figure>\n<p>L&#8217;immagine che segue mostra la struttura del progetto con il terminale in esecuzione in <a href=\"https:\/\/kinsta.com\/it\/blog\/migliori-editor-di-testo\/#visual-studio-code\">Visual Studio Code<\/a>:<\/p>\n<figure id=\"attachment_105133\" aria-describedby=\"caption-attachment-105133\" style=\"width: 2350px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105133 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-plugin-in-visual-studio-code.jpg\" alt=\"Il plugin di blocco in Visual Studio Code.\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">Il plugin di blocco in Visual Studio Code.<\/figcaption><\/figure>\n<p>Ora tornate alla vostra bacheca di WordPress. Dovrebbe essere stato aggiunto un nuovo elemento nell&#8217;elenco della schermata dei plugin &#8211; \u00e8 il plugin <strong>my-first-block:<\/strong><\/p>\n<figure id=\"attachment_105134\" aria-describedby=\"caption-attachment-105134\" style=\"width: 2136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105134 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/plugins-screen.jpg\" alt=\"La schermata dei plugin con un nuovo plugin creato con create-guten-block.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">La schermata dei plugin con un nuovo plugin creato con create-guten-block.<\/figcaption><\/figure>\n<p>Attivate il plugin e tornate al terminale. Cambiate la directory corrente in <strong>my-first-block<\/strong>, poi eseguite <code>npm start<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Dovreste avere la seguente risposta:<\/p>\n<figure id=\"attachment_105128\" aria-describedby=\"caption-attachment-105128\" style=\"width: 1129px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105128 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/npm-started.jpg\" alt=\"npm start.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm start.<\/figcaption><\/figure>\n<p>Questo, come dicevamo, vi permette di eseguire il plugin in modalit\u00e0 di sviluppo. Per creare il codice di produzione, dovrete usare:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Attivate il plugin e create un nuovo post o una nuova pagina, poi sfogliate i vostri blocchi e selezionate il vostro nuovo blocco Gutenberg:<\/p>\n<figure id=\"attachment_105136\" aria-describedby=\"caption-attachment-105136\" style=\"width: 2458px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105136 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/first-block-created-with-create-guten-block.jpg\" alt=\"Un nuovo blocco creato con create-guten-block.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Un nuovo blocco creato con create-guten-block.<\/figcaption><\/figure>\n<p>Per una panoramica pi\u00f9 approfondita o in caso di errori, fate riferimento alla <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">documentazione fornita da Ahmad Awais<\/a>.<\/p>\n<h2>Analisi dell&#8217;Impalcatura del Blocco di Avvio<\/h2>\n<p>Qualunque sia il dev-tool che scegliete, <code>create-block<\/code> o <code>create-guten-block<\/code>, ora avete un&#8217;impalcatura che potete usare come punto di partenza per costruire un plugin per il vostro blocco.<\/p>\n<p>Ma cos&#8217;\u00e8 esattamente <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">un&#8217;impalcatura del blocco<\/a> o &#8220;block scaffolding&#8221;?<\/p>\n<blockquote><p><em>Block scaffolding \u00e8 un termine abbreviato che descrive la struttura delle directory di supporto necessaria a WordPress per riconoscere un blocco. Normalmente questa directory contiene file come <strong>index.php<\/strong>, <strong>index.js<\/strong>, <strong>style.css<\/strong> e altri &#8211; che a loro volta contengono chiamate come <\/em><code><em>register_block_type<\/em><\/code><em>.<\/em><\/p><\/blockquote>\n<p>Abbiamo optato per il dev-tool ufficiale <strong>Create Block<\/strong>, in quanto <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">\u00e8 utilizzato nel Block Editor Handbook<\/a>. Ma, anche se decidete di usare uno strumento di terze parti come <code>create-guten-block<\/code>, la vostra esperienza non sar\u00e0 troppo diversa.<\/p>\n<p>Detto questo, analizziamo pi\u00f9 dettagliatamente il <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">tool <code>create-block<\/code><\/a>.<\/p>\n<h3>Uno Sguardo Pi\u00f9 da Vicino allo Strumento di Sviluppo Create Block<\/h3>\n<p>Come abbiamo detto in precedenza, <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> \u00e8 lo strumento ufficiale a riga di comando per creare blocchi Gutenberg. L&#8217;esecuzione di <code>@wordpress\/create-block<\/code> nel vostro terminale genera i file PHP, JS e SCSS e il codice necessario per registrare un nuovo tipo di blocco:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (opzionale) \u2014 usato per assegnare lo slug del blocco e installare il plugin<\/li>\n<li><code>[options]<\/code> (opzionale) \u2014 opzioni disponibili<\/li>\n<\/ul>\n<p>Di default viene assegnato un template <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a>. Questo significa che otterrete la <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">prossima versione di JavaScript<\/a>, con l&#8217;aggiunta della <a href=\"https:\/\/en.wikipedia.org\/wiki\/JSX_(JavaScript)\">sintassi JSX<\/a>.<\/p>\n<p>Se si omette il nome del blocco, il comando viene eseguito in modalit\u00e0 interattiva, permettendovi di personalizzare diverse opzioni prima di generare i file:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<figure id=\"attachment_133845\" aria-describedby=\"caption-attachment-133845\" style=\"width: 1684px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133845\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"Esecuzione di create-block in modalit\u00e0 interattiva.\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">Esecuzione di create-block in modalit\u00e0 interattiva.<\/figcaption><\/figure>\n<p>L&#8217;immagine qui sotto mostra la struttura del file di un plugin di blocco creato con lo strumento ufficiale Create Block:<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133848\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"File e cartelle di un plugin di blocco creato con @wordpress\/create-block.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">File e cartelle di un plugin di blocco creato con @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Detto questo, scorriamo i file e le cartelle principali del nostro nuovo plugin di blocco.<\/p>\n<h3 id=\"plugin-file\">Il File del Plugin<\/h3>\n<p>Con il file principale del plugin si <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registra il blocco sul server<\/a>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name:       Kinsta Academy Block\n * Plugin URI:        https:\/\/kinsta.com\/\n * Description:       An example block for Kinsta Academy students\n * Requires at least: 5.9\n * Requires PHP:      7.0\n * Version:           0.1.0\n * Author:            Kinsta Students\n * License:           GPL-2.0-or-later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       ka-example-block\n *\n * @package           ka-example-block\n *\/\n\n\/**\n * Registers the block using the metadata loaded from the `block.json` file.\n * Behind the scenes, it registers also all assets so they can be enqueued\n * through the block editor in the corresponding context.\n *\n * @see https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\n *\/\nfunction ka_example_block_ka_example_block_block_init() {\n\tregister_block_type( __DIR__ . '\/build' );\n}\nadd_action( 'init', 'ka_example_block_ka_example_block_block_init' );\n<\/code><\/pre>\n<p>La funzione <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registra un tipo di blocco sul server<\/a> usando i metadati memorizzati nel file <strong>block.json.<\/strong><\/p>\n<p>La funzione accetta due parametri:<\/p>\n<ul>\n<li>Il nome del tipo di blocco, incluso il namespace, o il percorso della cartella dove si trova il file <strong>block.json<\/strong>, o un oggetto <code>WP_Block_Type<\/code> completo<\/li>\n<li>Un array di argomenti del tipo di blocco<\/li>\n<\/ul>\n<p>Nel codice qui sopra, la <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">costante magica<\/a> <code>__DIR__<\/code> restituisce la cartella corrente. Ci\u00f2 significa che il file <strong>block.json<\/strong> risiede nella cartella <em>\/build<\/em>.<\/p>\n<h3 id=\"package-json\">Il file package.json<\/h3>\n<p>Il <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">file package.json<\/a> definisce le propriet\u00e0 e gli script JavaScript del vostro progetto. Qui \u00e8 dove potete installare le dipendenze del vostro progetto.<\/p>\n<p>Per capire meglio a cosa serve questo file, apritelo con il vostro <a href=\"https:\/\/kinsta.com\/it\/blog\/editor-html-gratuiti\/\">editor di codice preferito<\/a>:<\/p>\n<pre><code class=\"language-json\">{\n\t\"name\": \"ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"author\": \"Kinsta Students\",\n\t\"license\": \"GPL-2.0-or-later\",\n\t\"homepage\": \"https:\/\/kinsta.com\/\",\n\t\"main\": \"build\/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build\",\n\t\t\"format\": \"wp-scripts format\",\n\t\t\"lint:css\": \"wp-scripts lint-style\",\n\t\t\"lint:js\": \"wp-scripts lint-js\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"wp-scripts plugin-zip\",\n\t\t\"start\": \"wp-scripts start\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@wordpress\/scripts\": \"^24.1.0\"\n\t},\n\t\"dependencies\": {\n\t\t\"classnames\": \"^2.3.2\"\n\t}\n}<\/code><\/pre>\n<p>La <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">propriet\u00e0<\/a> <code>scripts<\/code> \u00e8 un <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">dizionario contenente i comandi<\/a> che vengono eseguiti in vari momenti del <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">ciclo di vita di un pacchetto<\/a> con <code>npm run [cmd]<\/code>.<\/p>\n<p>In questo articolo, useremo i <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">seguenti comandi<\/a>:<\/p>\n<ul>\n<li><code>npm run build<\/code> \u2014 crea una build di produzione (compressa)<\/li>\n<li><code>npm run start<\/code> o <code>npm start<\/code> \u2014 crea una build di sviluppo (non compressa)<\/li>\n<\/ul>\n<p><code>dependencies<\/code> e <code>devDependencies<\/code> sono due oggetti che mappano <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">il nome di un pacchetto a una versione<\/a>. Le <code>dependencies<\/code> sono richieste in produzione, mentre le <code>devDependences<\/code> sono necessarie solo per lo sviluppo locale (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">leggi di pi\u00f9<\/a>).<\/p>\n<p>L&#8217;unica dipendenza di sviluppo predefinita \u00e8 il pacchetto <code>@wordpress\/scripts<\/code>, che \u00e8 <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">definito come<\/a> &#8220;una raccolta di script riutilizzabili su misura per lo sviluppo di WordPress&#8221;.<\/p>\n<h3 id=\"block-json\">Il file block.json<\/h3>\n<p>A partire da WordPress 5.8, il <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">file dei metadati<\/a> <strong>block.json <\/strong>\u00e8 il <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-5-8\/#block-api-enhancements\">modo canonico per registrare i tipi di blocco<\/a>.<\/p>\n<p>Un file <strong>block.json<\/strong> offre diversi vantaggi, tra cui <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">prestazioni migliori<\/a> e una migliore visibilit\u00e0 nella <a href=\"https:\/\/wordpress.org\/plugins\/\">directory dei plugin di WordPress<\/a>:<\/p>\n<blockquote><p><em>Dal punto di vista delle prestazioni, quando i temi supportano il lazy loading delle risorse, i blocchi registrati con <strong>block.json<\/strong> avranno l&#8217;enqueuing ottimizzato nativamente. Le risorse CSS e JavaScript del frontend elencate nelle propriet\u00e0 <code>style<\/code> o <code>script<\/code> saranno messe in coda solo quando il blocco \u00e8 presente nella pagina, con conseguente riduzione delle dimensioni della pagina.<\/em><\/p><\/blockquote>\n<p>L&#8217;esecuzione del comando <code>@wordpress\/create-block<\/code> genera il seguente file <strong>block.json:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<p>Ecco l&#8217;elenco completo delle <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">propriet\u00e0 predefinite<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> \u2014 la versione dell&#8217;API usata dal blocco (la versione attuale \u00e8 la 2)<\/li>\n<li><code>name<\/code> \u2014 un identificatore univoco per un blocco che include un namespace<\/li>\n<li><code>version<\/code> \u2014 la versione corrente di un blocco<\/li>\n<li><code>title<\/code> \u2014 il titolo del blocco<\/li>\n<li><code>category<\/code> \u2014 una categoria di blocco<\/li>\n<li><code>icon<\/code> \u2014 uno slug <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a> o un&#8217;icona SVG personalizzata<\/li>\n<li><code>description<\/code> \u2014 una breve descrizione visibile nel block inspector<\/li>\n<li><code>supports<\/code> \u2014 un insieme di opzioni per controllare le funzionalit\u00e0 usate nell&#8217;editor<\/li>\n<li><code>textdomain<\/code> \u2014 il text-domain del plugin<\/li>\n<li><code>editorScript<\/code> \u2014 definizione dello script dell&#8217;editor<\/li>\n<li><code>editorStyle<\/code> \u2014 definizione dello stile dell&#8217;editor<\/li>\n<li><code>style<\/code> \u2014 fornisce stili alternativi per un blocco<\/li>\n<\/ul>\n<p>Oltre alle propriet\u00e0 elencate qui sopra, potete (e probabilmente lo farete) definire un oggetto <code>attributes<\/code> che fornisce informazioni sui dati memorizzati dal vostro blocco. Nel vostro <strong>block.json<\/strong> potete impostare un numero arbitrario di attributi in coppie <em>chiave\/valore<\/em>, dove la chiave \u00e8 il nome dell&#8217;attributo e il valore \u00e8 la definizione dell&#8217;attributo.<\/p>\n<p>Ecco un esempio di definizione di attributi:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"array\",\n\t\t\"source\": \"children\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"link\": { \n\t\t\"type\": \"string\", \n\t\t\"default\": \"https:\/\/kinsta.com\" \n\t}\n},<\/code><\/pre>\n<p>Analizzeremo pi\u00f9 a fondo il file <strong>block.json<\/strong> <a href=\"#block-json-at-work\">pi\u00f9 avanti nell&#8217;articolo<\/a>, ma potreste anche dare un&#8217;occhiata al Block Editor Handbook per informazioni pi\u00f9 dettagliate sui <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadati<\/a> e sugli <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributi<\/a> del file <strong>block.json<\/strong>.<\/p>\n<h3 id=\"src-folder\">La Cartella src<\/h3>\n<p>La cartella <code>src<\/code> \u00e8 il posto avviene lo sviluppo. In questa cartella troverete i seguenti file:<\/p>\n<ul>\n<li><strong>index.js<\/strong><\/li>\n<li><strong>edit.js<\/strong><\/li>\n<li><strong>save.js<\/strong><\/li>\n<li><strong>editor.scss<\/strong><\/li>\n<li><strong>style.scss<\/strong><\/li>\n<\/ul>\n<h4>index.js<\/h4>\n<p>Il file <strong>index.js<\/strong> \u00e8 il vostro punto di partenza. Qui importerete le dipendenze e registrerete il tipo di blocco sul client:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from '@wordpress\/blocks';\n\nimport '.\/style.scss';\n\nimport Edit from '.\/edit';\nimport save from '.\/save';\nimport metadata from '.\/block.json';\n\nregisterBlockType( metadata.name, {\n\t\/**\n\t * @see .\/edit.js\n\t *\/\n\tedit: Edit,\n\n\t\/**\n\t * @see .\/save.js\n\t *\/\n\tsave,\n} );<\/code><\/pre>\n<p>La prima dichiarazione importa la funzione <code>registerBlockType<\/code> dal <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">pacchetto<\/a> <code>@wordpress\/blocks<\/code>. Le successive <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">dichiarazioni<\/a> importano il foglio di stile e le funzioni <code>Edit<\/code> e <code>save<\/code>.<\/p>\n<p>La funzione <code>registerBlockType<\/code> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">registra il componente sul client<\/a>. La funzione accetta due parametri: un nome <code>namespace\/block-name<\/code> (lo stesso registrato sul server) e un oggetto di configurazione del blocco.<\/p>\n<p>La funzione <code>Edit<\/code> fornisce l&#8217;interfaccia del blocco come viene resa nell&#8217;editor di blocchi, mentre la funzione <code>save<\/code> fornisce la struttura che sar\u00e0 serializzata e salvata nel database (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">leggi di pi\u00f9<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p><strong>edit.js<\/strong> \u00e8 il file dove costruirete l&#8217;interfaccia di amministrazione del blocco:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p {...useBlockProps()}&gt;\n\t\t\t{__('My First Block \u2013 hello from the editor!', 'my-first-block')}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Per prima cosa, questo importa la funzione <code>__<\/code> dal pacchetto <code>@wordpress\/i18n<\/code> (questo pacchetto contiene una versione JavaScript delle funzioni di traduzione), <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">l&#8217;hook React<\/a> <code><a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">useBlockProps<\/a><\/code> e il file <code>editor.scss<\/code>.<\/p>\n<p>Quindi esporta il componente React (si legga di pi\u00f9 sulle dichiarazioni di <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">importazione<\/a> ed <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">esportazione<\/a>).<\/p>\n<h4>save.js<\/h4>\n<p>Il file <strong>save.js<\/strong> \u00e8 dove costruiamo la struttura del blocco da salvare nel database:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\n\nexport default function save() {\n\treturn (\n\t\t&lt;p {...useBlockProps.save()}&gt;\n\t\t\t{__(\n\t\t\t\t'My First Block \u2013 hello from the saved content!',\n\t\t\t\t'my-first-block'\n\t\t\t)}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<h4>editor.scss e style.scss<\/h4>\n<p>Oltre agli script, due file <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a> risiedono nelle cartelle <strong>src<\/strong>. Il file <strong>editor.scss<\/strong> contiene gli stili applicati al blocco nel contesto dell&#8217;editor, mentre il file <strong>style.scss<\/strong> contiene gli stili del blocco per la visualizzazione sia nel frontend che nell&#8217;editor. Approfondiremo questi file nella seconda parte di questa guida.<\/p>\n<h3 id=\"node_modules-build\">Le Cartelle node_modules e build<\/h3>\n<p>La cartella <code>node_modules<\/code> contiene i moduli di node e le rispettive dipendenze. Non analizzeremo nel dettaglio i pacchetti di node perch\u00e9 \u00e8 al di l\u00e0 dello scopo di questo articolo, ma potrete approfondire il discorso in <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">questo articolo che spiega dove vengono installati i pacchetti con npm<\/a>.<\/p>\n<p>La cartella <code>build<\/code> contiene i file JS e CSS risultanti dal processo di build. Potete approfondire il processo di build nelle guide <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext syntax<\/a> e <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">JavaScript Build Setup<\/a>.<\/p>\n<h2>Il Progetto: il Nostro Primo Blocco Gutenberg<\/h2>\n<p>\u00c8 ora di sporcarsi le mani. In questa sezione spieghiamo come creare un plugin che fornisce un blocco CTA chiamato Kinsta Academy Block.<\/p>\n<p>Il blocco sar\u00e0 composto da due colonne, con un&#8217;immagine a sinistra e un paragrafo di testo a destra. Un pulsante con un link personalizzabile sar\u00e0 posizionato sotto il testo:<\/p>\n<figure id=\"attachment_137853\" aria-describedby=\"caption-attachment-137853\" style=\"width: 1502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-137853 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/custom-block-final-2.jpg\" alt=\"Il tipo di blocco che creiamo in questa guida.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">Il tipo di blocco che creiamo in questa guida.<\/figcaption><\/figure>\n<p>\u00c8 solo un semplice esempio, ma ci permetter\u00e0 di acquisire le basi dello sviluppo dei blocchi di Gutenberg. Una volta che avrete una chiara comprensione dei concetti di base, potrete proseguire in autonomia e creare blocchi Gutenberg sempre pi\u00f9 complessi, con l&#8217;aiuto del <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Block Editor Handbook<\/a> e tutte le altre numerose risorse disponibili in rete.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Il codice degli esempi forniti in questo tutorial \u00e8 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">disponibile su Gist<\/a> come riferimento.<\/p>\n<\/aside>\n\n<p>Supponendo che abbiate l&#8217;ultima versione di WordPress in esecuzione sul vostro ambiente di sviluppo locale, ecco cosa imparerete da qui in avanti:<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">Come Installare il Plugin del Blocco di Avvio<\/a><\/li>\n<li><a href=\"#block-json-at-work\">Il File block.json al Lavoro<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Usare i Componenti Incorporati: Il Componente RichText<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">Aggiungere Controlli alla Barra degli Strumenti del Blocco<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Personalizzare la Sidebar delle Impostazioni del Blocco<\/a><\/li>\n<li><a href=\"#external-link\">Aggiungere e Personalizzare un Link Esterno<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">Aggiungere Stili di Blocco Multipli<\/a><\/li>\n<li><a href=\"#innerblocks-component\">Annidare i Blocchi con il Componente InnerBlocks<\/a><\/li>\n<li><a href=\"#additional-improvements\">Altri Miglioramenti<\/a><\/li>\n<\/ul>\n<p>Pronti&#8230; via!<\/p>\n<h3 id=\"set-up-the-plugin\">Come Installare il Plugin del Blocco di Avvio<\/h3>\n<p>Lanciate il vostro tool a riga di comando e spostatevi nella cartella <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<figure id=\"attachment_105130\" aria-describedby=\"caption-attachment-105130\" style=\"width: 1224px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105130 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/new-terminal-at-folder.jpg\" alt=\"New terminal at folder in Mac OS.\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">New terminal at folder in Mac OS.<\/figcaption><\/figure>\n<p>Ora eseguite il seguente comando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Questo comando genera i file PHP, SCSS e JS per la registrazione di un blocco in modalit\u00e0 interattiva, permettendovi di aggiungere facilmente i dati necessari al vostro blocco. Per il nostro esempio useremo i seguenti dati:<\/p>\n<ul>\n<li><strong>Template variant<\/strong>: static<\/li>\n<li><strong>Block slug<\/strong>: ka-example-block<\/li>\n<li><strong>Internal namespace<\/strong>: ka-example-block<\/li>\n<li><strong>Block display title<\/strong>: Kinsta Academy Block<\/li>\n<li><strong>Short block description<\/strong>: An example block for Kinsta Academy students<\/li>\n<li><strong>Dashicon<\/strong>: superhero-alt<\/li>\n<li><strong>Category name<\/strong>: widgets<\/li>\n<li><strong>Do you want to customize the WordPress plugin?<\/strong>: yes<\/li>\n<li><strong>The home page of the plugin<\/strong>: https:\/\/kinsta.com\/<\/li>\n<li><strong>Current plugin version<\/strong>: 0.1.0<\/li>\n<li><strong>Plugin author<\/strong>: your name<\/li>\n<li><strong>License<\/strong>: &#8211;<\/li>\n<li><strong>Link to the license text<\/strong>: &#8211;<\/li>\n<li><strong>Custom domain path for translations<\/strong>: &#8211;<\/li>\n<\/ul>\n<p>L&#8217;installazione del plugin e di tutte le dipendenze richiede un paio di minuti. Quando il processo sar\u00e0 terminato, vedrete la seguente risposta:<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134076\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"Il blocco \u00e8 stato installato e registrato per lo sviluppo.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">Il blocco \u00e8 stato installato e registrato per lo sviluppo.<\/figcaption><\/figure>\n<p>Ora eseguite questo comando dalla cartella <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd ka-example-block<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se state lavorando con l&#8217;ambiente di WordPress, dovrete prima lanciare Docker Desktop, poi eseguire <code>wp-env start<\/code> dall&#8217;interno della cartella del vostro plugin.<\/p>\n<p>A questo punto potete digitare <em>http:\/\/localhost:8888\/wp-login<\/em> nella barra degli indirizzi del vostro browser web e usare <strong>Username: admin<\/strong> e <strong>Password: password<\/strong> per accedere alla bacheca di WordPress.<\/p>\n<\/aside>\n\n<figure id=\"attachment_105184\" aria-describedby=\"caption-attachment-105184\" style=\"width: 2508px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105184 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/visual-studio-code-terminal.jpg\" alt=\"Esecuzione di comandi dal terminale di Visual Studio Code.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">Esecuzione di comandi dal terminale di Visual Studio Code.<\/figcaption><\/figure>\n<p>Infine, dalla cartella del vostro plugin (<strong>ka-example-block<\/strong> nel nostro esempio), potete avviare lo sviluppo con:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Ora aprite la schermata dei plugin e attivate il plugin <strong>Kinsta Academy Block<\/strong>:<\/p>\n<figure id=\"attachment_133866\" aria-describedby=\"caption-attachment-133866\" style=\"width: 2214px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133866\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/plugins-screen.jpg\" alt=\"Attivazione del blocco di esempio\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Attivazione del blocco di esempio<\/figcaption><\/figure>\n<p>Create un nuovo post, aprite il block inserter e scorrete fino alla categoria <strong>Design<\/strong>. Quindi fate clic per aggiungere il blocco:<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133869\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"Un blocco di avvio creato con @wordpress\/create-block.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Un blocco di avvio creato con @wordpress\/create-block.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">Il File block.json al Lavoro<\/h3>\n<p>Come abbiamo detto in precedenza, la registrazione del blocco lato server avviene nel file <strong>.php<\/strong> principale. Tuttavia, non definiremo le impostazioni nel file <strong>.php<\/strong>, ma useremo il file <strong>block.json.<\/strong><\/p>\n<p>Quindi aprite di nuovo <strong>block.json<\/strong> e diamo un&#8217;occhiata pi\u00f9 da vicino alle impostazioni predefinite:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<h4>Script e Stili<\/h4>\n<p>Le propriet\u00e0 <code>editorScript<\/code>, <code>editorStyle<\/code> e <code>style<\/code> forniscono i percorsi relativi agli script e agli stili del frontend e del backend.<\/p>\n<p>Non \u00e8 necessario registrare manualmente gli script e gli stili definiti qui perch\u00e9 questi sono automaticamente registrati e accodati da WordPress. Per provarlo, lanciate l&#8217;inspector del browser e aprite la scheda <strong>Network:<\/strong><\/p>\n<figure id=\"attachment_133870\" aria-describedby=\"caption-attachment-133870\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133870\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Ispezione delle risorse in Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Ispezione delle risorse in Chrome DevTools.<\/figcaption><\/figure>\n<p>Come si vede dall&#8217;immagine qui sopra, il nostro script <strong>index.js<\/strong> che risiede nella cartella <strong>build<\/strong> \u00e8 stato regolarmente accodato <strong>senza dover aggiungere alcun codice PHP<\/strong>.<\/p>\n<h4>Etichette di UI<\/h4>\n<p>Le propriet\u00e0 <code>title<\/code> e <code>description<\/code> forniscono le etichette necessarie per identificare il blocco nell&#8217;editor:<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133871\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Nome del blocco e descrizione nella sidebar del blocco.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Nome del blocco e descrizione nella sidebar del blocco.<\/figcaption><\/figure>\n<h4>Keyword<\/h4>\n<p>Come abbiamo detto, \u00e8 possibile configurare dettagliatamente le impostazioni del blocco usando <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">propriet\u00e0<\/a> e <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributi<\/a>. Ad esempio, \u00e8 possibile aggiungere una o pi\u00f9 <code>keywords<\/code> per aiutare gli utenti a cercare i blocchi:<\/p>\n<pre><code class=\"language-json\">\"keywords\": [ \n\t\t\"kinsta\", \n\t\t\"academy\", \n\t\t\"superhero\" \n\t],<\/code><\/pre>\n<p>Se ora inserite &#8220;kinsta&#8221;, &#8220;academy&#8221; o &#8220;superhero&#8221; nel pannello di inserimento rapido dei blocchi, l&#8217;editor vi suggerir\u00e0 il blocco custom:<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133969\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"Ricerca di un blocco con una parola chiave nel pannello di inserimento rapido.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">Ricerca di un blocco con una parola chiave nel pannello di inserimento rapido.<\/figcaption><\/figure>\n<h4>Localizzazione<\/h4>\n<p>Se vi state chiedendo come avviene la localizzazione delle stringhe nel file JSON, ecco <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">la risposta<\/a>:<\/p>\n<blockquote><p><em>In JavaScript, ora si pu\u00f2 usare il metodo <code>registerBlockTypeFromMetadata<\/code> dal pacchetto <code>@wordpress\/blocks<\/code> per registrare un tipo di blocco usando i metadati caricati dal file <strong>block.json. <\/strong>Tutte le propriet\u00e0 localizzate vengono automaticamente avvolte in chiamate di funzione <code>_x<\/code> (dal pacchetto <code>@wordpress\/i18n<\/code>) come avviene in PHP con <code>register_block_type_from_metadata<\/code>. L&#8217;unico requisito \u00e8 la propriet\u00e0 <code>textdomain<\/code> nel file <strong>block.json.<\/strong><\/em><\/p><\/blockquote>\n<p>Qui utilizziamo la funzione <code>registerBlockType<\/code> invece di <code>registerBlockTypeFromMetadata<\/code>, dato che quest&#8217;ultima \u00e8 <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">stata deprecata<\/a> a partire da <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a>, ma il meccanismo \u00e8 lo stesso.<\/p>\n<h3 id=\"using-richtext-component\">Usare i Componenti Incorporati: Il Componente RichText<\/h3>\n<p>Gli elementi che compongono un blocco Gutenberg sono componenti React e si pu\u00f2 accedere a questi componenti tramite la variabile globale <code>wp<\/code>. Ad esempio, provate a digitare <code>wp.editor<\/code> nella console del vostro browser. Questo vi dar\u00e0 l&#8217;elenco completo dei componenti inclusi nel modulo <code>wp.editor<\/code>.<\/p>\n<p>Scorrete la lista e provate a indovinare a cosa servono i componenti dai rispettivi nomi.<\/p>\n<p>Allo stesso modo, potete scorrere la lista dei componenti inclusi nel modulo <code>wp.components<\/code>:<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133970\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"WP components\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">WP components<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La <strong>programmazione modulare<\/strong> \u00e8 una tecnica di progettazione del software che enfatizza la separazione delle funzionalit\u00e0 di un programma in <strong>moduli<\/strong> indipendenti e intercambiabili, in modo tale che ciascuno contenga tutto il necessario per eseguire un solo aspetto della funzionalit\u00e0 desiderata (Fonte: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>).<\/p>\n<\/aside>\n\n<p>Ora torniamo al file <strong>edit.js<\/strong> e diamo un&#8217;occhiata pi\u00f9 da vicino allo script:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p { ...useBlockProps() }&gt;\n\t\t\t{ __(\n\t\t\t\t'Kinsta Academy Block \u2013 hello from the editor!',\n\t\t\t\t'ka-example-block'\n\t\t\t) }\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Questo codice genera un blocco statico con un testo semplice e non modificabile. Ma possiamo cambiare le cose facilmente:<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133971\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"Il blocco iniziale nell'editor di codice.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">Il blocco iniziale nell&#8217;editor di codice.<\/figcaption><\/figure>\n<p>Per rendere il testo modificabile dovrete sostituire l&#8217;attuale tag <code>&lt;p&gt;<\/code> con un componente che renda <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">modificabile il contenuto dell&#8217;input<\/a>. Per questo, Gutenberg fornisce il <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">componente integrato RichText<\/a>.<\/p>\n<p>Aggiungere un componente integrato ad un blocco richiede 5 passaggi:<\/p>\n<ol>\n<li><a href=\"#import-components\">Importazione dei Componenti Necessari da un Pacchetto WordPress<\/a><\/li>\n<li><a href=\"#jsx-elements\">Inserimento degli Elementi Corrispondenti nel Codice JSX<\/a><\/li>\n<li><a href=\"#define-attributes\">Definizione degli Attributi Necessari nel File block.json<\/a><\/li>\n<li><a href=\"#define-event-handlers\">Definizione degli Event Handler<\/a><\/li>\n<li><a href=\"#save-data\">Salvataggio dei Dati<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Passo 1: Importazione dei Componenti Necessari da un Pacchetto WordPress<\/h4>\n<p>Ora aprite il file <strong>edit.js<\/strong> e cambiate la seguente dichiarazione <code>import<\/code>:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>nella seguente:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>In questo modo, importiamo la funzione <code>useBlockProps<\/code> e il componente <code>RichText<\/code> dal pacchetto <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p>L&#8217;hook React <code><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">useBlockProps<\/a><\/code> contrassegna <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">l&#8217;elemento wrapper del blocco<\/a>:<\/p>\n<blockquote><p><em>Quando si utilizzano le API versione 2, \u00e8 necessario utilizzare il nuovo hook <\/em><code><em>useBlockProps<\/em><\/code> <em>nella funzione <\/em><code><em>edit<\/em><\/code><em> per contrassegnare l&#8217;elemento wrapper del blocco. L&#8217;hook inserir\u00e0 gli attributi e gli event handler necessari per abilitare il comportamento del blocco. Qualsiasi attributo che vuoi passare all&#8217;elemento del blocco deve essere passato attraverso <\/em><code><em>useBlockProps<\/em><\/code> <em>e il valore restituito deve essere distribuito sull&#8217;elemento.<\/em><\/p><\/blockquote>\n<p>Per spiegare le cose in modo semplice, <code>useBlockProps<\/code> assegna automaticamente attributi e classi all&#8217;elemento wrapper (l&#8217;elemento <code>p<\/code> nel nostro esempio):<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133973\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"Elementi e classi generati da useBlockProps.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Elementi e classi generati da useBlockProps.<\/figcaption><\/figure>\n<p>Se si rimuove <code>useBlockProps<\/code> dall&#8217;elemento wrapper, si avr\u00e0 una semplice stringa di testo senza accesso alle funzionalit\u00e0 e allo stile del blocco:<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-133974\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"Lo stesso blocco senza useBlockProps.\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">Lo stesso blocco senza useBlockProps.<\/figcaption><\/figure>\n<p>Come <a href=\"#additional-improvements\">spiegheremo pi\u00f9 avanti<\/a>, potete anche passare a <code>useBlockProps<\/code> un oggetto di propriet\u00e0 per personalizzare l&#8217;output.<\/p>\n<h5>RichText<\/h5>\n<p>Il componente RichText fornisce un input <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">contenteditable<\/a>, permettendo agli utenti di modificare e formattare il contenuto.<\/p>\n<p>Il componente \u00e8 documentato su GitHub all&#8217;indirizzo <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">gutenberg\/packages\/block-editor\/src\/components\/rich-text\/README.md<\/a>.<\/p>\n<h4 id=\"jsx-elements\">Passo 2: Inserimento degli Elementi Corrispondenti nel Codice JSX<\/h4>\n<pre><code class=\"language-jsx\">...\n\nconst blockProps = useBlockProps();\n\nreturn (\n\t&lt;RichText \n\t\t{ ...blockProps }\n\t\ttagName=\"p\"\n\t\tonChange={ onChangeContent }\n\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\tvalue={ attributes.content }\n\t\tplaceholder={ __( 'Write your text...' ) }\n\t\/&gt;\n);<\/code><\/pre>\n<p>Commentiamo il codice riga per riga:<\/p>\n<ul>\n<li><code>tagName<\/code> \u2014 il nome del tag dell&#8217;elemento HTML modificabile<\/li>\n<li><code>onChange<\/code> \u2014 funzione invocata quando cambia il contenuto dell&#8217;elemento<\/li>\n<li><code>allowedFormats<\/code> \u2014 un array di formati consentiti. Per impostazione predefinita, tutti i formati sono consentiti<\/li>\n<li><code>value<\/code> \u2014 la stringa HTML da rendere modificabile<\/li>\n<li><code>placeholder<\/code> \u2014 testo segnaposto da mostrare quando l&#8217;elemento \u00e8 vuoto<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Passo 3: Definizione degli Attributi Necessari nel File block.json<\/h4>\n<p>Gli <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributi<\/a> forniscono informazioni sui dati memorizzati da un blocco, come il rich content, il colore di sfondo, gli URL, ecc.<\/p>\n<p>\u00c8 possibile impostare un numero arbitrario di attributi all&#8217;interno di un oggetto <code>attributes<\/code> in coppie chiave\/valore, dove la chiave \u00e8 il nome dell&#8217;attributo e il valore \u00e8 la definizione dell&#8217;attributo.<\/p>\n<p>Ora aprite il file <strong>block.json<\/strong> e aggiungete la seguente propriet\u00e0 <code>attributes<\/code>:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t}\n},<\/code><\/pre>\n<p>L&#8217;attributo <code>content<\/code> permette di memorizzare il testo digitato dall&#8217;utente nel campo editabile:<\/p>\n<ul>\n<li><code>type<\/code> indica il tipo di dati memorizzati dall&#8217;attributo. Il tipo \u00e8 richiesto a meno che non si definisca una propriet\u00e0 <code>enum<\/code>.<\/li>\n<li><code>source<\/code> definisce il modo in cui il valore dell&#8217;attributo viene estratto dal contenuto del post. Nel nostro esempio, si tratta del contenuto HTML. Si noti che, se non viene fornita una propriet\u00e0 source, i dati saranno memorizzati nel delimitatore di blocco (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">leggi tutto<\/a>).<\/li>\n<li><code>selector<\/code> \u00e8 un tag HTML o qualsiasi altro selettore, come il nome di una classe o un attributo id.<\/li>\n<\/ul>\n<p>Passeremo alla funzione <code>Edit<\/code> un oggetto di propriet\u00e0. Quindi tornate al file <strong>edit.js<\/strong> e fate la seguente modifica:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Passo 4: Definizione degli Event Handler<\/h4>\n<p>L&#8217;elemento <code>RichText<\/code> ha un attributo <code>onChange<\/code>, che fornisce una funzione da invocare quando il contenuto dell&#8217;elemento cambia.<\/p>\n<p>Definiamo questa funzione e vediamo l&#8217;intero script <strong>edit.js:<\/strong><\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\n\treturn (\n\t\t&lt;RichText \n\t\t\t{ ...blockProps }\n\t\t\ttagName=\"p\"\n\t\t\tonChange={ onChangeContent }\n\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\tvalue={ attributes.content }\n\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Ora salvate il file ed eseguite <code>npm run start<\/code> nella finestra di terminale. Poi tornate alla bacheca di WordPress, create un nuovo articolo o pagina e aggiungete il vostro blocco:<\/p>\n<figure id=\"attachment_134001\" aria-describedby=\"caption-attachment-134001\" style=\"width: 2618px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134001\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/rich-text-component.jpg\" alt=\"L'output del componente RichText nel Block Editor.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">L&#8217;output del componente RichText nel Block Editor.<\/figcaption><\/figure>\n<p>Aggiungete del testo e passate alla vista Codice. Ecco come dovrebbe apparire il vostro codice:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\"&gt;Kinsta Academy Block \u2013 hello from the saved content!&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<p>Se ora salvate la pagina e controllate il risultato nel frontend, potreste rimanere un po&#8217; delusi perch\u00e9 le vostre modifiche non avranno avuto effetto sul sito. Questo perch\u00e9 dobbiamo ancora modificare il file <strong>save.js<\/strong> per memorizzare l&#8217;input dell&#8217;utente nel database quando il post viene salvato.<\/p>\n<h4 id=\"save-data\">Passo 5: Salvataggio dei Dati<\/h4>\n<p>Ora aprite il file <strong>save.js<\/strong> e cambiate lo script come segue:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Questo \u00e8 quello che stiamo facendo qui:<\/p>\n<ul>\n<li>Importiamo il componente <code>RichText<\/code> dal pacchetto <code>block-editor<\/code>.<\/li>\n<li>Passiamo diverse propriet\u00e0 attraverso un argomento oggetto alla funzione <code>save<\/code> (in questo esempio, stiamo passando solo la propriet\u00e0 <code><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\">attributes<\/a><\/code>)<\/li>\n<li>Viene restituito il contenuto del componente <code>RichText<\/code><\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Ogni volta che cambiate la funzione save, \u00e8 necessario cancellare qualsiasi istanza del blocco presente nell&#8217;area dell&#8217;editor e inserirlo di nuovo per vederlo funzionare correttamente. Si legga di pi\u00f9 sulla <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">convalida dei blocchi<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_134002\" aria-describedby=\"caption-attachment-134002\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134002\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-content-in-the-code-editor.jpg\" alt=\"Il contenuto del blocco \u00e8 stato salvato nel database.\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">Il contenuto del blocco \u00e8 stato salvato nel database.<\/figcaption><\/figure>\n<p>Per altre info sul componente <code>RichText<\/code>, potrete fare riferimento al <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Block Editor Handbook<\/a> e all&#8217;<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">elenco completo delle propriet\u00e0 su Github<\/a>.<\/p>\n<p>Ora facciamo un passo avanti. Nella prossima sezione, scopriremo come aggiungere controlli alla barra degli strumenti del blocco.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">Aggiungere Controlli alla Barra degli Strumenti del Blocco<\/h3>\n<p>La <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">barra degli strumenti dei blocchi<\/a> contiene un insieme di controlli che permettono agli utenti di manipolare porzioni di contenuto del blocco. Troverete un componente per ogni controllo della barra degli strumenti:<\/p>\n<figure id=\"attachment_134007\" aria-describedby=\"caption-attachment-134007\" style=\"width: 1212px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134007\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/paragraph-toolbar.jpg\" alt=\"La barra degli strumenti del blocco core paragrafo.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">La barra degli strumenti del blocco core paragrafo.<\/figcaption><\/figure>\n<p>Ad esempio, potreste aggiungere un controllo di allineamento del testo per il vostro blocco. Tutto quello che dovete fare \u00e8 importare due componenti dal pacchetto <code>@wordpress\/block-editor<\/code>.<\/p>\n<p>Seguiremo gli stessi passi dell&#8217;esempio precedente:<\/p>\n<ol>\n<li>Importazione dei Componenti Necessari da un Pacchetto WordPress<\/li>\n<li>Inserimento degli Elementi Corrispondenti nel Codice JSX<\/li>\n<li>Definizione degli Attributi Necessari nel File <strong>block.json<\/strong><\/li>\n<li>Definizione degli Event Handler<\/li>\n<li>Salvataggio dei Dati<\/li>\n<\/ol>\n<h4>Passo 1: Importazione dei componenti BlockControls e AlignmentControl da @wordpress\/block-editor<\/h4>\n<p>Per aggiungere un controllo di allineamento alla barra degli strumenti del blocco, avete bisogno di due componenti:<\/p>\n<ul>\n<li><code>BlockControls<\/code> genera una barra degli strumenti dinamica di controlli (non documentato).<\/li>\n<li><code>AlignmentControl<\/code> genera un menu a discesa che visualizza le opzioni di allineamento per il blocco selezionato (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">leggi di pi\u00f9<\/a>)<\/li>\n<\/ul>\n<p>Aprite il file <strong>edit.js<\/strong> e modificate la dichiarazione <code>import<\/code> come mostrato di seguito:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls \n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Passo 2: Aggiungere gli Elementi BlockControls e AlignmentControl al Codice JSX<\/h4>\n<p>Andate alla funzione <code>Edit<\/code> e inserite l&#8217;elemento <code>&lt;BlockControls \/&gt;<\/code> allo stesso livello di <code>&lt;RichText \/&gt;<\/code>. Poi aggiungete <code>&lt;AlignmentControl \/&gt;<\/code> all&#8217;interno di <code>&lt;BlockControls \/&gt;<\/code>:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Nel codice qui sopra, <code>&lt;&gt;<\/code> e <code>&lt;\/&gt;<\/code> sono la sintassi breve per dichiarare i <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">frammenti React<\/a>, che sono il modo in cui vengono restituti elementi multipli in React.<\/p>\n<p>In questo esempio, <code>AlignmentControl<\/code> ha due attributi:<\/p>\n<ul>\n<li><code>value<\/code> fornisce il valore corrente dell&#8217;elemento<\/li>\n<li><code>onChange<\/code> fornisce un <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">event handler<\/a> da eseguire quando il valore cambia<\/li>\n<\/ul>\n<p>Abbiamo anche definito altri attributi per l&#8217;elemento <code>RichText<\/code> (si veda la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">lista completa degli attributi con esempi<\/a>)<\/p>\n<h4>Passo 3: Definizione dell&#8217;Attributo align in block.json<\/h4>\n<p>Ora tornate al file <strong>block.json<\/strong> e aggiungete l&#8217;attributo <code>align<\/code>:<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>Tornate all&#8217;editor di blocchi, aggiornate la pagina e selezionate il blocco. Dovrebbe essere visualizzato un messaggio di errore all&#8217;interno del blocco.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134008\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt=\"Il blocco mostra un messaggio di errore.\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">Il blocco mostra un messaggio di errore.<\/figcaption><\/figure>\n<p>Il motivo \u00e8 che non abbiamo ancora definito il nostro event handler.<\/p>\n<h4>Passo 4: Definizione degli Event Handler<\/h4>\n<p>Ora definite <code>onChangeAlign<\/code>:<\/p>\n<pre><code class=\"language-js\">const onChangeAlign = ( newAlign ) =&gt; {\n\tsetAttributes( { \n\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t} )\n}<\/code><\/pre>\n<p>Se <code>newAlign<\/code> \u00e8 <code>undefined<\/code>, allora impostiamo <code>newAlign<\/code> su <code>none<\/code>. Altrimenti, usiamo <code>newAlign<\/code>.<\/p>\n<p>Il nostro script <strong>edit.js<\/strong> dovrebbe essere completo (per ora):<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Ora Potete tornare all&#8217;editor e allineare il contenuto del blocco. Il blocco dovrebbe ora mostrare fieramente una barra di allineamento.<\/p>\n<figure id=\"attachment_134009\" aria-describedby=\"caption-attachment-134009\" style=\"width: 1772px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134009\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/alignment-toolbar.jpg\" alt=\"Il nostro blocco ora ha una barra di allineamento.\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Il nostro blocco ora ha una barra di allineamento.<\/figcaption><\/figure>\n<p>Ma se salvate il post, vedrete che il contenuto del blocco non \u00e8 allineato sul front-end come nell&#8217;editor dei blocchi. Questo perch\u00e9 dobbiamo ancora modificare la funzione <code>save<\/code> per memorizzare il contenuto e gli attributi dei blocchi nel database.<\/p>\n<h4>Passo 5: Salvataggio dei Dati<\/h4>\n<p>Aprite <strong>save.js<\/strong> e cambiate la funzione <code>save<\/code> come segue:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Infine, per rendere il codice pi\u00f9 leggibile, potete estrarre le singole propriet\u00e0 dall&#8217;oggetto <code>attribute<\/code> usando la <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">sintassi dell&#8217;assegnazione di destrutturazione<\/a>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Potete fare lo stesso nel file <strong>edit.js<\/strong>.<\/p>\n<p>Salvate il file e tornate all&#8217;editor in modalit\u00e0 Codice. Il codice dovrebbe assomigliare a questo:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block {\"align\":\"right\"} --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\" style=\"text-align:right\"&gt;This is my first editable &lt;strong&gt;Gutenberg&lt;\/strong&gt; &lt;em&gt;block&lt;\/em&gt; \ud83d\ude0e&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<figure id=\"attachment_134010\" aria-describedby=\"caption-attachment-134010\" style=\"width: 1446px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134010\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-toolbar-controls.jpg\" alt=\"I controlli della barra degli strumenti del blocco.\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">I controlli della barra degli strumenti del blocco.<\/figcaption><\/figure>\n<p>E questo \u00e8 tutto! avete appena aggiunto un controllo di allineamento alla barra degli strumenti del blocco \ud83e\udd13<\/p>\n<p>Potete leggere di pi\u00f9 sui <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">controlli della barra degli strumenti dei blocchi<\/a> nel Block Editor Handbook.<\/p>\n<h3 id=\"settings-sidebar\">Personalizzare la Sidebar delle Impostazioni del Blocco<\/h3>\n<p>Potete anche aggiungere dei controlli alla <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">sidebar<\/a> delle impostazioni del blocco (o anche creare una nuova sidebar per la vostra applicazione).<\/p>\n<p>L&#8217;API fornisce un <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\">componente <code>InspectorControls<\/code><\/a> per questo.<\/p>\n<p>Il Block Editor Handbook spiega <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">come usare la sidebar delle impostazioni<\/a>:<\/p>\n<blockquote><p><em>La sidebar delle impostazioni viene utilizzata per visualizzare le impostazioni meno utilizzate o quelle che richiedono pi\u00f9 spazio sullo schermo. La sidebar delle impostazioni dovrebbe essere utilizzata <strong>solo per le impostazioni a livello di blocco<\/strong>.<\/em><\/p>\n<p><em>Se avete delle impostazioni che influenzano solo il contenuto selezionato all&#8217;interno di un blocco (ad esempio l&#8217;impostazione &#8220;grassetto&#8221; per il testo selezionato all&#8217;interno di un paragrafo):<\/em> non mettetela all&#8217;interno della sidebar delle impostazioni.<em> La sidebar delle impostazioni viene visualizzata anche quando si modifica un blocco in modalit\u00e0 HTML, quindi dovrebbe contenere solo impostazioni a livello di blocco.<\/em><\/p><\/blockquote>\n<p>Di nuovo:<\/p>\n<ol>\n<li>Importazione dei Componenti Necessari da un Pacchetto WordPress<\/li>\n<li>Inserimento degli Elementi Corrispondenti nel Codice JSX<\/li>\n<li>Definizione degli Attributi Necessari nel File block.json<\/li>\n<li>Definizione degli Event Handler<\/li>\n<li>Salvataggio dei Dati<\/li>\n<\/ol>\n<h4>Passo 1. Importare i componenti InspectorControls e PanelColorSettings da @wordpress\/block-editor<\/h4>\n<p>Potete aggiungere diversi controlli per permettere agli utenti di personalizzare aspetti specifici del blocco. Ad esempio, potete fornire un pannello di controllo dei colori. Per farlo, dovrete importare i componenti <code>InspectorControls<\/code> e <code>PanelColorSettings<\/code> dal modulo <code>block-editor<\/code>:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls,\n\tInspectorControls,\n\tPanelColorSettings\n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Passo 2: Inserire gli Elementi Corrispondenti nel Codice JSX<\/h4>\n<p>Ora potete aggiungere gli elementi corrispondenti al codice JSX restituito dalla funzione <code>Edit<\/code>:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;InspectorControls&gt;\n\t\t\t\t&lt;PanelColorSettings \n\t\t\t\t\ttitle={ __( 'Color settings', 'ka-example-block' ) }\n\t\t\t\t\tinitialOpen={ false }\n\t\t\t\t\tcolorSettings={ [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: textColor,\n\t\t\t\t\t\t  onChange: onChangeTextColor,\n\t\t\t\t\t\t  label: __( 'Text color', 'ka-example-block' )\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: backgroundColor,\n\t\t\t\t\t\t  onChange: onChangeBackgroundColor,\n\t\t\t\t\t\t  label: __( 'Background color', 'ka-example-block' )\n\t\t\t\t\t\t}\n\t\t\t\t\t] }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/InspectorControls&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Notate che abbiamo anche aggiornato l&#8217;attributo <code>style<\/code> dell&#8217;elemento <code>RichText<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;RichText \n\t { ...blockProps }\n\t tagName=\"p\"\n\t onChange={ onChangeContent }\n\t allowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t value={ content }\n\t placeholder={ __( 'Write your text...' ) }\n\t style={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\/&gt;<\/code><\/pre>\n<h4>Passo 3: Definizione degli Attributi Necessari in block.json<\/h4>\n<p>Ora definite gli attributi <code>backgroundColor<\/code> e <code>textColor<\/code> nel file <strong>block.json:<\/strong><\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"backgroundColor\": {\n\t\t\"type\": \"string\"\n\t},\t \n\t\"textColor\": {\n\t\t\"type\": \"string\"\n\t}\n},<\/code><\/pre>\n<h4>Passo 4: Definizione degli Event Handler<\/h4>\n<p>Ora \u00e8 necessario definire due funzioni che aggiornino <code>backgroundColor<\/code> e <code>textColor<\/code> su input dell&#8217;utente:<\/p>\n<pre><code class=\"language-js\">const onChangeBackgroundColor = ( newBackgroundColor ) =&gt; {\n\tsetAttributes( { backgroundColor: newBackgroundColor } )\n}\n\nconst onChangeTextColor = ( newTextColor ) =&gt; {\n\tsetAttributes( { textColor: newTextColor } )\n}<\/code><\/pre>\n<h4>Passo 5: Salvataggio dei Dati<\/h4>\n<p>Un ultimo passaggio: aprite il file <strong>save.js<\/strong> e cambiate lo script come segue:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Salvate il file e controllate il blocco nell&#8217;editor. Dovreste trovarvi di fronte ad una sgradita sorpresa: un messaggio di errore che dice che il blocco contiene contenuti inattesi o non validi.<\/p>\n<figure id=\"attachment_134011\" aria-describedby=\"caption-attachment-134011\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134011\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/unexpected-or-invalid-content.jpg\" alt=\"Il messaggio di errore Unexpected or invalid content.\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Il messaggio di errore &#8220;Unexpected or invalid content&#8221;.<\/figcaption><\/figure>\n<p>Questo avviene perch\u00e9 \u00e8 cambiato il contenuto del file <strong>save.js<\/strong> e il codice salvato nel database non corrisponde a quello utilizzato nell&#8217;editor.<\/p>\n<p>Per risolvere il problema, aggiornate la pagina, cancellate qualsiasi istanza del blocco e aggiungetelo nuovamente al post:<\/p>\n<figure id=\"attachment_134012\" aria-describedby=\"caption-attachment-134012\" style=\"width: 1962px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134012\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/color-settings-panel.jpg\" alt=\"Il pannello delle impostazioni del colore nella barra delle impostazioni del blocco.\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">Il pannello delle impostazioni del colore nella barra delle impostazioni del blocco.<\/figcaption><\/figure>\n<p>Fate le vostre modifiche, salvate il post e visualizzatelo sul front-end. A questo punto, le modifiche apportate nell&#8217;editor di blocchi dovrebbero riflettersi sulla pagina frontale.<\/p>\n<figure id=\"attachment_134013\" aria-describedby=\"caption-attachment-134013\" style=\"width: 1918px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134013\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/custom-settings-applied.jpg\" alt=\"Il blocco personalizzato ora funziona correttamente sul front-end.\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">Il blocco personalizzato ora funziona correttamente sul front-end.<\/figcaption><\/figure>\n<h3 id=\"external-link\">Aggiungere e Personalizzare un Link Esterno<\/h3>\n<p>In questa sezione aggiungeremo nuovi componenti al tipo di blocco:<\/p>\n<ul>\n<li>Un componente <code>ExternalLink<\/code> che permette agli utenti di aggiungere un link personalizzabile al blocco<\/li>\n<li>Diversi controlli della sidebar che permettono agli utenti di personalizzare le impostazioni dei link<\/li>\n<\/ul>\n<h4>Passo 1. Importazione dei Componenti da @wordpress\/components<\/h4>\n<p>Ora avete bisogno di importare diversi componenti da <code>@wordpress\/components<\/code>. Aprite il vostro file <em>edit.js<\/em> e aggiungete la seguente dichiarazione <code>import<\/code>:<\/p>\n<pre><code class=\"language-js\">import {\n\tTextControl,\n\tPanelBody,\n\tPanelRow,\n\tToggleControl,\n\tExternalLink\n} from '@wordpress\/components';<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelbody\"><code>PanelBody<\/code><\/a> aggiunge un container a scomparsa alla sidebar delle impostazioni.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> produce un container generico per i controlli della sidebar.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> fornisce un input di testo.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> fornisce un interruttore che permette agli utenti di abilitare\/disabilitare una specifica opzione<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> \u00e8 un semplice componente per aggiungere un link esterno.<\/li>\n<\/ul>\n<h4>Passo 2. Inserimento degli Elementi Corrispondenti nel Codice JSX<\/h4>\n<p>Aggiungerete prima l&#8217;elemento <code>ExternalLink<\/code> allo stesso livello di <code>RichText<\/code> in un container <code>div<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;div { ...blockProps }&gt;\n\t&lt;RichText \n\t\t...\n\t\/&gt;\n\t&lt;ExternalLink \n\t\thref={ kaLink }\n\t\tclassName=\"ka-button\"\n\t\trel={ hasLinkNofollow ? \"nofollow\" : \"\" }\n\t&gt;\n\t\t\t{ linkLabel }\n\t&lt;\/ExternalLink&gt;\n\n&lt;\/div&gt;<\/code><\/pre>\n<p>Il componente <code>ExternalLink<\/code> non \u00e8 documentato, quindi abbiamo fatto riferimento al <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">componente stesso<\/a> per ottenere l&#8217;elenco degli attributi disponibili. Qui utilizziamo gli attributi <code>href<\/code>, <code>className<\/code> e <code>rel<\/code>.<\/p>\n<p>Di default, il valore dell&#8217;attributo <code>rel<\/code> \u00e8 impostato su <code>noopener noreferrer<\/code>. Il nostro codice aggiunger\u00e0 la keyword <a href=\"https:\/\/kinsta.com\/it\/blog\/link-nofollow-in-wordpress\/\"><code>nofollow<\/code><\/a> all&#8217;attributo <code>rel<\/code> del tag <code>a<\/code> risultante, quando il controllo toggle \u00e8 <strong>attivo<\/strong>.<\/p>\n<p>Ora possiamo aggiungere le impostazioni dei link alla sidebar del blocco.<\/p>\n<p>Per prima cosa, aggiungerete un elemento <code>PanelBody<\/code> dentro <code>InspectorControls<\/code> allo stesso livello di <code>PanelColorSettings<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InspectorControls&gt;\n\t&lt;PanelColorSettings \n\t...\n\t\/&gt;\n\t&lt;PanelBody \n\t\ttitle={ __( 'Link Settings' )}\n\t\tinitialOpen={true}\n\t&gt;\n\t...\n\t&lt;\/PanelBody&gt;\n&lt;\/InspectorControls&gt;<\/code><\/pre>\n<p>Ecco cosa stiamo facendo:<\/p>\n<ol>\n<li>L&#8217;attributo <code>title<\/code> fornisce il titolo del pannello.<\/li>\n<li><code>initialOpen<\/code> stabilisce se il pannello \u00e8 inizialmente aperto o meno.<\/li>\n<\/ol>\n<p>Poi aggiungeremo due elementi <code>PanelRow<\/code> dentro <code>PanelBody<\/code>, e un elemento <code>TextControl<\/code> dentro ogni <code>PanelRow<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelBody \n\ttitle={ __( 'Link Settings', 'ka-example-block' )}\n\tinitialOpen={true}\n&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'KA link', 'ka-example-block' )}\n\t\t\t\tvalue={ kaLink }\n\t\t\t\tonChange={ onChangeKaLink }\n\t\t\t\thelp={ __( 'Add your Academy link', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'Link label', 'ka-example-block' )}\n\t\t\t\tvalue={ linkLabel }\n\t\t\t\tonChange={ onChangeLinkLabel }\n\t\t\t\thelp={ __( 'Add link label', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>Il codice sopra dovrebbe ora essere abbastanza comprensibile. I due controlli di testo permettono agli utenti di impostare l&#8217;etichetta del link e l&#8217;URL.<\/p>\n<p>Aggiungeremo anche un ulteriore <code>PanelRow<\/code> con un <code>ToggleControl<\/code> per attivare\/disattivare un&#8217;opzione specifica, come ad esempio se includere o meno un attributo:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelRow&gt;\n\t&lt;fieldset&gt;\n\t\t&lt;ToggleControl\n\t\t\tlabel=\"Add rel = nofollow\"\n\t\t\thelp={\n\t\t\t\thasLinkNofollow\n\t\t\t\t\t? 'Has rel nofollow.'\n\t\t\t\t\t: 'No rel nofollow.'\n\t\t\t}\n\t\t\tchecked={ hasLinkNofollow }\n\t\t\tonChange={ toggleNofollow }\n\t\t\/&gt;\n\t&lt;\/fieldset&gt;\n&lt;\/PanelRow&gt;<\/code><\/pre>\n<h4>Passo 3: Definizione degli Attributi Necessari in block.json<\/h4>\n<p>Ora definiamo gli attributi <code>kaLink<\/code>, <code>linkLabel<\/code> e <code>hasLinkNofollow<\/code> nel file <strong>block.json:<\/strong><\/p>\n<pre><code class=\"language-json\">\"kaLink\": {\n\t\"type\": \"string\",\n\t\"default\": \"\"\n},\n\"linkLabel\": {\n\t\"type\": \"string\",\n\t\"default\": \"Check it out!\"\n},\n\"hasLinkNofollow\": {\n\t\"type\": \"boolean\",\n\t\"default\": false\n}<\/code><\/pre>\n<p>Non c&#8217;\u00e8 altro da aggiungere qui! Passiamo alla definizione delle <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">funzioni di gestione degli eventi<\/a>.<\/p>\n<h4>Passo 4: Definizione degli Event Handler<\/h4>\n<p>Tornate al file <strong>edit.js<\/strong> e aggiungete le seguenti funzioni:<\/p>\n<pre><code class=\"language-js\">const { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\nconst onChangeKaLink = ( newKaLink ) =&gt; {\n\tsetAttributes( { kaLink: newKaLink === undefined ? '' : newKaLink } )\n}\n\nconst onChangeLinkLabel = ( newLinkLabel ) =&gt; {\n\tsetAttributes( { linkLabel: newLinkLabel === undefined ? '' : newLinkLabel } )\n}\n\nconst toggleNofollow = () =&gt; {\n\tsetAttributes( { hasLinkNofollow: ! hasLinkNofollow } )\n}<\/code><\/pre>\n<p>Queste funzioni aggiornano i valori degli attributi corrispondenti su input dell&#8217;utente.<\/p>\n<h4>Passo 5: Salvataggio dei Dati<\/h4>\n<p>Per ultimo, dobbiamo aggiornare la funzione <code>save<\/code> in <strong>save.js<\/strong>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\t\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t\n\treturn (\n\t\t&lt;div \n\t\t\t{ ...blockProps }\n\t\t\tstyle={ { backgroundColor: backgroundColor } }\n\t\t&gt;\n\t\t\t&lt;RichText.Content \n\t\t\t\ttagName=\"p\" \n\t\t\t\tvalue={ content } \n\t\t\t\tstyle={ { color: textColor } }\n\t\t\t\/&gt;\n\t\t\t&lt;p&gt;\n\t\t\t\t&lt;a \n\t\t\t\t\thref={ kaLink }\n\t\t\t\t\tclassName=\"ka-button\"\n\t\t\t\t\trel={ hasLinkNofollow ? \"nofollow\" : \"noopener noreferrer\" }\n\t\t\t\t&gt;\n\t\t\t\t\t{ linkLabel }\n\t\t\t\t&lt;\/a&gt;\n\t\t\t&lt;\/p&gt;\n\t\t&lt;\/div&gt;\n\t);\n}<\/code><\/pre>\n<p>Si noti che qui abbiamo usato un normale elemento <code>a<\/code> invece di <code>ExternalLink<\/code>:<\/p>\n<figure id=\"attachment_134015\" aria-describedby=\"caption-attachment-134015\" style=\"width: 1964px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134015\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/link-settings.jpg\" alt=\"Il pannello delle impostazioni dei link nella barra delle impostazioni del blocco.\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">Il pannello delle impostazioni dei link nella barra delle impostazioni del blocco.<\/figcaption><\/figure>\n<h3 id=\"multiple-block-styles\">Aggiungere Stili di Blocco Multipli<\/h3>\n<p>In una sezione precedente, abbiamo mostrato come aggiungere un controllo alla toolbar di blocco che permette di allineare l&#8217;input dell&#8217;utente. Possiamo aggiungere altri controlli di stile alla barra degli strumenti dei blocchi, ma possiamo anche fornire un insieme di stili di blocco predefiniti che l&#8217;utente pu\u00f2 selezionare con un solo clic.<\/p>\n<p>A questo scopo, useremo un&#8217;utile funzionalit\u00e0 dell&#8217;API dei blocchi: gli <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Stili di blocco<\/a>.<\/p>\n<p>Tutto quello che dovete fare \u00e8 definire la propriet\u00e0 <code>styles<\/code> nel file <strong>block.json<\/strong> e dichiarare gli stili corrispondenti nei vostri fogli di stile.<\/p>\n<p>Ad esempio, potete aggiungere il seguente array di stili:<\/p>\n<pre><code class=\"language-json\">\"styles\": [\n\t{\n\t\t\"name\": \"default\",\n\t\t\"label\": \"Default\",\n\t\t\"isDefault\": true\n\t},\n\t{\n\t\t\"name\": \"border\",\n\t\t\"label\": \"Border\"\n\t}\n],<\/code><\/pre>\n<p>Con questo, avete appena aggiunto uno stile predefinito e uno stile aggiuntivo chiamato <code>border<\/code>. Ora tornate all&#8217;editor di blocchi:<\/p>\n<figure id=\"attachment_134064\" aria-describedby=\"caption-attachment-134064\" style=\"width: 1874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134064\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles.jpg\" alt=\"Due stili di blocco predefiniti.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Due stili di blocco predefiniti.<\/figcaption><\/figure>\n<p>Gli stili saranno disponibili all&#8217;utente cliccando sul <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-5-8\/#normalized-block-toolbars\">block switcher<\/a> e poi cercando il <strong>pannello Stili<\/strong> nella <strong>sidebar delle impostazioni del blocco<\/strong>.<\/p>\n<p>Selezionate uno stile e controllate le classi applicate all&#8217;elemento <code>p<\/code>. Cliccate con il tasto destro del mouse sul blocco e poi <strong>Inspect<\/strong>. \u00c8 stata aggiunta una nuova classe con un nome strutturato come segue:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Se avete selezionato lo stile &#8220;Border&#8221;, allora sar\u00e0 aggiunta all&#8217;elemento <code>p<\/code> la classe <code>is-style-border<\/code>. Se avete selezionato lo stile &#8220;Default&#8221;, verr\u00e0 invece aggiunta la classe <code>is-style-default<\/code>.<\/p>\n<p>Ora dovete solo dichiarare le propriet\u00e0 CSS. Aprite il file <strong>editor.scss<\/strong> e sostituite gli stili correnti con i seguenti:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Ora potete fare lo stesso in <strong>style.scss<\/strong>. Come abbiamo detto in precedenza, gli stili definiti in <strong>style.scss<\/strong> sono applicati sia sul front-end che nell&#8217;editor:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n\t&.is-style-default{\n\t\tborder: 0;\n        background-color: #FFE2C7;\n\t}\n\t&.is-style-border{\n\t\tborder: 2px solid #000;\n        border-radius: 16px;\n        background-color: #F6F6F6;\n\t}\n}<\/code><\/pre>\n<p>E questo \u00e8 tutto! Aggiornate la pagina e divertitevi con i vostri nuovi stili di blocco:<\/p>\n<figure id=\"attachment_134067\" aria-describedby=\"caption-attachment-134067\" style=\"width: 1876px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134067\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles-compared.jpg\" alt=\"Stili di blocco a confronto.\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Stili di blocco a confronto.<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Annidare i Blocchi Gutenberg con il Componente InnerBlocks<\/h3>\n<p>Anche se gi\u00e0 interamente funzionale, il nostro blocco non \u00e8 ancora molto attraente. Per renderlo pi\u00f9 accattivante per il pubblico, potremmo aggiungere un&#8217;immagine.<\/p>\n<p>Questo potrebbe aggiungere un livello di complessit\u00e0 al nostro blocco, ma per fortuna non c&#8217;\u00e8 bisogno di reinventare la ruota perch\u00e9 Gutenberg fornisce un componente specifico che \u00e8 possibile utilizzare per creare una struttura di <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">blocchi annidati<\/a>.<\/p>\n<p>Il componente <code>InnerBlocks<\/code> \u00e8 <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">definito come segue<\/a>:<\/p>\n<blockquote><p><code><em>InnerBlocks <\/em><\/code><em>esporta una coppia di componenti che possono essere utilizzati nelle implementazioni dei blocchi per abilitare il contenuto dei blocchi annidati.<\/em><\/p><\/blockquote>\n<p>Per prima cosa, \u00e8 necessario creare un nuovo file <strong>.js<\/strong> nella cartella <strong>src<\/strong>. Nel nostro esempio, chiameremo questo file <strong>container.js<\/strong>.<\/p>\n<p>Ora \u00e8 necessario importare la nuova risorsa nel file <strong>index.js:<\/strong><\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>Go back to <strong>container.js<\/strong> and import the necessary components:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from \"@wordpress\/blocks\";\nimport { __ } from \"@wordpress\/i18n\";\nimport {\n\tuseBlockProps, \n\tInnerBlocks \n} from \"@wordpress\/block-editor\";<\/code><\/pre>\n<p>Il passo successivo \u00e8 la definizione di un template che fornisce la struttura all&#8217;interno della quale saranno collocati i blocchi. Nell&#8217;esempio che segue, definiamo un template composto da due colonne che contengono un blocco principale Immagine e il nostro blocco personalizzato:<\/p>\n<pre><code class=\"language-js\">const TEMPLATE = [ [ 'core\/columns', { backgroundColor: 'yellow', verticalAlignment: 'center' }, [\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'core\/image' ],\n\t] ],\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'ka-example-block\/ka-example-block', { placeholder: 'Enter side content...' } ],\n\t] ],\n] ] ];<\/code><\/pre>\n<p>Il template \u00e8 strutturato come un <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">array di blockTypes<\/a> (nome del blocco e attributi opzionali).<\/p>\n<p>Nel codice qui sopra, abbiamo utilizzato diversi attributi per configurare i blocchi Columns e Column. In particolare, l&#8217;attributo <code>templateLock: 'all'<\/code> blocca i blocchi Column in modo che l&#8217;utente non possa aggiungere, riordinare o cancellare i blocchi esistenti. <code>templateLock<\/code> pu\u00f2 assumere uno dei seguenti valori:<\/p>\n<ul>\n<li><code>all<\/code> \u2014 <code>InnerBlocks<\/code> \u00e8 bloccato, e nessun blocco pu\u00f2 essere aggiunto, riordinato o rimosso.<\/li>\n<li><code>insert<\/code> \u2014 I blocchi possono essere solo riordinati o rimossi.<\/li>\n<li><code>false<\/code> \u2014 Il template non \u00e8 bloccato.<\/li>\n<\/ul>\n<p>Il template viene poi assegnato all&#8217;elemento <code>InnerBlocks<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>Per evitare qualsiasi problema di compatibilit\u00e0, abbiamo anche aggiunto un attributo <code>templateLock<\/code> al componente <code>InnerBlocks<\/code> (si veda anche la issue #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> e il pull #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Ecco il nostro file <strong>container.js<\/strong> finale:<\/p>\n<pre><code class=\"language-jsx\">registerBlockType('ka-example-block\/ka-example-container-block', {\n\ttitle: __( 'KA Container block', 'ka-example-block' ),\n\tcategory: 'design',\n\n\tedit( { className } ) {\n\t\t\n\t\treturn(\n\t\t\t&lt;div className={ className }&gt;\n\t\t\t\t&lt;InnerBlocks\n\t\t\t\t\ttemplate={ TEMPLATE }\n\t\t\t\t\ttemplateLock=\"all\"\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n\n\tsave() {\n\t\tconst blockProps = useBlockProps.save();\n\t\treturn(\n\t\t\t&lt;div { ...blockProps }&gt;\n\t\t\t\t&lt;InnerBlocks.Content \/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n});<\/code><\/pre>\n<figure id=\"attachment_134068\" aria-describedby=\"caption-attachment-134068\" style=\"width: 2060px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-134068\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-final.jpg\" alt=\"Il blocco finale nell'editor di blocchi.\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">Il blocco finale nell&#8217;editor di blocchi.<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Altri Miglioramenti<\/h3>\n<p>Il nostro blocco \u00e8 completo, ma potremmo migliorarlo un po&#8217; con alcune piccole modifiche.<\/p>\n<p>Abbiamo assegnato l&#8217;attributo <code>backgroundColor<\/code> al paragrafo generato dal componente <code>RichText<\/code>. Tuttavia, potremmo preferire assegnare il colore di sfondo alla <code>div<\/code> contenitore:<\/p>\n<p>Quindi modificate le <code>div<\/code> dei file <strong>edit.js<\/strong> e <strong>save.js<\/strong> come segue:<\/p>\n<pre><code class=\"language-jsx\">&lt;div \n\t{ ...blockProps }\n\tstyle={ { backgroundColor: backgroundColor } }\n&gt;\n...\n&lt;\/div&gt;<\/code><\/pre>\n<p>Questo permetter\u00e0 all&#8217;utente di cambiare lo sfondo dell&#8217;intero blocco.<\/p>\n<p>Una modifica pi\u00f9 rilevante riguarda il metodo <code>useBlockProps<\/code>. Nel codice iniziale, abbiamo definito la costante <code>blockProps<\/code> come segue:<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Ma possiamo usare <code>useBlockProps<\/code> in modo pi\u00f9 efficiente <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">passando un insieme di propriet\u00e0<\/a>. Ad esempio, possiamo importare <code>classnames<\/code> dal modulo <code>classnames<\/code> e impostare il nome della classe wrapper di conseguenza.<\/p>\n<p>Nell&#8217;esempio che segue, assegniamo un nome di classe basato sul valore dell&#8217;attributo <code>align<\/code> (<strong>edit.js<\/strong>):<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function Edit( { attributes, setAttributes } ) {\n\t...\n\t\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Faremo la stessa modifica nel file <strong>save.js:<\/strong><\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function save( { attributes } ) {\n\t...\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>E questa \u00e8 la conclusione! Ora \u00e8 possibile <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">eseguire la build per la produzione<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Riepilogo<\/h2>\n<p>Ed eccoci qui, alla fine di questo incredibile viaggio! Abbiamo iniziato con la configurazione dell&#8217;ambiente di sviluppo e abbiamo finito per creare un tipo di blocco completo.<\/p>\n<p>Come abbiamo detto nell&#8217;introduzione, una solida conoscenza di Node.js, Webpack, Babel e React \u00e8 essenziale per creare blocchi Gutenberg avanzati e posizionarsi sul mercato come sviluppatori Gutenberg professionisti.<\/p>\n<p>Ma non \u00e8 necessario avere un&#8217;esperienza consolidata di React per iniziare a divertirsi con lo sviluppo dei blocchi. Sviluppare blocchi potrebbe darvi le motivazioni e gli obiettivi per acquisire competenze sempre pi\u00f9 ampie nelle tecnologie che stanno dietro i blocchi di Gutenberg.<\/p>\n<p>Questa guida, quindi, \u00e8 ben lungi dall&#8217;essere completa. \u00c8 semplicemente un&#8217;introduzione a un&#8217;ampia variet\u00e0 di argomenti che vi aiuter\u00e0 ad iniziare a costruire i vostri primi blocchi Gutenberg.<\/p>\n<p>Per questo motivo, consigliamo di approfondire la conoscenza della materia leggendo attentamente la documentazione e le guide online. Tra le molte risorse disponibili in giro, raccomandiamo le seguenti:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Tutorial ufficiale sulla creazione di un blocco<\/a> per principianti<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Tutorial ufficiale sui blocchi<\/a> per sviluppatori intermedi<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Blocchi dinamici<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/blocchi-dinamici\/\">Come Creare Blocchi Dinamici per Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Meta box<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Creare una sidebar per il vostro plugin<\/a><\/li>\n<\/ul>\n<p>Se avete appena iniziato a sviluppare su WordPress, potreste voler comprendere meglio i concetti di base dello sviluppo frontend. Ecco un breve elenco di risorse che possono aiutarvi ad iniziare:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/it\/ebooks\/wordpress\/wordpress-sviluppo-locale\/\">Come Installare WordPress in Locale<\/a> (Ebook Gratuito)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/ebooks\/wordpress\/hosting-wordpress-gestito\/\">Il Vero Valore dell&#8217;Hosting WordPress Gestito<\/a> (Ebook Gratuito)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-javascript\/\">Cos&#8217;\u00e8 JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/html-e-html5\/\">HTML vs HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-css\/\">Come Modificare i CSS in WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-php\/\">Cos&#8217;\u00e8 PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/it\/blog\/hook-wordpress\/\">WordPress Hooks Bootcamp: Come Utilizzare Azioni, Filtri e Hook Personalizzati<\/a><\/li>\n<\/ul>\n<p>E ricordate che il codice completo degli esempi di questa guida \u00e8 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">disponibile su Gist<\/a>.<\/p>\n<p>Ora \u00e8 il vostro turno: Avete sviluppato qualche blocco Gutenberg? Quali sono le principali difficolt\u00e0 che avete incontrato finora? Descriveteci la vostra esperienza nei commenti!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sono in molti a lamentarsi delle difficolt\u00e0 che si incontrano quando si inizia a creare blocchi e app per Gutenberg. La curva di apprendimento \u00e8 ripida, &#8230;<\/p>\n","protected":false},"author":36,"featured_media":48492,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[25641,25682,79,25635],"topic":[25873],"class_list":["post-48491","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-developement","tag-gutenberg","tag-sviluppo","topic-sviluppo-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi<\/title>\n<meta name=\"description\" content=\"Creare blocchi di Gutenberg all&#039;inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi\" \/>\n<meta property=\"og:description\" content=\"Creare blocchi di Gutenberg all&#039;inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-21T11:39:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-08T08:27:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Creare blocchi di Gutenberg all&#039;inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"52 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi\",\"datePublished\":\"2021-10-21T11:39:08+00:00\",\"dateModified\":\"2023-06-08T08:27:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\"},\"wordCount\":8161,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png\",\"keywords\":[\"Block Editor\",\"developement\",\"Gutenberg\",\"sviluppo\"],\"articleSection\":[\"Sviluppo WordPress\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\",\"name\":\"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png\",\"datePublished\":\"2021-10-21T11:39:08+00:00\",\"dateModified\":\"2023-06-08T08:27:49+00:00\",\"description\":\"Creare blocchi di Gutenberg all'inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png\",\"width\":1460,\"height\":730,\"caption\":\"Costruire blocchi Gutenberg personalizzati: Il tutorial definitivo sullo sviluppo dei blocchi\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sviluppo di WordPress\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/sviluppo-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi","description":"Creare blocchi di Gutenberg all'inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/","og_locale":"it_IT","og_type":"article","og_title":"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi","og_description":"Creare blocchi di Gutenberg all'inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.","og_url":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2021-10-21T11:39:08+00:00","article_modified_time":"2023-06-08T08:27:49+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Creare blocchi di Gutenberg all'inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Carlo Daniele","Tempo di lettura stimato":"52 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi","datePublished":"2021-10-21T11:39:08+00:00","dateModified":"2023-06-08T08:27:49+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/"},"wordCount":8161,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png","keywords":["Block Editor","developement","Gutenberg","sviluppo"],"articleSection":["Sviluppo WordPress"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/","url":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/","name":"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png","datePublished":"2021-10-21T11:39:08+00:00","dateModified":"2023-06-08T08:27:49+00:00","description":"Creare blocchi di Gutenberg all'inizio pu\u00f2 sembrare scoraggiante. Ma non lo \u00e8! Questa guida approfondita ti mostrer\u00e0 come creare il tuo primo blocco WP.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/10\/blocchi_gutenberg.png","width":1460,"height":730,"caption":"Costruire blocchi Gutenberg personalizzati: Il tutorial definitivo sullo sviluppo dei blocchi"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Sviluppo di WordPress","item":"https:\/\/kinsta.com\/it\/argomenti\/sviluppo-wordpress\/"},{"@type":"ListItem","position":3,"name":"Creare Blocchi Gutenberg Personalizzati: Il Tutorial Definitivo sullo Sviluppo dei Blocchi"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/48491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=48491"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/48491\/revisions"}],"predecessor-version":[{"id":69964,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/48491\/revisions\/69964"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/translations\/se"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/48491\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/48492"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=48491"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=48491"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=48491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}