{"id":233776,"date":"2023-02-20T10:01:00","date_gmt":"2023-02-20T07:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233776"},"modified":"2023-02-26T12:25:48","modified_gmt":"2023-02-26T09:25:48","slug":"aggiungi-impostazioni-personalizzate-ai-blocchi-gutenberg-di-wordpress-esistenti","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/aggiungi-impostazioni-personalizzate-ai-blocchi-gutenberg-di-wordpress-esistenti\/","title":{"rendered":"Aggiungi impostazioni personalizzate ai blocchi Gutenberg di WordPress esistenti"},"content":{"rendered":"\n<p>Ti sei mai trovato nella situazione in cui desideri aggiungere le tue impostazioni personalizzate ai blocchi Gutenberg di WordPress? In questo post andremo nel dettaglio su come farlo. Troverai due codici di esempio di casi d&#8217;uso reali per l&#8217;aggiunta di impostazioni personalizzate ai blocchi di WordPress.<\/p>\n<p>Tieni presente che poich\u00e9 i blocchi di Gutenberg sono Javascript, la loro modifica richiede la scrittura del codice in Javascript. Proprio come il codice PHP di WordPress ha hook e filtri che consentono agli sviluppatori di temi o plugin di modificarne il codice, ci sono anche filtri nel codice Javascript di WordPress. Analogamente alla <code>[add_filter](https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/)()<\/code>funzione di PHP, abbiamo la funzione Javascript <code>[addFilter](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-hooks\/#api-usage)()<\/code>.<\/p>\n<p>Scriver\u00f2 il codice nella sintassi Javascript ES6, che richiede un compilatore per trasformarlo. Puoi scrivere con la sintassi ES5 ma ti consiglio di usare ES6\/ESNext. Ho un <a href=\"https:\/\/wordpress.mediadoma.com\/it\/guida-completa-alla-creazione-di-un-ambiente-di-sviluppo-per-gutenberg\/\" title=\"post che spiega come configurare un trasformatore per ES6\/ESNext\">post che spiega come configurare un trasformatore per ES6\/ESNext<\/a>. Presumo anche che tu abbia una certa familiarit\u00e0 con React\/JSX, forse una certa esperienza su <a href=\"https:\/\/wordpress.mediadoma.com\/it\/come-creare-un-blocco-gutenberg-personalizzato-per-wordpress-serie-di-tutorial\/\" title=\"come creare i tuoi blocchi Gutenberg personalizzati\">come creare i tuoi blocchi Gutenberg personalizzati<\/a>.<\/p>\n<h2>Cosa puoi filtrare sui blocchi di Gutenberg<\/h2>\n<p>Non c&#8217;\u00e8 molta documentazione negli hook e nei filtri Gutenberg disponibili. Ma allo scopo di aggiungere impostazioni personalizzate e in qualche modo applicarle ai blocchi esistenti; questo \u00e8 quello che ho trovato finora. Mi sono concentrato sull&#8217;aggiunta di impostazioni semplici, non su operazioni che richiedono modifiche drastiche dei componenti o comportamenti complessi.<\/p>\n<p>Ci sono tre passaggi per aggiungere impostazioni personalizzate ai blocchi esistenti:<\/p>\n<ul>\n<li>Aggiungiamo un filtro <code>[registerBlockType](https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-registration\/#registerblocktype)<\/code>sull&#8217;array delle impostazioni del blocco esistente. Questo ci consente di aggiungere nuovi attributi <code>attributes<\/code>all&#8217;array, consentendoci cos\u00ec di salvare informazioni aggiuntive sul blocco. Dobbiamo salvare la nostra impostazione personalizzata da qualche parte.<\/li>\n<li>Aggancia al componente del blocco <code>edit<\/code>(il componente responsabile del rendering del blocco nell&#8217;editor). In questo gancio possiamo agganciarci all&#8217;Inspector (la barra laterale) e aggiungere i nostri componenti. Possiamo aggiungere una nuova sezione\/riquadro o agganciarci alla sezione &quot;Avanzate&quot; che \u00e8 sempre presente in tutti i blocchi. Poi sta a noi renderizzare gli input delle impostazioni, come input di testo, caselle di controllo o quant&#8217;altro.<\/li>\n<li><code>save<\/code>Filtra gli oggetti di scena del blocco. Possiamo regolare gli oggetti di scena per il salvataggio, che \u00e8 responsabile sia del salvataggio del blocco che del rendering nel frontend (al di fuori dell&#8217;editor). Nel nostro caso vogliamo aggiungere una classe o uno stile inline.<\/li>\n<\/ul>\n<p>Possiamo prendere di mira blocchi specifici o tutti. Abbiamo sempre accesso al tipo di blocco in cui ci troviamo.<\/p>\n<p>Per dirlo in altre parole: aggiungiamo alcune impostazioni personalizzate in Inspector e le salviamo negli attributi personalizzati che abbiamo aggiunto al blocco. Possiamo quindi influenzare il nome della classe del blocco o lo stile inline (in alcuni casi), a seconda degli attributi salvati. Con i nomi delle classi personalizzate possiamo aggiungere facilmente CSS personalizzati che danno visivamente un effetto alle nostre impostazioni.<\/p>\n<h2>Cosa non possiamo fare (per ora?)<\/h2>\n<p>Sfortunatamente ci sono alcune cose a cui non possiamo accedere con i filtri sui blocchi esistenti. Per quanto riguarda l&#8217;aggiunta di semplici impostazioni personalizzate ai blocchi, queste sono cose comuni che non possiamo influenzare.<\/p>\n<h3>Nessun accesso allo stile in linea del blocco all&#8217;interno dell&#8217;editor<\/h3>\n<p>Nei casi in cui le impostazioni influiscono sul design di un blocco, \u00e8 necessario aggiungere uno stile in linea sul nodo di wrapping del blocco. Solo il nome della classe non va bene. Ad esempio, se aggiungi un&#8217;impostazione di colore personalizzata e l&#8217;utente seleziona un colore personalizzato (da colorpicker), non puoi risolverlo aggiungendo una classe: hai bisogno di uno stile in linea.<\/p>\n<p>Sfortunatamente sembra che i blocchi predefiniti di WordPress gestiscano lo stile inline nell&#8217;editor in modo completamente indipendente senza alcuna opzione di filtraggio o &quot;aggancio&quot;. Mostrer\u00f2 un modo per aggirare questo problema nell&#8217;ultimo esempio di seguito, ma non \u00e8 l&#8217;ideale in tutti i casi.<\/p>\n<p>Perch\u00e9 importa che il blocco appaia in modo diverso nell&#8217;editor rispetto al frontend, potresti chiedere? Il punto centrale di Gutenberg \u00e8 implementare un modo visivo per modificare i contenuti in cui ci\u00f2 che vediamo \u00e8 effettivamente ci\u00f2 che otteniamo. Vogliamo ottenere lo stesso aspetto visivo sia nell&#8217;editor che nel frontend.<\/p>\n<h3>Alcuni blocchi non includono il nome della classe nell&#8217;editor<\/h3>\n<p>Come accennato in precedenza, possiamo filtrare il nome della classe di wrapping del blocco poich\u00e9 si tratta di un oggetto che viene passato a tutti i blocchi Gutenberg. Ma sfortunatamente ci sono alcuni blocchi che non applicano affatto la classe del blocco in <code>edit<\/code>. Un esempio \u00e8 il blocco Cover. Ho giocato molto usando i blocchi Cover come &quot;sezioni&quot; per le prime pagine e continuo a riscontrare problemi perch\u00e9 il blocco Cover crea la propria classe all&#8217;interno <code>edit<\/code>. Salta completamente la classe &quot;globale&quot; del blocco (che \u00e8 quella a cui abbiamo accesso tramite i filtri).<\/p>\n<p>Ma almeno possiamo essere sicuri che i nomi delle classi filtrati vengono sempre applicati in <code>save<\/code>(frontend). Ci\u00f2 avviene automaticamente al di fuori del codice specifico di ogni blocco.<\/p>\n<p>Se sbaglio su qualcuno di quanto sopra, PER FAVORE fatemelo sapere nei commenti qui sotto! Sto imparando continuamente Gutenberg e allo stesso tempo anche Gutenberg si evolve. Spero che a un certo punto quanto sopra sar\u00e0 possibile a un certo punto o che sia possibile, ma mi mancano solo alcune informazioni cruciali!<\/p>\n<p>Detto questo, iniziamo a esaminare un po&#8217; di codice.<\/p>\n<h2>Esempio 1: aggiungi un campo di attivazione\/disattivazione per nascondere un blocco Cover su dispositivo mobile<\/h2>\n<p>Supponiamo di sviluppare un tema in cui i blocchi di copertina verranno utilizzati per le &quot;sezioni&quot; sulla prima pagina. E vogliamo fornire all&#8217;utente la possibilit\u00e0 di nascondere una determinata sezione dal cellulare. Per risolvere questo problema, possiamo aggiungere un campo di attivazione\/disattivazione nella sezione &quot;Avanzate&quot; nell&#8217;Inspector del blocco Cover. Se il campo \u00e8 attivato, il blocco Cover ricever\u00e0 una classe personalizzata aggiuntiva che possiamo indirizzare con CSS e media query.<\/p>\n<p>A proposito: questo \u00e8 un caso in cui il problema del blocco Cover che non applica i nostri nomi di classe personalizzati nell&#8217;editor \u00e8 effettivamente un vantaggio! Immagina se lo facesse; quindi sarebbe impossibile per l&#8217;utente modificare il blocco nell&#8217;editor se ha uno schermo piccolo!<\/p>\n<p>Come accennato in precedenza, ci sono tre passaggi per i quali dobbiamo programmare. Abbiamo anche bisogno di aggiungere del PHP per accodare il nostro file Javascript all&#8217;editor. Facciamolo prima.<\/p>\n<h3>Aggiunta del nostro script all&#8217;editor<\/h3>\n<p>Agganciamo una funzione all&#8217;azione <code>[enqueue_block_editor_assets](https:\/\/developer.wordpress.org\/reference\/hooks\/enqueue_block_editor_assets\/)<\/code>. All&#8217;interno della nostra funzione accodiamo uno script, proprio come faremmo normalmente in <code>wp_enqueue_scripts<\/code>hook.<\/p>\n<pre><code>add_action('enqueue_block_editor_assets', function() {\n    wp_enqueue_script('awp-gutenberg-filters', get_template_directory_uri(). '\/assets\/js\/gutenberg-filters.js', ['wp-edit-post']);\n});<\/code><\/pre>\n<p>Ricorda di modificare il percorso in cui si trova il tuo script! Nota: se stai scrivendo in ES6 con webpack compilando il tuo Javascript, ricorda di impostare il percorso per la build del tuo script, non il sorgente.<\/p>\n<p>Mi piace aggiungere &#8216; <code>wp-edit-post<\/code>&#8216; come dipendenza allo script per assicurarmi che venga caricato abbastanza tardi.<\/p>\n<p>Questo \u00e8 tutto il PHP che dobbiamo fare. Il resto \u00e8 scritto nel nostro file Javascript.<\/p>\n<h3>Aggiungi un attributo personalizzato<\/h3>\n<p>Il primo filtro che useremo \u00e8 l&#8217;oggetto delle impostazioni di <code>blocks.registerBlockType<\/code>quali filtri .<code>registerBlockType<\/code><\/p>\n<p>Ma prima, un po&#8217; sull&#8217;aggiunta di filtri in Javascript. Dal momento che non ho trovato alcuna buona documentazione per questo, lo spiegher\u00f2 un po &#8216;qui. La funzione <code>addFilter<\/code>si trova nello spazio dei <code>wp.hooks<\/code>nomi e accetta quattro argomenti.<\/p>\n<p><code>addFilter('hookName', 'namespace', 'functionName', 'priority');<\/code><\/p>\n<p>Il primo parametro, &#8216;hookName&#8217;, \u00e8 il nome del filtro a cui vogliamo agganciarci. Questo \u00e8 l&#8217;equivalente del primo parametro quando si utilizza PHP <code>add_filter()<\/code>. Il secondo parametro, &#8216;namespace&#8217;, \u00e8 uno spazio dei nomi personalizzato per il codice. Questo \u00e8 solo per evitare la collisione dei nomi. Puoi praticamente impostare tutto ci\u00f2 che vuoi qui, ma non usare lo spazio dei nomi di WordPress (&quot;wp&quot;). Usa una forma abbreviata del tuo nome o del nome del progetto. Il terzo parametro, &#8216;functionName&#8217;, \u00e8 la funzione agganciata, che \u00e8 la stessa del <code>add_filter()<\/code>secondo argomento di PHP. E infine il quarto parametro, &#8216;priorit\u00e0&#8217;, \u00e8 facoltativo. Ancora una volta, questo \u00e8 lo stesso del <code>add_filter()<\/code>terzo argomento di PHP.<\/p>\n<p>Il processo per i filtri in Javascript \u00e8 lo stesso di PHP. Definiamo una funzione che deve restituire la variabile filtrata. A volte la variabile \u00e8 una stringa, un oggetto o un componente. All&#8217;interno della funzione modifichiamo la variabile come meglio crediamo.<\/p>\n<p>Nel nostro caso vogliamo aggiungere un nuovo attributo <code>attribute<\/code>all&#8217;oggetto del blocco. Chiameremo il nuovo attributo <code>hideOnMobile<\/code>e imposteremo il suo tipo su <code>boolean<\/code>. Questo \u00e8 fatto in questo modo:<\/p>\n<pre><code>function addCoverAttribute(settings, name) {\n    if (typeof settings.attributes !== 'undefined') {\n        if (name == 'core\/cover') {\n            settings.attributes = Object.assign(settings.attributes, {\n                hideOnMobile: {\n                    type: 'boolean',\n                }\n            });\n        }\n    }\n    return settings;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.registerBlockType',\n    'awp\/cover-custom-attribute',\n    addCoverAttribute\n);<\/code><\/pre>\n<p>In linea <code>#3<\/code>ci assicuriamo di indirizzare solo i blocchi di tipo &#8216; <code>core\/cover<\/code>&#8216;. Il secondo argomento da <code>blocks.registerBlockType<\/code>filtrare \u00e8 abbastanza convenientemente il nome del blocco. Quindi aggiungiamo un nuovo oggetto oggetto <code>settings.attributes<\/code>all&#8217;oggetto. Infine ci assicuriamo di restituire la variabile filtrata, <code>settings<\/code>.<\/p>\n<p>A questo punto visivamente nulla \u00e8 cambiato in Gutenberg. Ma tutti i blocchi Cover ora hanno un attributo aggiuntivo che possiamo usare per memorizzare le nostre impostazioni.<\/p>\n<h3>Aggiungi impostazione a Impostazioni (pannello Avanzate)<\/h3>\n<p>Il secondo filtro viene chiamato <code>editor.BlockEdit<\/code>e filtra il componente del blocco <code>edit<\/code>. Questo filtro riceve il componente del blocco originale <code>BlockEdit<\/code>e restituisce un nuovo componente avvolto. Dobbiamo usare <code>wp.compose.createHigherOrderComponent<\/code>per restituire il componente avvolto.<\/p>\n<p>All&#8217;interno del nostro componente ci assicuriamo di eseguire il rendering del componente avvolto <code>BlockEdit<\/code>, a prescindere. Ma se il blocco \u00e8 di tipo Cover ci agganciamo anche al componente <code>InspectorAdvancedControls<\/code>(che \u00e8 il pannello &#8220;Avanzate&quot; in Inspector) e aggiungiamo un <code>ToggleControl<\/code>. Scriviamo <code>ToggleControl<\/code>per mostrare il valore e aggiornare l&#8217;attributo personalizzato che abbiamo aggiunto in precedenza, <code>hideOnMobile<\/code>.<\/p>\n<pre><code>const coverAdvancedControls = wp.compose.createHigherOrderComponent((BlockEdit) =&gt; {\n    return (props) =&gt; {\n        const { Fragment } = wp.element;\n        const { ToggleControl } = wp.components;\n        const { InspectorAdvancedControls } = wp.blockEditor;\n        const { attributes, setAttributes, isSelected } = props;\n        return (&lt;Fragment&gt;\n                &lt;BlockEdit {...props} \/&gt;\n                {isSelected &amp;&amp; (props.name == 'core\/cover') &amp;&amp; \n                    &lt;InspectorAdvancedControls&gt;\n                        &lt;ToggleControl\n                            label={wp.i18n.__('Hide on mobile', 'awp')}\n                            checked={!!attributes.hideOnMobile}\n                            onChange={(newval) =&gt; setAttributes({ hideOnMobile: !attributes.hideOnMobile })}\n                        \/&gt;\n                    &lt;\/InspectorAdvancedControls&gt;\n                }\n            &lt;\/Fragment&gt;\n        );\n    };\n}, 'coverAdvancedControls');\n\u00a0\nwp.hooks.addFilter(\n    'editor.BlockEdit',\n    'awp\/cover-advanced-control',\n    coverAdvancedControls\n);<\/code><\/pre>\n<p>Non dimenticare di restituire sempre l&#8217;originale <code>BlockEdit<\/code>, cosa che facciamo in linea <code>#9<\/code>. Alla riga #10 controlliamo se il tipo di blocco \u00e8 Cover e renderizziamo il <code>InspectorAdvancedControls<\/code>componente. All&#8217;interno qui aggiungiamo un <code>ToggleControl<\/code>, che \u00e8 un controllo di input che viene visualizzato come alternanza tra true o false. Impostiamo un&#8217;etichetta e colleghiamo il suo valore <code>hideOnMobile<\/code>all&#8217;attributo. Se hai gi\u00e0 aggiunto impostazioni a Inspector, questo dovrebbe essere abbastanza semplice per te.<\/p>\n<p>Con il codice sopra, ora dovremmo ottenerlo all&#8217;interno del pannello &quot;Avanzate&quot; in Inspector sui blocchi di copertina:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70271f5a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70271f5a.png\" alt=\"Aggiungi impostazioni personalizzate ai blocchi Gutenberg di WordPress esistenti\"><\/a><\/p>\n<p>L&#8217;input aggiorner\u00e0 ora il nostro attributo personalizzato <code>hideOnMobile<\/code>. L&#8217;ultimo passaggio consiste nel fare qualcosa che dipende dal valore di questo attributo. A partire da ora, l&#8217;attributo \u00e8 salvato, ma in realt\u00e0 non influisce su nulla.<\/p>\n<h3>Aggiungi una classe personalizzata<\/h3>\n<p>Il passaggio finale consiste nell&#8217;aggiungere una classe personalizzata alla classe del blocco. Lo facciamo con il filtro <code>blocks.getSaveContent.extraProps<\/code>. Questo filtro influisce sugli oggetti di scena del componente del blocco <code>save<\/code>. Uno di questi \u00e8 il prop <code>className<\/code>, che sar\u00e0 sempre applicato al frontend. Aggiungiamo semplicemente la nostra classe personalizzata dopo di essa se l&#8217;attributo era <code>true<\/code>, quindi la restituiamo. Ho deciso di aggiungere una classe &#8216; <code>hide-on-mobile<\/code>&#8216; &#8216;, ma puoi chiamarla come preferisci.<\/p>\n<pre><code>function coverApplyExtraClass(extraProps, blockType, attributes) {\n    const { hideOnMobile } = attributes;\n\u00a0\n    if (typeof hideOnMobile !== 'undefined' &amp;&amp; hideOnMobile) {\n        extraProps.className = extraProps.className + ' hide-on-mobile';\n    }\n    return extraProps;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.getSaveContent.extraProps',\n    'awp\/cover-apply-class',\n    coverApplyExtraClass\n);<\/code><\/pre>\n<p>Questo codice \u00e8 abbastanza autoesplicativo. Alla riga <code>#4<\/code>controlliamo se l&#8217;attributo <code>hideOnMobile<\/code>esiste ed \u00e8 <code>true<\/code>. In tal caso, aggiungiamo una classe personalizzata alla <code>className<\/code>stringa.<\/p>\n<p>Con tutti e tre i filtri precedenti, ora dovremmo ottenere una classe personalizzata &quot;hide-on-mobile&quot; applicata al nostro blocco Cover ogni volta che l&#8217;impostazione \u00e8 attivata.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70343817.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70343817.png\" alt=\"Aggiungi impostazioni personalizzate ai blocchi Gutenberg di WordPress esistenti\"><\/a><\/p>\n<p>Non resta che aggiungere un po&#8217; di CSS al foglio di stile del frontend del tuo tema. Qualcosa come questo;<\/p>\n<pre><code>.wp-block-cover.hide-on-mobile { display: none; }\n@media (min-width: 480px) {\n    .wp-block-cover.hide-on-mobile { display: block; }\n}<\/code><\/pre>\n<h2>Esempio 2: aggiungi il pannello Impostazioni con l&#8217;impostazione del colore di sfondo personalizzata per il blocco spaziatore<\/h2>\n<p>Per il secondo caso d&#8217;uso, vogliamo aggiungere impostazioni di colore personalizzate al blocco Spacer. Per impostazione predefinita, il blocco Spacer non ha altre impostazioni oltre alla sua altezza. Supponiamo di voler aggiungere un colore di sfondo che colori l&#8217;intera altezza del blocco Spacer. Ci\u00f2 consente all&#8217;utente di aggiungere &quot;strisce&quot; vuote e colorate all&#8217;interno del proprio contenuto. In questo caso vogliamo aggiungere le impostazioni del colore nel proprio pannello separato in Inspector, come al solito comportamento previsto per le impostazioni del colore.<\/p>\n<p>Nota: la gestione dei colori \u00e8 un po&#8217; pi\u00f9 complicata in quanto \u00e8 necessario utilizzare un (altro) componente di ordine superiore <code>withColors<\/code>. Poich\u00e9 abbiamo gi\u00e0 bisogno di implementare un componente di ordine superiore nel <code>editor.BlockEdit<\/code>abbiamo bisogno di <code>compose<\/code>pi\u00f9 componenti. Inoltre, dobbiamo aggiungere due attributi per ciascuna impostazione del colore. Uno conterr\u00e0 lo slug della tavolozza dei colori e l&#8217;altro conterr\u00e0 il codice colore esadecimale, solo se l&#8217;utente ha optato per un colore personalizzato (utilizzato il colorpicker). Questo \u00e8 un comportamento comune quando si lavora con <code>withColors<\/code>. Ho un &lt;a href=&quot;https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-le-impostazioni-del-colore-al-tuo-blocco-gutenberg-personalizzato\/&quot; title=&quot;post che spiega l&#039;aggiunta delle impostazioni del colore e <code>withColors<\/code>in dettaglio&#8221; &gt;post che spiega l&#8217;aggiunta delle impostazioni del colore e <code>withColors<\/code>in dettaglio<\/a> se ti confondi.<\/p>\n<p>In secondo luogo, in questo caso ci imbatteremo nel problema spiegato sopra; dove non possiamo aggiungere lo stile inline appropriato all&#8217;editor. La soluzione che ho scelto in questo caso \u00e8 racchiudere il blocco Spacer all&#8217;interno di <code>div<\/code>a nell&#8217;editor e applicare le classi e lo stile inline appropriati al wrapping <code>div<\/code>. Ci\u00f2 rende il colore selezionato visibile nell&#8217;editor quando il blocco \u00e8 deselezionato. Dopo aver selezionato il blocco, tuttavia, WordPress aggiunge il proprio sfondo grigio chiaro personalizzato al blocco, coprendo il nostro colore di sfondo personalizzato. Un CSS all&#8217;editor risolver\u00e0 questo problema. Spiegher\u00f2 di pi\u00f9 alla fine.<\/p>\n<p>I passaggi sono gli stessi dell&#8217;esempio sopra. Prima accodiamo il nostro script all&#8217;editor in PHP. Quindi in Javascript filtriamo l&#8217; <code>attributes<\/code>oggetto, il <code>edit<\/code>componente Spacer e infine il <code>save<\/code>componente Spacer.<\/p>\n<h3>Aggiunta del nostro script all&#8217;editor<\/h3>\n<p>Agganciamo una funzione all&#8217;azione <code>[enqueue_block_editor_assets](https:\/\/developer.wordpress.org\/reference\/hooks\/enqueue_block_editor_assets\/)<\/code>. All&#8217;interno della nostra funzione accodiamo uno script, proprio come faremmo normalmente in <code>wp_enqueue_scripts<\/code>hook.<\/p>\n<pre><code>add_action('enqueue_block_editor_assets', function() {\n    wp_enqueue_script('awp-gutenberg-filters', get_template_directory_uri(). '\/assets\/js\/gutenberg-filters.js', ['wp-edit-post']);\n});<\/code><\/pre>\n<p>Ricorda di modificare il percorso del tuo script. Mi piace aggiungere &#8216; <code>wp-edit-post<\/code>&#8216; come dipendenza allo script per assicurarmi che venga caricato abbastanza tardi.<\/p>\n<p>Questo \u00e8 tutto il PHP che dobbiamo fare. Il resto \u00e8 scritto nel nostro file Javascript.<\/p>\n<h3>Aggiungi attributi personalizzati<\/h3>\n<p>Come nell&#8217;esempio sopra, aggiungiamo un filtro <code>blocks.registerBlockType<\/code>per aggiungere elementi oggetto aggiuntivi all&#8217;oggetto del blocco <code>attributes<\/code>.<\/p>\n<p>Quando lavoriamo con <code>withColors<\/code>dobbiamo aggiungere due attributi per ogni colore. Il nome del nostro attributo del colore di sfondo \u00e8 <code>backgroundColor<\/code>, il che significa che il secondo attributo deve essere nominato <code>customBackgroundColor<\/code>. Tutto questo \u00e8 spiegato nel <a href=\"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-le-impostazioni-del-colore-al-tuo-blocco-gutenberg-personalizzato\/\" title=\"mio post sulla gestione delle impostazioni del colore in Gutenberg\">mio post sulla gestione delle impostazioni del colore in Gutenberg<\/a>. Entrambi devono essere di tipo string e applicati solo a blocchi di tipo Spacer.<\/p>\n<pre><code>function addSpacerAttributes(settings, name) {\n    if (typeof settings.attributes !== 'undefined') {\n        if (name == 'core\/spacer') {\n            settings.attributes = Object.assign(settings.attributes, {\n                backgroundColor: {\n                    type: 'string',\n                },\n                customBackgroundColor: {\n                    type: 'string'\n                }\n            });\n        }\n    }\n    return settings;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.registerBlockType',\n    'awp\/spacer-background-attribute',\n    addSpacerAttributes\n);<\/code><\/pre>\n<h3>Aggiungi il pannello ColorSettings a Impostazioni<\/h3>\n<p>Il secondo passaggio consiste nell&#8217;aggiungere un pannello delle impostazioni del colore all&#8217;Inspector per il blocco Spacer filtrando <code>editor.BlockEdit<\/code>.<\/p>\n<pre><code>const spacerInspectorControls = wp.compose.compose(\n    wp.blockEditor.withColors({backgroundColor: 'background-color'}),\n\u00a0\n    wp.compose.createHigherOrderComponent((BlockEdit) =&gt; {\n        return (props) =&gt; {\n\u00a0\n            if (props.name !== 'core\/spacer') {\n                return(&lt;BlockEdit {...props} \/&gt;);\n            }\n\u00a0\n            const { Fragment } = wp.element;\n            const { InspectorControls, PanelColorSettings } = wp.blockEditor;\n            const { attributes, setAttributes, isSelected } = props;\n            const { backgroundColor, setBackgroundColor } = props;\n\u00a0\n            let newClassName = (attributes.className != undefined)? attributes.className: '';\n            let newStyles = {...props.style};\n            if (backgroundColor != undefined) {\n                if (backgroundColor.class == undefined) {\n                    newStyles.backgroundColor = backgroundColor.color;\n                } else {\n                    newClassName += ' ' + backgroundColor.class;\n                }\n            }\n            const newProps = {\n                ...props,\n                attributes: {\n                    ...attributes,\n                    className: newClassName\n                },\n                style: newStyles\n            }\n\u00a0\n            return (&lt;Fragment&gt;\n                    &lt;div style={newStyles} className={newClassName}&gt;\n                        &lt;BlockEdit {...newProps} \/&gt;\n                        {isSelected &amp;&amp; (props.name == 'core\/spacer') &amp;&amp; \n                            &lt;InspectorControls&gt;\n                                &lt;PanelColorSettings \n                                    title={wp.i18n.__('Color Settings', 'awp')}\n                                    colorSettings={[\n                                        {\n                                            value: backgroundColor.color,\n                                            onChange: setBackgroundColor,\n                                            label: wp.i18n.__('Background color', 'awp')\n                                        }\n                                    ]}\n                                \/&gt;\n                            &lt;\/InspectorControls&gt;\n                        }\n                    &lt;\/div&gt;\n                &lt;\/Fragment&gt;\n            );\n        };\n}, 'spacerInspectorControls'));\n\u00a0\nwp.hooks.addFilter(\n    'editor.BlockEdit',\n    'awp\/spacer-inspector-control',\n    spacerInspectorControls\n);<\/code><\/pre>\n<p>Dobbiamo usare <code>compose<\/code>per combinare il componente di ordine superiore restituito da questo filtro e <code>withColors<\/code>. In altre parole, avvolgiamo semplicemente il componente restituito in <code>withColors<\/code>. Come parametro <code>withColors<\/code>forniamo il nostro attributo <code>backgroundColor<\/code>.<\/p>\n<p>All&#8217;interno del componente avvolto ci assicuriamo di restituire sempre <code>BlockEdit<\/code>(linea <code>#9<\/code>e <code>#39<\/code>per blocchi Spacer). Per il blocco di tipo Spacer ci agganciamo anche <code>InspectorControls<\/code>per aggiungere un <code>PanelColorSettings<\/code>colore per la nostra scelta. Questa \u00e8 la procedura standard per aggiungere le impostazioni del colore.<\/p>\n<p>In linea <code>#17 - 34<\/code>generiamo manualmente la classe e\/o lo stile inline necessari. Quindi in linea <code>#38<\/code>aggiungiamo un div avvolgente <code>BlockEdit<\/code>con quelle classi e stili inline.<\/p>\n<p>Il risultato \u00e8 un nuovo pannello delle impostazioni del colore in Inspector per i blocchi Spacer, completamente funzionante.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7041a66b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7041a66b.png\" alt=\"Aggiungi impostazioni personalizzate ai blocchi Gutenberg di WordPress esistenti\"><\/a><\/p>\n<p>La scelta di un colore della tavolozza o di un colore personalizzato sar\u00e0 effettivamente influenzata nel div di wrapping all&#8217;interno dell&#8217;editor. Ma puoi vederlo solo quando deselezioni il blocco Spacer!<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7052e0c9.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7052e0c9.gif\" alt=\"Aggiungi impostazioni personalizzate ai blocchi Gutenberg di WordPress esistenti\"><\/a><\/p>\n<p>Ci\u00f2 accade perch\u00e9 WordPress applica il proprio stile quando si seleziona un blocco distanziatore. Lo sistemeremo alla fine, prima dobbiamo solo applicare la stessa classe e\/o stile inline anche nel frontend.<\/p>\n<h3>Aggiungi classe personalizzata e stile in linea per salvare<\/h3>\n<p>Infine, dobbiamo filtrare <code>blocks.getSaveContent.extraProps<\/code>e applicare la classe necessaria e\/o lo stile in linea per il frontend. Anche in questo caso \u00e8 molto simile a quello che abbiamo fatto nell&#8217;esempio 1 sopra. Se \u00e8 stato scelto un colore della tavolozza, \u00e8 necessario aggiungere un nome di classe che segua gli standard di WordPress per le impostazioni del colore (&quot; <code>has-&lt;PALETTESLUG&gt;-background-color<\/code>&quot;). Se \u00e8 stato scelto un colore personalizzato, \u00e8 necessario aggiungere uno stile in linea con il colore esadecimale.<\/p>\n<p>Nota: se hai bisogno di gestire molto i nomi delle classi, ti consiglio di importare la <code>classnames<\/code>libreria. Questo \u00e8 molto utilizzato in Gutenberg perch\u00e9 semplifica notevolmente l&#8217;impostazione dei nomi di classe corretti. Il codice seguente presuppone che tu non l&#8217;abbia fatto e compone il nome della classe manualmente.<\/p>\n<pre><code>function applySpacerBackground(props, blockType, attributes) {\n    if (blockType.name == 'core\/spacer') {\n        const { backgroundColor, customBackgroundColor } = attributes;\n\u00a0\n        \/\/ For improved class name handling, use classnames library. Or do it manually like..\n        let className = (props.className != undefined)? props.className: '';\n        if (backgroundColor != undefined) {\n            className += ' has-' + backgroundColor + '-background-color';\n        }\n        props.className = className;\n        if (customBackgroundColor != undefined) {\n            Object.assign(props, { style: { ...props.style, backgroundColor: customBackgroundColor }});\n        }\n    }\n    return props;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.getSaveContent.extraProps',\n    'awp\/spacer-apply-class',\n    applySpacerBackground\n);<\/code><\/pre>\n<p>Con il codice sopra, il frontend ora render\u00e0 perfettamente i blocchi Spacer con la nostra scelta di colori personalizzata!<\/p>\n<p>La correzione finale (opzionale) consiste nell&#8217;aggiungere alcuni CSS all&#8217;editor. Dovrai aggiungere CSS in linea o un foglio di stile dell&#8217;editor. Ad esempio, potresti accodare un foglio di stile nello stesso hook PHP che abbiamo usato per accodare il nostro file Javascript. Non entrer\u00f2 nei dettagli su come farlo; ma il CSS di cui avrai bisogno \u00e8 qualcosa come il seguente. Tutto ci\u00f2 che fa \u00e8 impostare lo Spacer <code>background-color<\/code>sul colore ereditato (ereditarir\u00e0 dal nostro div wrapping) quando il blocco \u00e8 selezionato:<\/p>\n<pre><code>.block-library-spacer__resize-container.is-selected { \n    background-color: inherit; \n}<\/code><\/pre>\n<p>PS: Tieni presente che questo \u00e8 soggetto a modifiche in futuro. Gutenberg \u00e8 ancora in forte evoluzione.<\/p>\n<h2>Conclusione<\/h2>\n<p>In questo post abbiamo appreso due metodi per implementare impostazioni personalizzate nei blocchi Gutenberg di WordPress esistenti. \u00c8 del tutto possibile per impostazioni semplici che forse richiedono solo una classe o uno stile in linea. Abbiamo esaminato gli avvertimenti, che spero verranno corretti nelle versioni successive di Gutenberg!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo post entreremo nei dettagli su come aggiungere le tue impostazioni personalizzate ai blocchi Gutenberg di WordPress esistenti con due esempi di codice di casi d&#8217;uso reali.<\/p>\n","protected":false},"author":1,"featured_media":152422,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,720,835,939,939,1110,835,720,844,844,865,865],"tags":[1168],"class_list":["post-233776","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-guida-per-principianti","category-gutenberg-6","category-n-a","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233776"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233776\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152422"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}