{"id":34484,"date":"2023-01-02T09:00:00","date_gmt":"2023-01-02T08:00:00","guid":{"rendered":"https:\/\/supporthost.com\/it\/?p=34484"},"modified":"2025-10-23T11:02:43","modified_gmt":"2025-10-23T09:02:43","slug":"blocchi-gutenberg","status":"publish","type":"post","link":"https:\/\/supporthost.com\/it\/blocchi-gutenberg\/","title":{"rendered":"Come creare blocchi Gutenberg personalizzati"},"content":{"rendered":"\n<p>In questo tutorial impareremo a creare un blocco Gutenberg personalizzato.<\/p>\n\n\n\n<p>Ci sono diversi modi di creare blocchi, per semplificare la procedura e renderla comprensibile a tutti utilizzeremo <strong>plain JavaScript<\/strong>. Abbiamo scelto di seguire questo metodo e non utilizzare JSX per evitare la compilazione.<\/p>\n\n\n\n<p>Per riuscire a seguire questo tutorial devi solo avere conoscenze di base di JavaScript, <a href=\"https:\/\/supporthost.com\/it\/imparare-html\/\" data-type=\"post\" data-id=\"45669\">HTML<\/a> e <a href=\"https:\/\/supporthost.com\/it\/imparare-css\/\" data-type=\"post\" data-id=\"45822\">CSS<\/a>.<\/p>\n\n\n\n<p>Non farti intimorire dalla documentazione attuale sullo sviluppo dei blocchi, che non aiuta molto, specie se non vuoi usare JSX. Ti mostrer\u00f2 come iniziare subito a creare i primi blocchi, usando solo un <a href=\"https:\/\/supporthost.com\/it\/html-editor\/\" data-type=\"post\" data-id=\"57372\">editor di codice<\/a> e un&#8217;installazione locale di WordPress.<\/p>\n\n\n\n<p>Iniziamo.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Indice<\/h2><nav><ul><li><a href=\"#cose-un-blocco-gutenberg\">Cos&#8217;\u00e8 un blocco Gutenberg?<\/a><\/li><li><a href=\"#jsx-vs-java-script\">JSX VS JavaScript<\/a><\/li><li><a href=\"#il-nostro-ambiente-di-sviluppo\">Il nostro ambiente di sviluppo<\/a><\/li><li><a href=\"#come-impostato-questo-tutorial\">Com&#8217;\u00e8 impostato questo tutorial<\/a><\/li><li><a href=\"#il-nostro-primo-blocco-iniziamo-dalla-base\">Il nostro primo blocco, iniziamo dalla base<\/a><\/li><li><a href=\"#aggiungiamo-il-css-al-nostro-blocco\">Aggiungiamo il CSS al nostro blocco<\/a><\/li><li><a href=\"#attributi-e-campi-modificabili\">Attributi e campi modificabili<\/a><\/li><li><a href=\"#gutenberg-block-supports\">Gutenberg block supports<\/a><\/li><li><a href=\"#allineamento-del-testo\">Allineamento del testo<\/a><\/li><li><a href=\"#un-blocco-per-le-recensioni\">Un blocco per le recensioni<\/a><\/li><li><a href=\"#creare-un-blocco-con-una-immagine\">Creare un blocco con una immagine<\/a><\/li><li><a href=\"#creare-un-blocco-dinamico\">Creare un blocco dinamico<\/a><\/li><li><a href=\"#conclusioni\">Conclusioni<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/come-creare-blocchi-gutenberg-personalizzati-1024x538.png\" alt=\"Come Creare Blocchi Gutenberg Personalizzati\" class=\"wp-image-34917\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/come-creare-blocchi-gutenberg-personalizzati-1024x538.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/come-creare-blocchi-gutenberg-personalizzati-300x158.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/come-creare-blocchi-gutenberg-personalizzati-768x403.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/come-creare-blocchi-gutenberg-personalizzati-120x63.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/come-creare-blocchi-gutenberg-personalizzati.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cose-un-blocco-gutenberg-\ufffc\">Cos&#8217;\u00e8 un blocco Gutenberg?<\/h2>\n\n\n\n<p>Con <a href=\"https:\/\/supporthost.com\/it\/gutenberg\/\">Gutenberg<\/a> la creazione di pagine e articoli per i siti web avviene componendo il contenuto attraverso i blocchi. Un blocco, quindi, rappresenta qualsiasi elemento all&#8217;interno della nostra pagina.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"410\" height=\"924\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2021\/12\/inserter-dei-blocchi-gutenberg.png\" alt=\"Inserter Dei Blocchi Gutenberg\" class=\"wp-image-22286\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2021\/12\/inserter-dei-blocchi-gutenberg.png 410w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2021\/12\/inserter-dei-blocchi-gutenberg-133x300.png 133w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2021\/12\/inserter-dei-blocchi-gutenberg-28x63.png 28w\" sizes=\"auto, (max-width: 410px) 100vw, 410px\" \/><figcaption class=\"wp-element-caption\">Inserter dei blocchi Gutenberg<\/figcaption><\/figure>\n\n\n\n<p>Nella <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\" rel=\"noopener\">documentazione<\/a> di WordPress i blocchi Gutenberg vengono definiti come unit\u00e0 di markup che, combinate insieme, formano il contenuto o il layout di una pagina web.<\/p>\n\n\n\n<p>Alcuni dei blocchi predefiniti sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>paragrafi<\/li>\n\n\n\n<li>titoli<\/li>\n\n\n\n<li>immagini<\/li>\n\n\n\n<li>video<\/li>\n\n\n\n<li>file<\/li>\n\n\n\n<li>elenco puntato.<\/li>\n<\/ul>\n\n\n\n<p>A differenza del classic editor di WordPress, in cui il contenuto degli articoli viene creato in un&#8217;unica finestra, i blocchi ci permettono di suddividere il contenuto in parti pi\u00f9 piccole.<\/p>\n\n\n\n<p>Il vantaggio della creazione a blocchi \u00e8 che il singolo blocco pu\u00f2 essere spostato facilmente in un&#8217;altra posizione. Nello specifico possiamo modificare i singoli blocchi, riordinarli, spostarli e duplicarli con maggiore facilit\u00e0.<\/p>\n\n\n\n<p>Leggi la nostra guida se vuoi passare dall&#8217;<a href=\"https:\/\/supporthost.com\/it\/da-classic-editor-a-blocchi\/\" data-type=\"post\" data-id=\"130735\">editor classico ai blocchi<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jsx-vs-java-script\">JSX VS JavaScript<\/h2>\n\n\n\n<p>Per creare un blocco Gutenberg possiamo utilizzare JavaScript o JSX. Nel nostro caso utilizzeremo JavaScript, in questo modo non ci servir\u00e0 ricompilare il codice con npm.<\/p>\n\n\n\n<p><strong>JavaScript<\/strong> \u00e8 un linguaggio di scripting derivato da Java che viene usato per rendere le pagine interattive. I JavaScript vengono eseguiti direttamente dal browser al momento del caricamento della pagina e non hanno bisogno di essere compilati.<\/p>\n\n\n\n<p><strong>JSX<\/strong> (JavaScript XML) \u00e8 un&#8217;estensione della sintassi di JavaScript che viene usata per creare componenti di React ed \u00e8 simile al linguaggio HTML. Le espressioni JSX devono essere compilate per diventare funzioni JavaScript.<\/p>\n\n\n\n<p>Scegliere uno dei due metodi porta allo stesso risultato. La differenza \u00e8 che usando JavaScript non abbiamo bisogno di compilare. Seguire questo metodo rende possibile creare un blocco anche ai meno esperti.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"il-nostro-ambiente-di-sviluppo\">Il nostro ambiente di sviluppo<\/h2>\n\n\n\n<p>Nel nostro caso abbiamo scelto di utilizzare plain JavaScript e non JSX. Questa scelta nasce dall&#8217;intento di creare un tutorial adatto a tutti.<\/p>\n\n\n\n<p>Ci baster\u00e0 a utilizzare:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>local con cui <a href=\"https:\/\/supporthost.com\/it\/installare-wordpress-in-locale-local-by-flywheel\/\">installeremo WordPress in locale<\/a>;<\/li>\n\n\n\n<li>un editor di codice, per esempio Visual Studio Code.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2020\/10\/local-1024x536.png\" alt=\"Local\" class=\"wp-image-14840\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2020\/10\/local-1024x536.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2020\/10\/local-300x157.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2020\/10\/local-768x402.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2020\/10\/local-120x63.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2020\/10\/local.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"768\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/visual-studio-code-logo.png\" alt=\"Visual Studio Code Logo\" class=\"wp-image-34739\" style=\"width:192px;height:192px\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/visual-studio-code-logo.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/visual-studio-code-logo-300x300.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/visual-studio-code-logo-150x150.png 150w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/visual-studio-code-logo-63x63.png 63w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Se avessimo utilizzato JSX avremmo avuto bisogno di un ambiente di sviluppo pi\u00f9 complesso. In quel caso ci sarebbe servito installare:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/supporthost.com\/it\/nodejs\/\" data-type=\"post\" data-id=\"54780\">Node.js<\/a>, un framework che si usa per creare applicazioni in JavaScript;<\/li>\n\n\n\n<li><strong>npm<\/strong>, il gestore di pacchetti di Node.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"come-impostato-questo-tutorial\">Com&#8217;\u00e8 impostato questo tutorial<\/h2>\n\n\n\n<p>In questo tutorial voglio spiegare come creare un blocco personalizzato, iniziando da un blocco base per introdurre i primi concetti.<\/p>\n\n\n\n<p>Aggiunger\u00f2 dei passaggi in ogni blocco in modo da introdurre altri concetti e migliorare in questo modo il nostro blocco Gutenberg un passo alla volta, nella speranza di rendere il pi\u00f9 chiaro possibile il tutto.<\/p>\n\n\n\n<p>Puoi seguire il tutorial passo passo, copiando il codice creando un nuovo plugin per ogni blocco, oppure scaricare il codice da <a href=\"https:\/\/github.com\/supporthost-com\/gutenberg-blocks-tutorial\" rel=\"noopener\">GitHub<\/a>.<\/p>\n\n\n\n<p>Ho deciso di creare un plugin separato per ogni blocco per (spero) maggiore chiarezza, ovviamente sarebbe stato possibile creare un unico plugin per tutti i blocchi.<\/p>\n\n\n\n<p>Senza dire altro, iniziamo creando il nostro primo blocco, creando un blocco molto basilare, che ci servir\u00e0 a capire la struttura base del blocco.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"il-nostro-primo-blocco-iniziamo-dalla-base\">Il nostro primo blocco, iniziamo dalla base<\/h2>\n\n\n\n<p>Entriamo quindi nel vivo del nostro tutorial, e iniziamo a sporcarci le mani col codice.<\/p>\n\n\n\n<p>Abbiamo il nostro sito WordPress installato in locale, ed un editor di codice (a me personalmente piace Visual Studio Code da quando GitHub ha mandato in pensione Atom).<\/p>\n\n\n\n<p>Non ci serve altro.<\/p>\n\n\n\n<p>Iniziamo col creare una cartella per il nostro plugin, che chiameremo &#8220;supporthost-block-1&#8221;.<\/p>\n\n\n\n<p>Al suo interno creiamo un file php chiamato supporthost-block-1.php (lo stesso nome della cartella, ma ovviamente con estensione php).<\/p>\n\n\n\n<p>Nel nostro file php inseriamo questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;?php\n\/**\n * Plugin Name: SupportHost block 01\n *\/\n\nfunction supporthost_block_01_register_block() {\n    register_block_type( __DIR__ );\n}\n\nadd_action( 'init', 'supporthost_block_01_register_block' );<\/pre>\n\n\n\n<p>In pratica nel commento in alto diamo un nome al nostro plugin, e tramite l&#8217;action <a href=\"https:\/\/supporthost.com\/it\/hook-wordpress\/\" data-type=\"post\" data-id=\"84714\">hook<\/a> &#8220;init&#8221; chiamiamo la funzione <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\" rel=\"noopener\">register_block_type<\/a> alla quale ci basta passare la posizione della cartella che contiene il file block.json, che adesso dobbiamo creare.<\/p>\n\n\n\n<p>Creiamo il file block.json che contiene le informazioni del nostro blocco Gutenberg:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n    \"apiVersion\": 2,\n    \"title\": \"SupportHost: 01\",\n    \"name\": \"supporthost-blocks\/supporthost-01\",\n    \"category\": \"layout\",\n    \"icon\": \"admin-generic\",\n    \"editorScript\": \"file:.\/block.js\"\n}<\/pre>\n\n\n\n<p>Cosa significa? Queste sono le impostazioni base del nostro blocco, vediamole una per una:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>apiVersion<\/strong>: la versione API del blocco.<\/li>\n\n\n\n<li><strong>title<\/strong>: il titolo del blocco che viene mostrato quando scegliamo il blocco.<\/li>\n\n\n\n<li><strong>name<\/strong>: il nome univoco che definisce il nostro blocco.<\/li>\n\n\n\n<li><strong>category<\/strong>: la categoria in cui il blocco viene inserito (text, media, design, widgets, theme, embed). I blocchi vengono divisi in categorie quando clicchiamo sul + azzurro in alto a sinistra per aprire l&#8217;inserter dei blocchi.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"390\" height=\"924\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-wordpress-supporthost-categorie.png\" alt=\"Blocchi Gutenberg Personalizzati WordPress Supporthost Categorie\" class=\"wp-image-34668\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-wordpress-supporthost-categorie.png 390w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-wordpress-supporthost-categorie-127x300.png 127w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-wordpress-supporthost-categorie-27x63.png 27w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>icon<\/strong>: la <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" rel=\"noopener\">dashicon<\/a> che vogliamo mostrare come icona del nostro blocco.<\/li>\n\n\n\n<li><strong>editorScript<\/strong>: lo script che vogliamo caricare nell&#8217;editor per il nostro blocco.<\/li>\n<\/ul>\n\n\n\n<p>Come probabilmente hai notato, nell&#8217;ultima riga del file block.json chiamiamo un file block.js, ma questo file ancora non esiste.<\/p>\n\n\n\n<p>Creiamolo, incolliamo il codice qui sotto e vediamo come funziona.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( function ( blocks, element ) {\n    var el = element.createElement;\n\n    blocks.registerBlockType( 'supporthost-blocks\/supporthost-01', {\n        edit: function () {\n            return el( 'p', {}, 'Hello World (from the editor).' );\n        },\n        save: function () {\n            return el( 'p', {}, 'Hola mundo (from the frontend).' );\n        },\n    } );\n} )( window.wp.blocks, window.wp.element );<\/pre>\n\n\n\n<p>Questo file viene caricato in automatico nell&#8217;editor, e contiene 3 elementi importanti:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>name<\/strong>: alla riga 4 vediamo che si usa lo stesso &#8220;name&#8221; che abbiamo inserito nel file block.json.<\/li>\n\n\n\n<li><strong>edit<\/strong>: la funzione che viene chiamata dentro l&#8217;editor, ci permette di vedere il blocco nell&#8217;editor e nei prossimi esempi conterr\u00e0 un codice che ci permette la modifica del contenuto del blocco.<\/li>\n\n\n\n<li><strong>save<\/strong>: questa funzione viene chiamata al momento in cui salviamo in nostro contenuto. WordPress salva nel database il codice HTML che viene creato tramite questa funzione.<\/li>\n<\/ul>\n\n\n\n<p>Come sicuramente hai notato, quando aggiungi questo blocco Gutenberg (che ovviamente non \u00e8 modificabile, ancora) nell&#8217;editor vedi un testo, mentre nel frontend vedi un testo diverso. Puoi vedere il risultato nella schermata alla fine di questo paragrafo.<\/p>\n\n\n\n<p>Questo succede perch\u00e9 abbiamo indicato al nostro blocco di mostrare un &#8220;<em>p<\/em>&#8221; nell&#8217;editor, ma quando salviamo, la funzione save salva un &#8220;<em>p<\/em>&#8221; con un testo diverso nel database, e quindi viene mostrato un testo diverso nel frontend.<\/p>\n\n\n\n<p>Adesso possiamo andare alla schermata dei <a href=\"https:\/\/supporthost.com\/it\/plugin-wordpress\/\" data-type=\"post\" data-id=\"16110\">plugin<\/a> e attivare il nostro primo plugin.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"244\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/attivare-plugin-supporthost-block-01-blocchi-personalizzati-gutenberg-1024x244.png\" alt=\"Attivare Plugin Supporthost Block 01 Blocchi Personalizzati Gutenberg\" class=\"wp-image-34824\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/attivare-plugin-supporthost-block-01-blocchi-personalizzati-gutenberg-1024x244.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/attivare-plugin-supporthost-block-01-blocchi-personalizzati-gutenberg-300x72.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/attivare-plugin-supporthost-block-01-blocchi-personalizzati-gutenberg-768x183.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/attivare-plugin-supporthost-block-01-blocchi-personalizzati-gutenberg-120x29.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/attivare-plugin-supporthost-block-01-blocchi-personalizzati-gutenberg.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Andando a creare un nuovo post dovremmo vedere il nuovo blocco, eppure non \u00e8 presente. Come mai? Mancano le dipendenze.<\/p>\n\n\n\n<p>Nella documentazione di WordPress leggiamo:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Per registrare il blocco \u00e8 necessario un file php per gli asset,  nella stessa cartella della cartella usata in register_block_type() e deve iniziare con il nome del file dello script.<\/p>\n<\/blockquote>\n\n\n\n<p>In pratica dobbiamo creare un file block.asset.php nella stessa cartella, con questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;?php return\n    array( 'dependencies' =&gt;\n        array(\n            'wp-blocks',\n            'wp-element',\n            'wp-block-editor',\n            'wp-polyfill'\n        ),\n        'version' =&gt; '0.1'\n    );<\/pre>\n\n\n\n<p class=\"note\">Una nota sul ricaricare la pagina. Quando lavori a un blocco, e i files (css e js) cambiano, \u00e8 ideale eliminare il blocco, salvare e fare un hard refresh per ricaricare eventuali files in cache. Su Mac per fare hard refresh basta premere maiusc+cmd+r<\/p>\n\n\n\n<p>Adesso puoi ricaricare la pagina dell&#8217;header ed aggiungere il primo blocco personalizzato nel tuo post.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"311\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/aggiungere-blocco-personalizzato-gutenberg-editor-1024x311.png\" alt=\"Aggiungere Blocco Personalizzato Gutenberg Editor\" class=\"wp-image-34825\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/aggiungere-blocco-personalizzato-gutenberg-editor-1024x311.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/aggiungere-blocco-personalizzato-gutenberg-editor-300x91.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/aggiungere-blocco-personalizzato-gutenberg-editor-768x233.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/aggiungere-blocco-personalizzato-gutenberg-editor-120x36.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/aggiungere-blocco-personalizzato-gutenberg-editor.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ovviamente per adesso \u00e8 abbastanza inutile, nel senso che possiamo aggiungere un blocco, che viene mostrato in due modi diversi su editor e frontend, e non possiamo modificarlo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"257\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-primo-blocco-1024x257.png\" alt=\"Blocchi Gutenberg Personalizzati Primo Blocco\" class=\"wp-image-34822\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-primo-blocco-1024x257.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-primo-blocco-300x75.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-primo-blocco-768x193.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-primo-blocco-120x30.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-primo-blocco.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ma questo \u00e8 solo un primo passo. Aggiungiamo il primo mattoncino per dare al nostro blocco Gutenberg una grafica migliore: il CSS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aggiungiamo-il-css-al-nostro-blocco\">Aggiungiamo il CSS al nostro blocco<\/h2>\n\n\n\n<p>Duplichiamo la cartella supporthost-block-1 chiamandola supporthost-block-2.<\/p>\n\n\n\n<p>Rinominiamo allo stesso modo supporthost-block-1.php in supporthost-block-2.php e modifichiamo il codice al suo interno in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;?php\n\/**\n * Plugin Name: SupportHost block 02\n *\/\n\nfunction supporthost_block_02_register_block() {\n    register_block_type( __DIR__ );\n}\n\nadd_action( 'init', 'supporthost_block_02_register_block' );<\/pre>\n\n\n\n<p>In pratica sostituendo il numero 1 con il numero 2.<\/p>\n\n\n\n<p>Nel file block.json aggiungiamo due righe rispetto al file del plugin precedente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n    \"apiVersion\": 2,\n    \"title\": \"SupportHost: 02\",\n    \"name\": \"supporthost-blocks\/supporthost-02\",\n    \"category\": \"layout\",\n    \"icon\": \"admin-generic\",\n    \"editorScript\": \"file:.\/block.js\",\n    \"editorStyle\": \"file:.\/editor.css\",\n    \"style\": \"file:.\/style.css\"\n}<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>editorStyle<\/strong>: indichiamo il percorso del file css che verr\u00e0 caricato nell&#8217;editor. Tieni presente che questo file viene caricato dopo il foglio di stile del blocco, quindi serve per mostrare degli stili differenti nell&#8217;editor.<\/li>\n\n\n\n<li><strong>style<\/strong>: qui indichiamo il percorso del foglio di stile del blocco, questo file verr\u00e0 caricato sia nel frontend che nel backend, come ho detto sopra viene caricato prima del foglio di stile dell&#8217;editor.<\/li>\n<\/ul>\n\n\n\n<p>Ho anche cambiato il title e il name del blocco, in modo che siano diversi dal primo blocco che abbiamo creato, e WordPress non faccia confusione tra i blocchi. Allo stesso modo dobbiamo cambiare il name del blocco nel file block.js<\/p>\n\n\n\n<p>Dal momento che chiamiamo due files css, creaiamoli e aggiungiamo il codice necessario.<\/p>\n\n\n\n<p>editor.css:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* green background *\/\n.wp-block-supporthost-blocks-supporthost-02 {\n    background: #090;\n    color: white;\n    padding: 20px;\n}<\/pre>\n\n\n\n<p>style.css:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* red background *\/\n.wp-block-supporthost-blocks-supporthost-02 {\n    background: #900;\n    color: white;\n    padding: 20px;\n}<\/pre>\n\n\n\n<p>Adesso attiviamo il plugin e aggiungiamo il blocco su Gutenberg, ovviamente dopo aver fatto un hard refresh della pagina.<\/p>\n\n\n\n<p>Sicuramente hai notato che i css non hanno effetto, nonostante i files vengano caricati correttamente.<\/p>\n\n\n\n<p>Questo perch\u00e9 dobbiamo aggiungere una classe al &#8220;<em>p<\/em>&#8220;, sia nell&#8217;editor che nel frontend.<\/p>\n\n\n\n<p>Per farlo dobbiamo modificare il file block.js in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( function ( blocks, element, blockEditor ) {\n    var el = element.createElement;\n\n    blocks.registerBlockType( 'supporthost-blocks\/supporthost-02', {\n        edit: function ( props ) {\n            var blockProps = blockEditor.useBlockProps();\n            return el(\n                'p',\n                blockProps,\n                'Hello World (from the editor, with css).'\n            );\n        },\n        save: function () {\n            var blockProps = blockEditor.useBlockProps.save();\n            return el(\n                'p',\n                blockProps,\n                'Hello World (from the frontend, with css).'\n            );\n        },\n    } );\n} )( window.wp.blocks, window.wp.element, window.wp.blockEditor );<\/pre>\n\n\n\n<p>In pratica usiamo blockEditor.useBlockProps() per aggiungere una classe al blocco. La classe che viene aggiunta \u00e8 il nome (name) del blocco che usa il simbolo &#8220;-&#8221; al posto dello slash &#8220;\/&#8221;, si tratta di una semplice convenzione.<\/p>\n\n\n\n<p>Nella <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/applying-styles-with-stylesheets\/\" rel=\"noopener\">documentazione di WordPress<\/a> viene mostrato anche un secondo modo per dare uno stile inline al blocco, non ho intenzione si spiegarlo qui, primo perch\u00e9 \u00e8 semplice, secondo perch\u00e9 a breve i nostri fogli di stile diventeranno complessi e non ha senso usare gli stili inline in quel caso.<\/p>\n\n\n\n<p>Ovviamente abbiamo modificato la parte grafica, ma il nostro blocco \u00e8 del tutto inutile se non possiamo modificare il testo dall&#8217;editor.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"239\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-secondo-blocco-1024x239.png\" alt=\"Blocchi Gutenberg Personalizzati Secondo Blocco\" class=\"wp-image-34897\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-secondo-blocco-1024x239.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-secondo-blocco-300x70.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-secondo-blocco-768x179.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-secondo-blocco-120x28.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-secondo-blocco.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Vediamo come funzionano gli attributi e i campi modificabili.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"attributi-e-campi-modificabili\">Attributi e campi modificabili<\/h2>\n\n\n\n<p>Come per il blocco precedente, duplichiamo la cartella di uno dei blocchi, modifichiamo i vari nomi in 3 per avere dei nomi univoci.<\/p>\n\n\n\n<p>Attiviamo il plugin SupportHost block 03 ed iniziamo a modificare i nostri files in modo da creare un blocco modificabile.<\/p>\n\n\n\n<p>Il file da modificare \u00e8 il file block.js<\/p>\n\n\n\n<p>Iniziamo aggiungendo gli attributi. In pratica definiamo degli attributi del nostro blocco Gutenberg, in questo caso solo &#8220;content&#8221;, in un esempio successivo ne aggiungeremo pi\u00f9 di uno.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        attributes: {\n            content: {\n                type: 'string',\n                source: 'html',\n                selector: 'p',\n            },\n        },<\/pre>\n\n\n\n<p>In pratica stiamo creando un attributo chiamato content, che \u00e8 una string di testo, dentro un tag html &#8220;p&#8221;.<\/p>\n\n\n\n<p><code>source<\/code> indica la sorgente da cui prendiamo il valore dell&#8217;attributo, in questo caso prendiamo il valore dall&#8217;HTML che viene salvato nel database dalla funzione save.<\/p>\n\n\n\n<p>Dobbiamo anche definire &#8220;example&#8221;, che definisce i dati di default per l&#8217;anteprima quando cerchiamo di aggiungere il blocco tramite l&#8217;inserter.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"480\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-personalizzati-gutenberg-anteprima-1024x480.png\" alt=\"Blocchi Personalizzati Gutenberg Anteprima\" class=\"wp-image-34773\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-personalizzati-gutenberg-anteprima-1024x480.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-personalizzati-gutenberg-anteprima-300x141.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-personalizzati-gutenberg-anteprima-768x360.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-personalizzati-gutenberg-anteprima-120x56.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-personalizzati-gutenberg-anteprima.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Blocco Gutenberg con anteprima<\/figcaption><\/figure>\n\n\n\n<p>Non \u00e8 obbligatorio definire example, se non lo facciamo vediamo un messaggio che indica che l&#8217;anteprima non \u00e8 disponibile.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"444\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/custom-getenberg-block-nessuna-anteprima-1024x444.png\" alt=\"Custom Getenberg Block Nessuna Anteprima\" class=\"wp-image-34770\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/custom-getenberg-block-nessuna-anteprima-1024x444.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/custom-getenberg-block-nessuna-anteprima-300x130.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/custom-getenberg-block-nessuna-anteprima-768x333.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/custom-getenberg-block-nessuna-anteprima-120x52.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/custom-getenberg-block-nessuna-anteprima.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Blocco Gutenberg senza anteprima<\/figcaption><\/figure>\n\n\n\n<p>Per definire un esempio dobbiamo indicare dei valori di default per ogni attributo che abbiamo creato, in questo modo (vedrai altri esempi nei prossimi blocchi):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        example: {\n            attributes: {\n                content: 'Hello World',\n            },\n        },<\/pre>\n\n\n\n<p class=\"note\">Nota che gli attributi e gli esempi possono essere inseriti anche nel file block.json, per mantenere una certa coerenza tra i vari blocchi che creiamo in questo tutorial, li aggiungo nel file block.js<\/p>\n\n\n\n<p>La funzione edit cambia molto rispetto agli esempi precedenti, dal momento che adesso usiamo richtext,  vediamola insieme:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        edit: function ( props ) {\n            var blockProps = useBlockProps();\n            var content = props.attributes.content;\n            function onChangeContent( newContent ) {\n                props.setAttributes( { content: newContent } );\n            }\n\n            return el(\n                RichText,\n                Object.assign( blockProps, {\n                    tagName: 'p',\n                    onChange: onChangeContent,\n                    value: content,\n                    placeholder: 'Insert text here...',\n                } )\n            );\n        },<\/pre>\n\n\n\n<p>Innanzitutto abbiamo una nuova variabile chiamata content, che prende il valore dell&#8217;attributo content.<\/p>\n\n\n\n<p>Poi abbiamo una funzione &#8220;onChangeContent&#8221; che ad ogni modifica del contenuto del blocco, assegna un nuovo valore alla variabile content.<\/p>\n\n\n\n<p>Infine il nostro return, che fa il return di un richtext, qui vediamo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>blockProps<\/strong>: un oggetto JavaScript che contiene in questo caso la classe che assegniamo al paragrafo.<\/li>\n\n\n\n<li><strong>tagName<\/strong>: il tag html del blocco che stiamo creando, o di questa sezione del blocco.<\/li>\n\n\n\n<li><strong>onChange<\/strong>: che richiama la funzione &#8220;onChangeContent&#8221;. In questo modo ogni volta che eseguiamo una modifica questa viene registrata nella variabile e mostrata come valore.<\/li>\n\n\n\n<li><strong>value:<\/strong> Il valore del campo modificabile, in questo caso il valore del campo di testo.<\/li>\n\n\n\n<li><strong>placeholder<\/strong>: il testo da mostrare quando aggiungiamo il blocco, come tutti i placeholder, sparisce per lasciare spazio al testo appena iniziamo a scrivere il nostro testo.<\/li>\n<\/ul>\n\n\n\n<p>La funzione save a questo punto dovrebbe spiegarsi da sola, qui il risultato finale del nostro file block.js:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( function ( blocks, blockEditor, element ) {\n    var el = element.createElement;\n    var RichText = blockEditor.RichText;\n    var useBlockProps = blockEditor.useBlockProps;\n\n    blocks.registerBlockType( 'supporthost-blocks\/supporthost-03', {\n\n        attributes: {\n            content: {\n                type: 'string',\n                source: 'html',\n                selector: 'p',\n            },\n        },\n        example: {\n            attributes: {\n                content: 'Hello World',\n            },\n        },\n        edit: function ( props ) {\n            var blockProps = useBlockProps();\n            var content = props.attributes.content;\n            function onChangeContent( newContent ) {\n                props.setAttributes( { content: newContent } );\n            }\n\n            return el(\n                RichText,\n                Object.assign( blockProps, {\n                    tagName: 'p',\n                    onChange: onChangeContent,\n                    value: content,\n                    placeholder: 'Insert text here...',\n                } )\n            );\n        },\n\n        save: function ( props ) {\n            var blockProps = useBlockProps.save();\n            return el(\n                RichText.Content,\n                Object.assign( blockProps, {\n                    tagName: 'p',\n                    value: props.attributes.content,\n                } )\n            );\n        },\n    } );\n} )( window.wp.blocks, window.wp.blockEditor, window.wp.element );<\/pre>\n\n\n\n<p>Diamo una grafica al nostro blocco, col file style.css:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.wp-block-supporthost-blocks-supporthost-03 {\n    border-left: 7px solid #6754e2;\n    padding: 10px 10px 10px 1.5em;\n    font-style: italic;\n    margin: 3em 0;\n    box-shadow: 0 2px 12px 0 rgb(0 0 0 \/ 5%), 0 0 35px 0 rgb(0 0 0 \/ 5%), 0 30px 100px -40px rgb(0 0 0 \/ 15%);\n}<\/pre>\n\n\n\n<p>Mentre possiamo lasciare in bianco il file editor.css.<\/p>\n\n\n\n<p class=\"note\">Abbiamo creato un blocco come questo, per aggiungere una nota in evidenza nel nostro blog.<\/p>\n\n\n\n<p>\u00c8 arrivato il momento di dare un po&#8217; di colore al nostro blocco.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"gutenberg-block-supports\">Gutenberg block supports<\/h2>\n\n\n\n<p>In modo semplicissimo possiamo aggiungere il supporto per dei colori base (testo, sfondo e link) per il nostro blocco.<\/p>\n\n\n\n<p>Per farlo, come prima duplichiamo la cartella per supporthost-block-3 facendolo diventare 4, poi modifichiamo il file block.json in modo che abbia questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n    \"apiVersion\": 2,\n    \"title\": \"SupportHost: 04\",\n    \"name\": \"supporthost-blocks\/supporthost-04\",\n    \"category\": \"layout\",\n    \"icon\": \"admin-generic\",\n    \"editorScript\": \"file:.\/block.js\",\n    \"editorStyle\": \"file:.\/editor.css\",\n    \"style\": \"file:.\/style.css\",\n    \"supports\": {\n        \"color\": {\n            \"text\": true,\n            \"background\": true,\n            \"link\": true\n        },\n        \"typography\": {\n            \"fontSize\": true,\n            \"lineHeight\": true\n        },\n        \"align\": true,\n        \"spacing\": {\n            \"margin\": true,\n            \"padding\": true,\n            \"blockGap\": true\n        }\n    }\n}<\/pre>\n\n\n\n<p>Definiamo &#8220;supports&#8221; nel file json, vediamo a cosa servono queste voci:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>color<\/strong>: hai la possibilit\u00e0 di scegliere diversi colori, in questo caso ho abilitato la possibilit\u00e0 di scegliere il colore del testo, il colore di sfondo e il colore dei link.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"224\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-custom-gutenberg-block-supports-1024x224.png\" alt=\"Blocchi Custom Gutenberg Block Supports\" class=\"wp-image-34775\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-custom-gutenberg-block-supports-1024x224.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-custom-gutenberg-block-supports-300x66.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-custom-gutenberg-block-supports-768x168.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-custom-gutenberg-block-supports-120x26.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-custom-gutenberg-block-supports.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>typography<\/strong>: ci d\u00e0 la possibilit\u00e0 di scegliere la dimensione del font e l&#8217;altezza dell&#8217;interlinea.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"419\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-tipografia-1024x419.png\" alt=\"Blocco Gutenberg Supporthost 4 Tipografia\" class=\"wp-image-34906\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-tipografia-1024x419.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-tipografia-300x123.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-tipografia-768x314.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-tipografia-120x49.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-tipografia.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>align<\/strong> (<strong>allinea<\/strong>): aggiunge la possibilit\u00e0 di impostare la larghezza del blocco, questo controllo non si trova nella sidebar, ma nella toolbar direttamente dentro l&#8217;editor.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"528\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-esempio-allinea-1024x528.png\" alt=\"Blocco Gutenberg Personalizzato Esempio Allinea\" class=\"wp-image-34905\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-esempio-allinea-1024x528.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-esempio-allinea-300x155.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-esempio-allinea-768x396.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-esempio-allinea-120x63.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-esempio-allinea.png 1045w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>spacing<\/strong> (<strong>dimensioni<\/strong>): ci permette di aggiungere degli strumenti per margine, padding e gap per il nostro blocco.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"496\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-dimensioni-1024x496.png\" alt=\"Blocco Gutenberg Supporthost 4 Dimensioni\" class=\"wp-image-34907\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-dimensioni-1024x496.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-dimensioni-300x145.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-dimensioni-768x372.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-dimensioni-120x58.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-supporthost-4-dimensioni.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Per maggiori dettagli e altre opzioni supportate controlla la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-supports\/\" rel=\"noopener\">documentazione di WordPress<\/a>, qui ho inserito soltanto quelle che ritengo le pi\u00f9 comuni e utili.<\/p>\n\n\n\n<p>\u00c8 importante modificare il nome del selettore nel file style.css in modo che funzioni correttamente con questo blocco Gutenberg.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"allineamento-del-testo\">Allineamento del testo<\/h2>\n\n\n\n<p>Duplichiamo ancora una volta l&#8217;ultimo blocco Gutenberg che abbiamo creato, modifichiamo il numero da 4 a 5 e aggiungiamo una ulteriore funzione, che ci permetter\u00e0 di controllare l&#8217;allineamento del testo.<\/p>\n\n\n\n<p>Come prima cosa dobbiamo aggiungere un attributo che chiameremo &#8220;alignment&#8221;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        attributes: {\n            content: {\n                type: 'string',\n                source: 'html',\n                selector: 'p',\n            },\n            alignment: {\n                type: 'string',\n                default: 'left',\n            },\n        },<\/pre>\n\n\n\n<p>Aggiungiamo il valore nell&#8217;example:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        example: {\n            attributes: {\n                content: 'Hello World',\n                alignment: 'left',\n            },\n        },<\/pre>\n\n\n\n<p>All&#8217;interno della funzione save creiamo una variabile per &#8220;alignment&#8221; e una funzione per impostare il nuovo valore della variabile quando viene modificato l&#8217;allineamento.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">            var alignment = props.attributes.alignment;\n\n            function onChangeAlignment( newAlignment ) {\n                props.setAttributes( {\n                    alignment:\n                        newAlignment === undefined ? 'left' : newAlignment,\n                } );\n            }<\/pre>\n\n\n\n<p>Infine all&#8217;interno del return della funzione edit dobbiamo aggiungere un blocco, in questo caso il return della funzione si complica perch\u00e9 dobbiamo ritornare dei &#8220;nested divs&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">            return el(\n                'div',\n                blockProps,\n                el(\n                    BlockControls,\n                    { key: 'controls' },\n                    el( AlignmentToolbar, {\n                        value: alignment,\n                        onChange: onChangeAlignment,\n                    } )\n                ),\n                el( RichText, {\n                    key: 'richtext',\n                    tagName: 'p',\n                    style: { textAlign: alignment },\n                    onChange: onChangeContent,\n                    value: content,\n                } )\n            );<\/pre>\n\n\n\n<p>Per la funzione &#8220;save&#8221; invece usiamo l&#8217;attributo alignment per aggiungere una classe, poi tramite il file style.css impostiamo l&#8217;allineamento in modo corretto.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        save: function ( props ) {\n            var blockProps = useBlockProps.save();\n\n            return el(\n                'div',\n                blockProps,\n                el( RichText.Content, {\n                    tagName: 'p',\n                    className:\n                        'supporthost-block-align-' +\n                        props.attributes.alignment,\n                    value: props.attributes.content,\n                } )\n            );\n        },<\/pre>\n\n\n\n<p>E aggiungiamo al file style.css questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.supporthost-block-align-left {\n    text-align: left;\n}\n\n.supporthost-block-align-center {\n\ttext-align: center;\n}\n\n.supporthost-block-align-right {\n\ttext-align: right;\n}<\/pre>\n\n\n\n<p>Come per gli altri blocchi, possiamo attivare il plugin, fare un hard refresh dell&#8217;editor e usare il blocco, in questo caso il blocco SupportHost 05.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"296\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-quinto-blocco.png\" alt=\"Blocchi Gutenberg Personalizzati Quinto Blocco\" class=\"wp-image-34900\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-quinto-blocco.png 937w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-quinto-blocco-300x95.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-quinto-blocco-768x243.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-quinto-blocco-120x38.png 120w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure>\n\n\n\n<p>Ma come possiamo avere pi\u00f9 campi, per creare un blocco Gutenberg pi\u00f9 complesso?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"un-blocco-per-le-recensioni\">Un blocco per le recensioni<\/h2>\n\n\n\n<p>Prendiamo come esempio i box che usiamo nel sito di SupportHost per le recensioni:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"495\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/supporthost-recensioni-hosting-condiviso-1024x495.png\" alt=\"Supporthost Recensioni Hosting Condiviso\" class=\"wp-image-34778\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/supporthost-recensioni-hosting-condiviso-1024x495.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/supporthost-recensioni-hosting-condiviso-300x145.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/supporthost-recensioni-hosting-condiviso-768x371.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/supporthost-recensioni-hosting-condiviso-120x58.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/supporthost-recensioni-hosting-condiviso.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Per fare qualcosa di simile, quello che farei \u00e8 usare il blocco colonne di Gutenberg, poi creare un blocco con 3 diversi input, uno per il nome, uno per la posizione\/professione ed uno per la recensione.<\/p>\n\n\n\n<p>Vediamo come possiamo creare un blocco di questo tipo.<\/p>\n\n\n\n<p>Prima di tutto duplichiamo il nuovo plugin e cambiamo i vari nomi in modo di passare da 5 a 6, questo sar\u00e0 il nostro blocco numero 6.<\/p>\n\n\n\n<p>Come prima dobbiamo aggiungere 2 nuovi attributi, uno per il nome e uno per la posizione:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        attributes: {\n            name: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-name',\n            },\n            position: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-position',\n            },\n            content: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-content',\n            },\n            alignment: {\n                type: 'string',\n                default: 'center',\n            },\n        },<\/pre>\n\n\n\n<p>Come probabilmente hai notato, in questo caso come &#8220;selector&#8221; non usiamo un elemento HTML, ma una classe, in modo che da avere un selettore univoco per ogni attributo.<\/p>\n\n\n\n<p>Come abbiamo fatto prima aggiungiamo le voci al nostro esempio:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        example: {\n            attributes: {\n                name: 'Ivan',\n                position: 'SupportHost',\n                content: 'Lorem ipsum dolor sit amet..',\n                alignment: 'center'\n            },\n        },<\/pre>\n\n\n\n<p>Ho accorciato il valore di content per semplicit\u00e0 in questo esempio.<\/p>\n\n\n\n<p>Adesso dobbiamo andare a modificare le funzioni edit e save, aggiungendo come prima cosa le variabili per name e position, e le funzioni per l&#8217;aggiornamento del valore con la funzione onChange:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">            var name = props.attributes.name;\n            var position = props.attributes.position;\n\n            function onChangeName( newName ) {\n                props.setAttributes( { name: newName } );\n            }\n            function onChangePosition( newPosition ) {\n                props.setAttributes( { position: newPosition } );\n            }<\/pre>\n\n\n\n<p>Quindi aggiungiamo il codice nel return:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">                el( RichText, {\n                    key: 'richtext',\n                    tagName: 'p',\n                    style: { textAlign: alignment },\n                    onChange: onChangeName,\n                    value: name,\n                    placeholder: 'Insert name here...'\n                } ),\n                el( RichText, {\n                    key: 'richtext',\n                    tagName: 'p',\n                    style: { textAlign: alignment },\n                    onChange: onChangePosition,\n                    value: position,\n                    placeholder: 'Insert position here...'\n                } ),<\/pre>\n\n\n\n<p>Facciamo lo stesso anche per la funzione save, in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">                el( RichText.Content, {\n                    tagName: 'p',\n                    className:\n                        'supporthost-testimonial-name supporthost-block-align-' +\n                        props.attributes.alignment,\n                    value: props.attributes.name,\n                } ),\n                el( RichText.Content, {\n                    tagName: 'p',\n                    className:\n                        'supporthost-testimonial-position supporthost-block-align-' +\n                        props.attributes.alignment,\n                    value: props.attributes.position,\n                } ),<\/pre>\n\n\n\n<p>Il codice completo di block.js risulta essere:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( function ( blocks, element, blockEditor ) {\n    var el = element.createElement;\n    var RichText = blockEditor.RichText;\n    var useBlockProps = blockEditor.useBlockProps;\n    var BlockControls = blockEditor.BlockControls;\n    var AlignmentToolbar = blockEditor.AlignmentToolbar;\n\n    blocks.registerBlockType( 'supporthost-blocks\/supporthost-06', {\n\n        attributes: {\n            name: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-name',\n            },\n            position: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-position',\n            },\n            content: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-content',\n            },\n            alignment: {\n                type: 'string',\n                default: 'center',\n            },\n        },\n        example: {\n            attributes: {\n                name: 'Ivan',\n                position: 'SupportHost',\n                content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec egestas semper feugiat. Proin tempus sem nec sapien pulvinar tristique vitae ac odio. Ut laoreet ligula id auctor hendrerit. Aliquam rutrum eu enim quis sollicitudin. Donec ut bibendum nisl. Etiam tempor, dolor id interdum vehicula, metus tortor vestibulum lorem, nec volutpat eros odio id orci. Donec vitae suscipit orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Ut malesuada luctus lectus, at ullamcorper dolor tempor in. Sed sed ex ullamcorper, convallis elit et, interdum elit. Etiam massa magna, cursus eget lorem vel, varius malesuada nibh. Donec non enim interdum, pellentesque enim efficitur, scelerisque turpis. Fusce lacus nulla, consectetur sed orci quis, luctus interdum nisi.',\n                alignment: 'center'\n            },\n        },\n        \n        edit: function ( props ) {\n            var blockProps = useBlockProps();\n            var name = props.attributes.name;\n            var position = props.attributes.position;\n            var content = props.attributes.content;\n            var alignment = props.attributes.alignment;\n\n            function onChangeName( newName ) {\n                props.setAttributes( { name: newName } );\n            }\n            function onChangePosition( newPosition ) {\n                props.setAttributes( { position: newPosition } );\n            }\n            function onChangeContent( newContent ) {\n                props.setAttributes( { content: newContent } );\n            }\n\n            function onChangeAlignment( newAlignment ) {\n                props.setAttributes( {\n                    alignment:\n                        newAlignment === undefined ? 'center' : newAlignment,\n                } );\n            }\n\n            return el(\n                'div',\n                blockProps,\n                el(\n                    BlockControls,\n                    { key: 'controls' },\n                    el( AlignmentToolbar, {\n                        value: alignment,\n                        onChange: onChangeAlignment,\n                    } )\n                ),\n                el( RichText, {\n                    key: 'richtext',\n                    tagName: 'p',\n                    style: { textAlign: alignment },\n                    onChange: onChangeName,\n                    value: name,\n                    placeholder: 'Insert name here...'\n                } ),\n                el( RichText, {\n                    key: 'richtext',\n                    tagName: 'p',\n                    style: { textAlign: alignment },\n                    onChange: onChangePosition,\n                    value: position,\n                    placeholder: 'Insert position here...'\n                } ),\n                el( RichText, {\n                    key: 'richtext',\n                    tagName: 'p',\n                    style: { textAlign: alignment },\n                    onChange: onChangeContent,\n                    value: content,\n                    placeholder: 'Insert review here...'\n                } )\n            );\n        },\n\n        save: function ( props ) {\n            var blockProps = useBlockProps.save();\n\n            return el(\n                'div',\n                blockProps,\n                el( RichText.Content, {\n                    tagName: 'p',\n                    className:\n                        'supporthost-testimonial-name supporthost-block-align-' +\n                        props.attributes.alignment,\n                    value: props.attributes.name,\n                } ),\n                el( RichText.Content, {\n                    tagName: 'p',\n                    className:\n                        'supporthost-testimonial-position supporthost-block-align-' +\n                        props.attributes.alignment,\n                    value: props.attributes.position,\n                } ),\n                el( RichText.Content, {\n                    tagName: 'p',\n                    className:\n                        'supporthost-testimonial-content supporthost-block-align-' +\n                        props.attributes.alignment,\n                    value: props.attributes.content,\n                } )\n            );\n        },\n\n    } );\n} )( \n    window.wp.blocks,\n\twindow.wp.element,\n\twindow.wp.blockEditor\n );<\/pre>\n\n\n\n<p>Abbiamo bisogno di alcuni aggiustamenti al file style.css in modo che il blocco abbia una grafica accattivante. Diamo una dimensione del font superiore al nome, mentre riduciamo la dimensione del font della posizione e del testo delle recensione:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.wp-block-supporthost-blocks-supporthost-06 {\n\tborder-top: 5px solid #fca249;\n\tpadding: 25px;\n\ttransition-property: all;\n    transition-duration: 0.5s;\n    box-shadow: 0 5px 6px 0 rgb(0 0 0 \/ 23%);\n}\n\n.supporthost-testimonial-name {\n\tmargin-top: 30px;\n\tfont-weight: 700;\n\tfont-size: 1.25em;\n}\n\n.supporthost-testimonial-position {\n\tmargin-top: 15px;\n\topacity: 0.75;\n\tfont-size: 0.75em;\n}\n\n.supporthost-testimonial-content {\n\tmargin-top: 15px;\n\tfont-size: 0.75em;\n}\n\n.wp-block-supporthost-blocks-supporthost-06:hover {\n\ttransform: scale(1.05,1.05);\n}\n\n.supporthost-block-align-left {\n    text-align: left;\n}\n\n.supporthost-block-align-center {\n\ttext-align: center;\n}\n\n.supporthost-block-align-right {\n\ttext-align: right;\n}<\/pre>\n\n\n\n<p>E siamo pronti ad usare il blocco, ovviamente solo dopo aver attivato il plugin e fatto un hard refresh della pagina dell&#8217;editor.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"969\" height=\"442\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-sesto-blocco.png\" alt=\"Blocchi Gutenberg Personalizzati Sesto Blocco\" class=\"wp-image-34902\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-sesto-blocco.png 969w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-sesto-blocco-300x137.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-sesto-blocco-768x350.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-sesto-blocco-120x55.png 120w\" sizes=\"auto, (max-width: 969px) 100vw, 969px\" \/><\/figure>\n\n\n\n<p>E se vogliamo aggiungere un&#8217;immagine?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creare-un-blocco-con-una-immagine\">Creare un blocco con una immagine<\/h2>\n\n\n\n<p>Se vogliamo aggiungere un&#8217;immagine a un blocco Gutenberg, dobbiamo aggiungere 2 diversi attributi, uno per l&#8217;ID dell&#8217;immagine e uno per l&#8217;url.<\/p>\n\n\n\n<p>Dovremo aggiungere una nuova dipendenza nel file block.js, components.<\/p>\n\n\n\n<p>E ovviamente modificare le funzioni edit e save.<\/p>\n\n\n\n<p>Iniziamo.<\/p>\n\n\n\n<p>Dopo che abbiamo duplicato il plugin e modificato i nomi per dargli un nuovo numero, aggiungiamo la nuova dipendenza in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( function ( blocks, element, blockEditor, components ) {\n\n...\n\n} )( \n    window.wp.blocks,\n    window.wp.element,\n    window.wp.blockEditor,\n    window.wp.components\n );<\/pre>\n\n\n\n<p>Aggiungiamo i 2 attributi che ci servono per l&#8217;immagine:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        attributes: {\n            mediaID: {\n\t\ttype: 'number',\n\t    },\n\t    mediaURL: {\n\t\ttype: 'string',\n\t\tsource: 'attribute',\n\t\tselector: 'img',\n\t\tattribute: 'src',\n\t    },\n            name: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-name',\n            },\n            position: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-position',\n            },\n            content: {\n                type: 'string',\n                source: 'html',\n                selector: '.supporthost-testimonial-content',\n            },\n            alignment: {\n                type: 'string',\n                default: 'center',\n            },\n        },<\/pre>\n\n\n\n<p>E come negli altri casi aggiungiamo gli stessi dati nell&#8217;example:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        example: {\n            attributes: {\n                name: 'Ivan',\n                position: 'SupportHost',\n                content: 'Lorem ipsum dolor sit amet...',\n                alignment: 'center',\n                mediaID: 1,\n\t\tmediaURL: 'https:\/\/images.unsplash.com\/photo-1549150712-1d243024db80?ixlib=rb-4.0.3&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=1480&amp;q=80',\n            },\n        },<\/pre>\n\n\n\n<p>In questo caso ho usato un link verso un&#8217;immagine su unsplash da mostrare nell&#8217;anteprima, sperando che non verr\u00e0 eliminata, in caso nell&#8217;anteprima si vedr\u00e0 un&#8217;immagine mancante.<\/p>\n\n\n\n<p>Anche qui ho accorciato il contenuto di content, per semplificare il codice.<\/p>\n\n\n\n<p>Adesso andiamo ad aggiungere la variabile e la funzione per l&#8217;immagine all&#8217;interno della funzione edit:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">            var mediaID = props.attributes.mediaID;\n            var mediaURL = props.attributes.mediaURL;\n\n            var onSelectImage = function ( media ) {\n\t\treturn props.setAttributes( {\n\t\t\tmediaURL: media.url,\n\t\t\tmediaID: media.id,\n\t\t} );\n\t    };<\/pre>\n\n\n\n<p>Il prossimo passo \u00e8 aggiungere il codice nel return della funzione edit per mostrare il bottone per aggiungere un&#8217;immagine direttamente nel blocco.<\/p>\n\n\n\n<p>Ho deciso di mostrare un&#8217;immagine prima del nome, la foto della persona che lascia la recensione.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">el(\n    'div',\n    { className: 'supporthost-testimonial-image', style: { textAlign: alignment }, },\n    el( MediaUpload, {\n        onSelect: onSelectImage,\n        allowedTypes: 'image',\n        value: mediaID,\n        render: function ( obj ) {\n            return el(\n                components.Button,\n                {\n                    className: mediaID\n                        ? 'image-button'\n                        : 'button button-large',\n                    onClick: obj.open,\n                },\n                ! mediaID\n                    ? 'Upload Image'\n                    : el( 'img', { src: mediaURL } )\n            );\n        },\n    } )\n),<\/pre>\n\n\n\n<p>Allo stesso modo dobbiamo modificare il return della funzione save:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">el(\n  'div',\n  { className: 'supporthost-testimonial-image supporthost-block-align-' + props.attributes.alignment, },\n  el( 'img', { src: props.attributes.mediaURL } )\n),<\/pre>\n\n\n\n<p>Per questioni di semplicit\u00e0 ti consiglio di scaricare il file da GitHub per controllare il codice completo.<\/p>\n\n\n\n<p>Per avere un effetto grafico pi\u00f9 carino ho aggiunto del codice css al file style.css precedente, nel dettaglio ho aggiunto:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.supporthost-testimonial-image img {\n    border-radius: 100%;\n    max-width: 125px;\n    border: 3px solid #000;\n}<\/pre>\n\n\n\n<p>E per sistemare al meglio l&#8217;immagine nell&#8217;editor ho aggiunto nel file editor.css:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.supporthost-testimonial-image img {\n    margin-top: 50%;\n}<\/pre>\n\n\n\n<p>Questo \u00e8 l&#8217;aspetto dei due blocchi che abbiamo creato per le recensioni. Quello a sinistra \u00e8 l&#8217;esempio precedente, senza immagine, e quello a destra \u00e8 quello in cui abbiamo inserito l&#8217;immagine.<\/p>\n\n\n\n<p>Ecco come vediamo i nostri due blocchi nell&#8217;editor:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"540\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-editor-1024x540.png\" alt=\"Blocchi Gutenberg Personalizzati Editor\" class=\"wp-image-34817\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-editor-1024x540.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-editor-300x158.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-editor-768x405.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-editor-120x63.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocchi-gutenberg-personalizzati-editor.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>E qui ti mostro i blocchi Gutenberg che abbiamo creato con un esempio in cui abbiamo inserito testo e immagini:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"924\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-con-immagine.png\" alt=\"Blocco Gutenberg Personalizzato Con Immagine\" class=\"wp-image-34815\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-con-immagine.png 1023w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-con-immagine-300x271.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-con-immagine-768x694.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/11\/blocco-gutenberg-personalizzato-con-immagine-70x63.png 70w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><\/figure>\n\n\n\n<p>Inoltre, non so se avevi notato che nel blocco precedente il nome, la posizione e il testo della recensione non avevano uno stile, in questo blocco ho risolto aggiungendo le diverse classi in questo modo nell&#8217;HTML dell&#8217;editor.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">className: 'supporthost-testimonial-name',<\/pre>\n\n\n\n<p>Fino ad ora abbiamo creato dei blocchi statici, ma come possiamo prendere dei dati dal database in tempo reale e creare dei blocchi dinamici?<\/p>\n\n\n\n<p>Ad esempio, come possiamo fare se vogliamo mostrare la lista degli ultimi 10 post?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creare-un-blocco-dinamico\">Creare un blocco dinamico<\/h2>\n\n\n\n<p>Per creare un blocco dinamico non serve la funzione save. I dati infatti vengono presi in tempo reale dal database, e non avrebbe senso scrivere la lista degli ultimi 10 post nel database.<\/p>\n\n\n\n<p>Iniziamo col creare una cartella che chiameremo &#8220;supporthost-block-8&#8221; e il relativo file &#8220;supporthost-block-8.php&#8221;.<\/p>\n\n\n\n<p>Il file php avr\u00e0 questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;?php\n\/**\n * Plugin Name: SupportHost block 08\n *\/\n\nfunction supporthost_block_dynamic_render_callback( $block_attributes, $content ) {\n    $recent_posts = wp_get_recent_posts( array(\n        'numberposts' =&gt; 3,\n        'post_status' =&gt; 'publish',\n    ) );\n\n    if ( count( $recent_posts ) === 0 ) {\n        return 'No posts yet';\n    }\n\n    $return = '&lt;ul&gt;';\n    foreach ( $recent_posts as $post ) {\n        $return .= sprintf(\n            '&lt;li&gt;&lt;a class=\"wp-block-my-plugin-latest-post\" href=\"%1$s\"&gt;%2$s&lt;\/a&gt;&lt;\/li&gt;',\n            esc_url( get_permalink( $post['ID'] ) ),\n            esc_html( get_the_title( $post['ID'] ) )\n        );\n    }\n    $return .= '&lt;\/ul&gt;';\n\n    return $return;\n}\n\nfunction supporthost_block_08_register_block() {\n\n    register_block_type( __DIR__ , array(\n        'render_callback' =&gt; 'supporthost_block_dynamic_render_callback'\n    ) );\n\n}\nadd_action( 'init', 'supporthost_block_08_register_block' );<\/pre>\n\n\n\n<p>La prima funzione &#8220;supporthost_block_dynamic_render_callback&#8221; \u00e8 la funzione callback.<\/p>\n\n\n\n<p>In altre parole \u00e8 la funzione che cerca gli ultimi post nel database, e restituisce il codice HTML che visualizzeremo nell&#8217;editor e nel frontend del sito.<\/p>\n\n\n\n<p>La funzione &#8220;supporthost_block_08_register_block&#8221;,  come per gli altri blocchi, serve a registrare il blocco, chiamando il file block.json con la differenza che qui passiamo nel secondo paragrafo un array per chiamare la funzione di callback.<\/p>\n\n\n\n<p>Creiamo il file block.asset.php ed inseriamo questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;?php return\n    array( 'dependencies' =&gt;\n        array(\n            'wp-blocks',\n            'wp-element',\n            'wp-block-editor',\n            'wp-polyfill',\n            'wp-server-side-render'\n        ),\n        'version' =&gt; '0.1'\n    );<\/pre>\n\n\n\n<p>Dal momento che vogliamo usare serverSideRender per vedere il widget identico sia nell&#8217;editor che nel frontend.<\/p>\n\n\n\n<p>Creiamo il file block.json, che come per gli altri blocchi contiene le informazioni del blocco, nel nostro caso specifico:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n    \"apiVersion\": 2,\n    \"title\": \"SupportHost: 08\",\n    \"name\": \"supporthost-blocks\/supporthost-08\",\n    \"category\": \"layout\",\n    \"icon\": \"admin-generic\",\n    \"editorScript\": \"file:.\/block.js\",\n    \"editorStyle\": \"file:.\/editor.css\",\n    \"style\": \"file:.\/style.css\"\n}<\/pre>\n\n\n\n<p>Dal momento che sto chiamando i files style.css e editor.css, li creo ma li lascio vuoti per il momento.<\/p>\n\n\n\n<p>Creo il file block.js con il seguente codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( function ( blocks, element, serverSideRender, blockEditor ) {\n        var el = element.createElement,\n        registerBlockType = blocks.registerBlockType,\n        ServerSideRender = serverSideRender,\n        useBlockProps = blockEditor.useBlockProps;\n\n    registerBlockType( 'supporthost-blocks\/supporthost-08', {\n\n        edit: function ( props ) {\n            var blockProps = useBlockProps();\n            return el(\n                'div',\n                blockProps,\n                el( ServerSideRender, {\n                    block: 'supporthost-blocks\/supporthost-08',\n                    attributes: props.attributes,\n                } )\n            );\n        },\n    } );\n} )(\n    window.wp.blocks,\n    window.wp.element,\n    window.wp.serverSideRender,\n    window.wp.blockEditor\n);<\/pre>\n\n\n\n<p>In pratica abbiamo soltanto la funzione edit, che restituisce il codice che generiamo con la funzione php di callback.<\/p>\n\n\n\n<p>Se hai seguito il tutorial fino a qui, questo codice dovrebbe spiegarsi da solo.<\/p>\n\n\n\n<p>Definiamo delle variabili e abbiamo un return per la funzione edit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusioni\">Conclusioni<\/h2>\n\n\n\n<p>In questo tutorial abbiamo imparato come creare dei blocchi Gutenberg personalizzati usando JavaScript. Siamo partiti da un esempio basilare per comprendere la struttura di un blocco. <\/p>\n\n\n\n<p>Con esempi via via pi\u00f9 complessi abbiamo visto quali sono le potenzialit\u00e0 dei blocchi e cosa ci permettono di fare. <\/p>\n\n\n\n<p>Adesso dovresti avere le basi per creare i blocchi in base alle tue esigenze. Se, invece, ti interessa gestire le condizioni di visibilit\u00e0, cio\u00e8 scegliere se rendere visibile un blocco solo in alcune circostanze, controlla la guida sulla <a href=\"https:\/\/supporthost.com\/it\/visibilita-blocchi-wordpress\/\">gestione della visibilit\u00e0 dei blocchi<\/a> su WordPress.<\/p>\n\n\n\n<p>\u00c8 tutto chiaro? Sei riuscito a seguire il tutorial e a creare dei nuovi blocchi? Fammi sapere con un commento.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo tutorial impareremo a creare un blocco Gutenberg personalizzato. Ci sono diversi modi di creare blocchi, per semplificare la procedura e renderla comprensibile a tutti utilizzeremo plain JavaScript. Abbiamo scelto di seguire questo metodo e non utilizzare JSX per evitare la compilazione. Per riuscire a seguire questo tutorial devi solo avere conoscenze di base [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":63771,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[33],"tags":[],"class_list":["post-34484","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"acf":[],"_links":{"self":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts\/34484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/comments?post=34484"}],"version-history":[{"count":8,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts\/34484\/revisions"}],"predecessor-version":[{"id":133442,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts\/34484\/revisions\/133442"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/media\/63771"}],"wp:attachment":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/media?parent=34484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/categories?post=34484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/tags?post=34484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}