{"id":233884,"date":"2023-02-23T17:58:00","date_gmt":"2023-02-23T14:58:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233884"},"modified":"2023-02-23T18:00:42","modified_gmt":"2023-02-23T15:00:42","slug":"tutorial-crea-uno-slider-come-blocco-gutenberg-dinamico","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/tutorial-crea-uno-slider-come-blocco-gutenberg-dinamico\/","title":{"rendered":"Tutorial: crea uno slider come blocco Gutenberg dinamico"},"content":{"rendered":"\n<p>Questo tutorial spiega come creare un blocco Gutenberg di WordPress dinamico. Il risultato finale \u00e8 un dispositivo di scorrimento che mostra l&#8217;immagine in primo piano dai post della categoria selezionata. Il codice include l&#8217;utilizzo di un componente di ordine superiore (<code>withSelect<\/code>) per recuperare tutte le categorie all&#8217;interno dell&#8217;editor di blocchi.<\/p>\n<h2>Cosa faremo<\/h2>\n<p>Il blocco eseguir\u00e0 il rendering di un semplice dispositivo di scorrimento utilizzando lo script <a href=\"http:\/\/jquery.malsup.com\/cycle2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery Cycle2<\/a>. Ma puoi usare qualsiasi altro script di scorrimento. Il blocco all&#8217;interno dell&#8217;editor visualizzer\u00e0 un elenco di tutte le categorie consentendo all&#8217;utente di selezionare una categoria. Quando si visualizza il blocco nel frontend, recuperer\u00e0 dinamicamente i post dalla categoria scelta e mostrer\u00e0 le loro immagini in primo piano come diapositive. Questo tutorial lo manterr\u00e0 abbastanza semplice permettendoti di espandere e regolare il tuo dispositivo di scorrimento come preferisci.<\/p>\n<p>Ho scelto di non eseguire il rendering della presentazione all&#8217;interno dell&#8217;editor. Di solito ti assicuri che il rendering nell&#8217;editor e nel frontend sia lo stesso. Ma nel caso di uno slider mi piace mantenerlo semplice per non far esplodere l&#8217;utente con animazioni costanti all&#8217;interno dell&#8217;editor.<\/p>\n<p>Il blocco avr\u00e0 solo due impostazioni; la scelta della categoria e il numero di diapositive (post). Consiglio di aggiungere pi\u00f9 impostazioni come la velocit\u00e0 di scorrimento, le impostazioni per la visualizzazione di pillole, frecce, testo e altre impostazioni tipiche del dispositivo di scorrimento. Dovrebbe essere abbastanza semplice aggiungere tu stesso queste impostazioni.<\/p>\n<p>Tutto il codice \u00e8 scritto in Javascript ES6 \/ ES2015+. Tieni presente che questo codice ha bisogno di Babel per trasformare e creare i file Javascript finali. Consulta la guida qui sotto se non sai come fare.<\/p>\n<h2>Imposta i file<\/h2>\n<p>In questo esempio stiamo creando il blocco all&#8217;interno di un tema. Nella cartella del tema ho una sottocartella &#8216; <code>gutenberg\/<\/code>&#8216; dove ho posizionato il mio <code>package.json<\/code>e <code>webpack-config.js<\/code>. All&#8217;interno della sottocartella &#8216; <code>src\/<\/code>&#8216; in questa cartella \u00e8 dove inserisco tutti i miei file di build. La mia configurazione del webpack \u00e8 impostata per posizionare i file di build nella mia sottocartella del tema &#8216; <code>assets\/js\/<\/code>&#8216;.<\/p>\n<p>Crea un nuovo file sorgente vuoto <code>theme-folder\/gutenberg\/src\/block-slider.js<\/code>e imposta Webpack per creare il file di build in <code>theme-folder\/assets\/js\/block-slider.js<\/code>. Puoi modificare le posizioni e\/o i nomi dei file come preferisci, ricorda solo di modificare il codice di seguito.<\/p>\n<p>Dobbiamo anche scaricare lo script di scorrimento necessario. Puoi <a href=\"http:\/\/jquery.malsup.com\/cycle2\/download\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">scaricare Cycle2 a questo link<\/a>, oppure puoi usare qualsiasi altro script di diapositiva e modificare il codice qui sotto. Sto mettendo il <code>jquery.cycle2.min.js<\/code>file nella cartella della mia cartella del tema <code>\/assets\/js\/<\/code>.<\/p>\n<p>Preparer\u00f2 anche un piccolo file CSS che verr\u00e0 caricato solo nell&#8217;editor. Abbiamo solo un piccolo pezzo di styling per rendere la categoria selezionata in modo ottimale. Creo un file vuoto <code>editor-block-slider.css<\/code>e lo inserisco in <code>theme-folder\/assets\/css\/<\/code>.<\/p>\n<p>Infine andiamo a un file PHP che viene caricato nel tema. Per semplicit\u00e0 sto facendo la parte PHP nel tema <code>functions.php<\/code>.<\/p>\n<h2>Registra il blocco Gutenberg in PHP<\/h2>\n<p>Tutti i blocchi Gutenberg devono essere registrati con <code>[register_block_type](https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/)()<\/code>. Preferisco chiamarlo all&#8217;interno di una funzione agganciata a <code>init<\/code>. Il primo parametro \u00e8 il nome del blocco incluso lo spazio dei nomi. Ho deciso di chiamare il mio script di scorrimento <code>awp\/slider<\/code>(regola come preferisci). Il secondo argomento \u00e8 un array di argomenti.<\/p>\n<p>All&#8217;interno della stessa funzione registrer\u00f2 lo script di build con <code>[wp_register_script](https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_script\/)()<\/code>e registrer\u00f2 il mio file CSS dell&#8217;editor con <code>[wp_register_style](https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_style\/)()<\/code>. Entrambi questi handle verranno aggiunti come argomenti rispettivamente a &#8216; <code>editor_script<\/code>&#8216; e &#8216; <code>editor_style<\/code>&#8216;. Per quanto riguarda le dipendenze, ho aggiunto alcuni dei pacchetti pi\u00f9 basilari per lo script per garantire che il nostro script di blocco sia caricato nell&#8217;ordine corretto. Per quanto riguarda lo stile dell&#8217;editor, l&#8217;uso di &#8216; <code>wp-edit-blocks<\/code>&#8216; \u00e8 una buona dipendenza per evitare che i tuoi stili vengano sovrascritti.<\/p>\n<p>E infine, poich\u00e9 si tratta di un blocco dinamico, \u00e8 necessario aggiungere anche l&#8217; <code>render_callback<\/code>argomento &#8216; &#8216;, che punta a una funzione responsabile del rendering del blocco nel frontend.<\/p>\n<pre><code>add_action('init', function() {\n    wp_register_script(\n        'awp-block-slider-js', \n        get_template_directory_uri(). '\/assets\/js\/block-slider.js', \n        ['wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-data']\n    );\n    wp_register_style(\n        'awp-block-slider-style', \n        get_template_directory_uri(). '\/assets\/css\/editor-block-slider.css', \n        ['wp-edit-blocks']\n    );\n\u00a0\n    register_block_type('awp\/slider', [\n        'editor_script' =&gt; 'awp-block-slider-js',\n        'editor_style' =&gt; 'awp-block-slider-style',\n        'render_callback' =&gt; 'awp_gutenberg_slider_render',\n    ]);\n});<\/code><\/pre>\n<p>Infine definiamo la funzione render. Otteniamo due parametri per la funzione di callback; una matrice di attributi dal blocco e il contenuto interno (non utilizzato in questo blocco). Restituir\u00f2 semplicemente una stringa fittizia. Torneremo e completeremo la funzione di rendering in seguito. Ricorda di restituire una stringa, non un&#8217;eco.<\/p>\n<pre><code>function awp_gutenberg_slider_render($attributes, $content) {\n    return 'Slider render comes here.';\n}<\/code><\/pre>\n<p>Torneremo alla funzione di rendering PHP alla fine di questo tutorial. Ora \u00e8 il momento di passare a Javascript!<\/p>\n<h2>Registra un blocco Gutenberg personalizzato in Javascript<\/h2>\n<p>Apriamo il nostro <code>block-slider.js<\/code>file sorgente. A questo punto avvier\u00f2 lo script (<code>npm run start<\/code>) per trasformare tutto ci\u00f2 che facciamo in questo file nel file di build mentre procediamo. Dobbiamo registrare il blocco usando <code>[registerBlockType](https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-registration\/)()<\/code>. Controlla il link per vedere tutti i possibili argomenti.<\/p>\n<p>Come abbiamo deciso in <code>register_block_type()<\/code>PHP, il nostro blocco si chiama <code>awp\/slider<\/code>. Vogliamo anche aggiungere due attributi al blocco, come accennato in precedenza: uno per l&#8217;ID del termine selezionato e uno per il numero di diapositive.<\/p>\n<p>Mi piace aggiungere anche la funzionalit\u00e0 di allineamento dei blocchi. Verr\u00e0 aggiunto automaticamente aggiungendo &#8216; <code>align<\/code>&#8216; <code>supports<\/code>all&#8217;oggetto. Se vuoi tutti gli allineamenti dei blocchi puoi semplicemente impostare <code>align<\/code>su true. Tuttavia un dispositivo di scorrimento allineato a sinistra o a destra non ha molto senso, quindi definir\u00f2 i tipi specifici di allineamento del blocco supportati da questo blocco: &quot;Allinea al centro&quot; (&#8216; <code>center<\/code>&#8216;), &quot;Larghezza&quot; (&#8216; <code>wide<\/code>&#8216;) e &quot; Full width&quot; (&#8216; <code>full<\/code>&#8216;). Inoltre, per definire un align predefinito e renderlo accessibile da PHP, aggiungo &#8216; <code>align<\/code>&#8216; come attributo al nostro blocco.<\/p>\n<p>Ho impostato l&#8217;argomento del blocco <code>edit<\/code>su un componente separato che creeremo in seguito. E infine la <code>save<\/code>funzione restituisce semplicemente <code>null<\/code>, perch\u00e9 questo \u00e8 un blocco dinamico.<\/p>\n<pre><code>const { __ } = wp.i18n;\nconst { registerBlockType } = wp.blocks;\n\u00a0\nregisterBlockType('awp\/slider', {\n    title: __('AWP Slider', 'awp'),\n    icon: 'slides',\n    category: 'common',\n    supports: {\n        align: ['center', 'wide', 'full']\n    },\n    attributes: {\n        align: {\n            type: 'string',\n            default: 'center'\n        },\n        termId: {\n            type: 'number',\n            default: 0\n        },\n        numSlides: {\n            type: 'number',\n            default: 3\n        },\n    },\n    edit: BlockEdit,\n    save:() =&gt; { return null; }\n});<\/code><\/pre>\n<p>Dobbiamo definire il componente per la <code>edit<\/code>propriet\u00e0. Prima del codice di registrazione definisco un componente di funzione <code>BlockEdit<\/code>che rende semplicemente a <code>div<\/code>e a <code>Placeholder<\/code>con del testo fittizio.<\/p>\n<pre><code>const { __ } = wp.i18n;\nconst { registerBlockType } = wp.blocks;\nconst { Placeholder } = wp.components;\nconst BlockEdit = (props) =&gt; {\n    return(\n        &lt;div className={props.className}&gt;\n            &lt;Placeholder\n                label={__('Slider Category', 'awp')}\n            &gt;\n                Select category comes here.\n            &lt;\/Placeholder&gt;\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nregisterBlockType('awp\/slider', {\n    ...<\/code><\/pre>\n<p><code>[Placeholder](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/placeholder)<\/code>\u00e8 un bel componente per il rendering di un&#8217;area per le impostazioni e non necessariamente per il rendering effettivo di un blocco. All&#8217;interno del <code>Placeholder<\/code>componente viene visualizzato un elenco di termini tra cui scegliere.<\/p>\n<p>A questo punto il nostro blocco dovrebbe essere disponibile in WordPress Gutenberg! Creiamo un nuovo post, aggiungiamo un nuovo blocco e troviamo il nostro blocco all&#8217;interno della categoria Comune. Ecco come appare attualmente il nostro blocco:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d14fb8d7b.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-151906-61e4d14fb8d7b.png\" alt=\"Tutorial: crea uno slider come blocco Gutenberg dinamico\"><\/a><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d150ae184.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-151906-61e4d150ae184.png\" alt=\"Tutorial: crea uno slider come blocco Gutenberg dinamico\"><\/a><\/p>\n<h2>Aggiunta delle impostazioni dell&#8217;Inspector<\/h2>\n<p>Aggiungiamo alcune impostazioni all&#8217;Inspector (barra laterale destra dell&#8217;editor). Come accennato, il nostro blocco ha solo un&#8217;impostazione; numero di diapositive. \u00c8 qui che ti consiglio di aggiungere pi\u00f9 impostazioni per il tuo blocco di scorrimento. Ricorda di registrare gli attributi per ogni impostazione che aggiungi.<\/p>\n<p>Per aggiungere qualcosa all&#8217;Inspector utilizziamo il componente <code>[InspectorControls](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/block-editor\/src\/components\/inspector-controls)<\/code>( <code>wp.blockEditor<\/code>). All&#8217;interno eseguiamo il rendering di una <code>[PanelBody](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/panel#panelbody)<\/code>( <code>wp.components<\/code>) per aggiungere una nuova sezione comprimibile. Quindi eseguiamo semplicemente il rendering di un <code>[RangeControl](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/range-control)<\/code>( <code>wp.components<\/code>) per creare un&#8217;impostazione di input per scegliere il numero di diapositive. Impostiamo il minimo su 1 e il massimo su 10. Colleghiamo l&#8217; evento <code>value<\/code>e <code>onChange<\/code>all&#8217;attributo <code>numSlides<\/code>.<\/p>\n<pre><code>const { __ } = wp.i18n;\nconst { registerBlockType } = wp.blocks;\nconst { InspectorControls } = wp.blockEditor;\nconst { Placeholder, PanelBody, RangeControl } = wp.components;\n\u00a0\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    return(\n        &lt;div className={props.className}&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Slider Settings', 'awp')}\n                    initialOpen={true}\n                &gt;\n                    &lt;RangeControl\n                        label={__('Number of slides', 'awp')}\n                        value={attributes.numSlides}\n                        onChange={(val) =&gt; setAttributes({ numSlides: val })}\n                        min={1}\n                        max={10}\n                    \/&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;Placeholder\n                ...<\/code><\/pre>\n<p>Con il codice sopra ora dovremmo ottenere una bella sezione con un dispositivo di scorrimento dell&#8217;intervallo per impostare il numero di diapositive.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d15191aa1.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-151906-61e4d15191aa1.png\" alt=\"Tutorial: crea uno slider come blocco Gutenberg dinamico\"><\/a><\/p>\n<p>Ancora una volta, ti consiglio di giocare aggiungendo pi\u00f9 impostazioni al tuo dispositivo di scorrimento. Il passaggio successivo \u00e8 la creazione dell&#8217;elemento per il rendering di un elenco di categorie tra cui scegliere.<\/p>\n<h2>Creazione di un componente di selezione di categoria<\/h2>\n<p>Per mantenere il nostro codice ordinato e riutilizzabile, creiamo il componente selettore di categoria in un file separato. All&#8217;interno della cartella build creo un nuovo file <code>awp-category-picker.js<\/code>.<\/p>\n<p>All&#8217;interno di questo file definiamo un componente che scorrer\u00e0 attraverso tutte le categorie attualmente in WordPress e le render\u00e0 in qualche modo. Per ottenere le categorie dobbiamo avvolgerlo all&#8217;interno di un cosiddetto componente di ordine superiore, che fornir\u00e0 al nostro componente ci\u00f2 di cui abbiamo bisogno tramite oggetti di scena. Per fare questo useremo <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/#withSelect)<\/code>. All&#8217;interno <code>withSelect<\/code>possiamo fare una richiesta per recuperare tutte le categorie in WordPress utilizzando il selettore del negozio <code>[select](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-data\/#select)()<\/code>. Possiamo usare:<\/p>\n<pre><code>select('core').getEntityRecords('taxonomy', '&lt;category_slug&gt;', &lt;args&gt;)<\/code><\/pre>\n<p>per recuperare tutti i termini all&#8217;interno dello slug della tassonomia fornito. Se non hai familiarit\u00e0 con i componenti e i selettori di ordine superiore in WordPress Gutenberg, ho un post che spiega questo concetto in modo pi\u00f9 dettagliato: <a href=\"https:\/\/wordpress.mediadoma.com\/it\/crea-un-blocco-gutenberg-personalizzato-parte-10-recupero-di-post-e-componenti-di-ordine-superiore\/\" title=\"Crea un blocco Gutenberg personalizzato \u2013 Parte 10: Recupero di post e componenti di ordine superiore\">Crea un blocco Gutenberg personalizzato \u2013 Parte 10: Recupero di post e componenti di ordine superiore<\/a>.<\/p>\n<p>Poich\u00e9 dobbiamo esportare un componente da questo file, posizioniamo la combinazione di <code>withSelect<\/code>e il nostro componente definito <code>export default<\/code>nell&#8217;istruzione. Il nostro <code>CategorySelect<\/code>componente restituisce semplicemente un div con del testo fittizio in modo da poter vedere che funziona. Dovrebbe fornire il <code>withSelect<\/code>prop &#8216; <code>terms<\/code>&#8216; a <code>CategorySelect<\/code>. Ho aggiunto un <code>console.log()<\/code>su questo oggetto in modo da poter vedere che funziona.<\/p>\n<pre><code>const { withSelect } = wp.data;\n\u00a0\nconst CategorySelect = (props) =&gt; {\n    console.log(props.terms);\n\u00a0\n    return(\n        &lt;div&gt;This is category select&lt;\/div&gt;\n    );\n}\n\u00a0\nexport default withSelect((select, props) =&gt; {\n    return {\n        terms: select('core').getEntityRecords('taxonomy', 'category', {per_page: -1})\n    }\n})(CategorySelect);<\/code><\/pre>\n<p>L&#8217;ultima cosa che dobbiamo fare \u00e8 importare e utilizzare questo componente del selettore di categoria nel nostro blocco personalizzato.<\/p>\n<p>Tornando, <code>block-slider.js<\/code>dobbiamo prima importare il componente nella parte superiore del file. E all&#8217;interno del nostro <code>Placeholder<\/code>componente eseguiamo semplicemente il rendering del componente.<\/p>\n<pre><code>const { Placeholder, PanelBody, RangeControl } = wp.components;\n\u00a0\nimport CategorySelect from '.\/awp-category-picker';\n\u00a0\nconst BlockEdit = (props) =&gt; {\n        ...\n            &lt;Placeholder\n                label={__('Slider Category', 'awp')}\n            &gt;\n                &lt;CategorySelect \n                \/&gt;\n            &lt;\/Placeholder&gt;\n        ...<\/code><\/pre>\n<p>Con il codice sopra il tuo blocco dovrebbe ora rendere il div dal <code>CategorySelect<\/code>componente. Se apri la Console nel tuo browser dovresti anche vedere alcuni log. Ricorda che <code>withSelect<\/code>\u00e8 una query asincrona, il che significa che potrebbe essere visualizzata pi\u00f9 volte. La prima volta che i termini prop sono <code>null<\/code>. Ma gli ultimi log dovrebbero finire con una matrice di termini di categoria.<\/p>\n<p>Grande! Continuiamo a lavorare con il nostro <code>CategorySelect<\/code>componente e facciamo in modo che renda effettivamente l&#8217;elenco dei termini consentendo all&#8217;utente di selezionarne uno!<\/p>\n<h3>Rendering di un elenco di termini tra cui scegliere<\/h3>\n<p>Esistono molti modi per eseguire il rendering di un elenco di scelte in cui l&#8217;utente pu\u00f2 selezionare un elemento. Se vuoi qualcosa di veramente semplice, puoi eseguire il rendering di un menu a discesa di selezione standard (<code>[SelectControl](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/select-control)<\/code>). Dipende interamente da te. Ho optato per un approccio pi\u00f9 pulito e piacevole utilizzando <code>[MenuGroup](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/menu-group)<\/code>( <code>wp.components<\/code>) e <code>[MenuItem](https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/menu-item)<\/code>( <code>wp.components<\/code>).<\/p>\n<p>All&#8217;interno di un <code>MenuGroup<\/code>componente abbiamo bisogno di scorrere l&#8217; <code>props.terms<\/code>array e per ogni elemento vogliamo visualizzare un <code>MenuItem<\/code>componente che rende il nome del termine. E ovviamente vogliamo renderizzarlo solo se <code>props.terms<\/code>contiene effettivamente qualcosa (richiesta asincrona, ricordi?).<\/p>\n<pre><code>const { withSelect } = wp.data;\nconst { MenuGroup, MenuItem } = wp.components;\n\u00a0\nconst CategorySelect = (props) =&gt; {\n    const { terms } = props;\n    return(\n        &lt;MenuGroup\n            className=\"awp-categoryselect\"\n        &gt;\n            {terms &amp;&amp; (terms.map((item) =&gt; (&lt;MenuItem\n                        role=\"menuitemradio\"\n                    &gt;\n                        {item.name}\n                    &lt;\/MenuItem&gt;\n                ))\n            )}\n        &lt;\/MenuGroup&gt;\n    );\n}\n\u00a0\nexport default withSelect((select, props) =&gt; {\n    ...<\/code><\/pre>\n<p>Ho assegnato al <code>MenuGroup<\/code>componente una classe personalizzata, poich\u00e9 dovremo indirizzarlo con CSS. E ho impostato l&#8217;elica <code>role<\/code>su <code>MenuItem<\/code>&#8221; <code>menuitemradio<\/code>&#8216; per assicurarmi che se ne possa scegliere solo uno alla volta. Per impostazione predefinita funzionano come caselle di controllo, consentendo cos\u00ec di scegliere pi\u00f9 elementi.<\/p>\n<p>Con il codice sopra il nostro blocco dovrebbe ora (dopo un piccolo secondo) visualizzare un bell&#8217;elenco di tutte le categorie nella tua istanza di WordPress.<\/p>\n<p>Potresti notare che il nostro blocco si espander\u00e0 per contenere tutte le categorie. Se ci troviamo in un&#8217;istanza WordPress con molte categorie, questo diventa rapidamente un problema. Vogliamo assicurarci che il selettore sia un contenitore di altezza massima che ottiene una barra di scorrimento verticale se sono presenti molte categorie. \u00c8 qui che entra in gioco il nostro file CSS.<\/p>\n<p>Nel nostro <code>editor-block-slider.css<\/code>file aggiungi:<\/p>\n<pre><code>.awp-categoryselect div {\n    max-height: 200px;\n    overflow: hidden scroll;\n    border: 1px solid #b3bcc0;\n}<\/code><\/pre>\n<p>Questo CSS prende di mira l&#8217;interno <code>div<\/code>all&#8217;interno del nostro <code>MenuGroup<\/code>e si assicura che non superi mai i 200px. Se il contenuto del <code>MenuGroup<\/code>diventa pi\u00f9 grande (pi\u00f9 categorie) mostrer\u00e0 una barra di scorrimento verticale. Questo \u00e8 il minimo indispensabile di CSS per il nostro blocco, ma puoi ovviamente aggiungere pi\u00f9 CSS se lo desideri.<\/p>\n<p>L&#8217;ultima cosa che dobbiamo correggere nel nostro selettore di categoria \u00e8 la funzionalit\u00e0 per mostrare l&#8217;elemento attualmente selezionato e consentire all&#8217;utente di selezionare un termine dall&#8217;elenco. Per questo abbiamo bisogno di passare alcuni oggetti di scena a questo componente dal nostro blocco.<\/p>\n<p>In <code>block-slider.js<\/code>abbiamo bisogno di passare il termine selezionato corrente (valore dell&#8217;attributo <code>termId<\/code>) e una funzione per aggiornare il termine selezionato (<code>setAttributes<\/code>) come prop al nostro componente selettore di categoria.<\/p>\n<pre><code>...\n\u00a0\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const selectTerm = (termId) =&gt; {\n        setAttributes({ termId: termId });\n    }\n\u00a0\n    return(\n        ...\n            &lt;Placeholder\n                label={__('Slider Category', 'awp')}\n            &gt;\n                &lt;CategorySelect \n                    selectedTermId={attributes.termId}\n                    selectTerm={selectTerm}\n                \/&gt;\n            &lt;\/Placeholder&gt;\n        ...<\/code><\/pre>\n<p>Nel codice sopra alla riga <code>#6<\/code>definiamo una funzione che aggiorna semplicemente l&#8217;attributo <code>termId<\/code>. Passiamo questo nome di funzione come prop a <code>CategorySelect<\/code>at line <code>#17<\/code>. E alla riga <code>#16<\/code>passiamo il valore corrente di <code>termId<\/code>. Con possiamo aggiornare il nostro <code>CategorySelect<\/code>componente per riflettere l&#8217;elemento scelto e consentire all&#8217;utente di scegliere effettivamente un termine.<\/p>\n<p>Di nuovo <code>awp-category-picker.js<\/code>, aggiungiamo alcuni nuovi oggetti di scena su <code>MenuItem<\/code>. Ritorniamo <code>true<\/code>o <code>false<\/code>per l&#8217;oggetto di scena indipendentemente dal <code>isSelected<\/code>fatto che l&#8217;ID del termine corrente sia lo stesso di quello correntemente selezionato. Avviamo la <code>selectTerm<\/code>funzione <code>onClick<\/code>nell&#8217;evento, passando il termine ID. E per rendere visivo l&#8217;elemento selezionato, aggiungiamo condizionatamente un&#8217;icona prima di ogni elemento.<\/p>\n<pre><code>...\nconst CategorySelect = (props) =&gt; {\n    const { terms, selectedTermId, selectTerm } = props;\n\u00a0\n    return(\n        &lt;MenuGroup\n            className=\"awp-categoryselect\"\n        &gt;\n            {terms &amp;&amp; (terms.map((item) =&gt; (&lt;MenuItem\n                        role=\"menuitemradio\"\n                        isSelected={item.id == selectedTermId}\n                        icon={item.id == selectedTermId? 'yes': 'no-alt'}\n                        onClick={() =&gt; selectTerm(item.id)}\n                    &gt;\n                        {item.name}\n                    &lt;\/MenuItem&gt;\n                ))\n            )}\n        ...<\/code><\/pre>\n<p>Con questo il nostro selettore di categoria dovrebbe apparire cos\u00ec:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151906-61e4d1525afb7.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-151906-61e4d1525afb7.png\" alt=\"Tutorial: crea uno slider come blocco Gutenberg dinamico\"><\/a><\/p>\n<p>L&#8217;elenco dovrebbe contrassegnare chiaramente il termine selezionato con un&#8217;icona di controllo e puoi invece fare clic su qualsiasi termine per selezionarlo.<\/p>\n<p>Questo era tutto per l&#8217;editor e la parte Javascript! Ci\u00f2 che resta ora \u00e8 il rendering del frontend, che faremo in PHP.<\/p>\n<h2>Rendering del blocco dinamico in PHP<\/h2>\n<p>Prima di immergerci nella funzione di rendering, prendiamoci cura di alcune cose prima.<\/p>\n<p>Per prima cosa dobbiamo accodare lo script cycle2 nel frontend in modo che il nostro codice slider si trasformi effettivamente in uno slider. Lo facciamo con una semplice funzione agganciata a <code>wp_enqueue_scripts<\/code>. Regola quanto segue se hai optato per un altro script di scorrimento.<\/p>\n<pre><code>add_action('wp_enqueue_scripts', function() {\n    wp_enqueue_script(\n        'cycle2-slider-js', \n        get_template_directory_uri(). '\/assets\/js\/jquery.cycle2.min.js', \n        ['jquery'], \n        '', \n        true\n    );\n});<\/code><\/pre>\n<p>In secondo luogo vogliamo tornare alla <code>register_block_type()<\/code>chiamata di funzione. Quando gestiamo i blocchi dinamici dovremmo assolutamente aggiungere un nuovo argomento; <code>attributes<\/code>. In questo argomento definiamo tutti gli attributi che abbiamo definito <code>registerBlockType<\/code>in Javascript, inclusi i loro valori predefiniti. In caso contrario, non tutti gli attributi saranno disponibili nel nostro callback di rendering. Se un attributo \u00e8 stato lasciato invariato nell&#8217;editor dei blocchi, l&#8217;attributo e il suo valore non saranno disponibili nell&#8217;array degli attributi in PHP. Quindi ti consiglio di fare sempre attenzione ad aggiungere l&#8217; <code>attributes<\/code>array alla funzione PHP <code>register_block_type()<\/code>quando lavori con blocchi dinamici. Per il nostro blocco sarebbe simile a questo:<\/p>\n<pre><code>register_block_type('awp\/slider', [\n    'editor_script' =&gt; 'awp-block-slider-js',\n    'editor_style' =&gt; 'awp-block-slider-style',\n    'render_callback' =&gt; 'awp_gutenberg_slider_render',\n    'attributes' =&gt; [\n        'align' =&gt; ['type' =&gt; 'string', 'default' =&gt; 'center'],\n        'termId' =&gt; ['type' =&gt; 'number', 'default' =&gt; 0],\n        'numSlides' =&gt; ['type' =&gt; 'number', 'default' =&gt; 3]\n    ]\n]);<\/code><\/pre>\n<p>Ora torniamo alla nostra funzione di rendering di callback <code>awp_gutenberg_slider_render()<\/code>. L&#8217;output dipende completamente da te, soprattutto se hai scelto di utilizzare un altro script di scorrimento. Quello che segue \u00e8 un semplice esempio.<\/p>\n<p>L&#8217;idea principale \u00e8 che controlliamo se \u00e8 stato scelto o meno un termine (<code>$attributes['termId']<\/code>). Se \u00e8 popolato, creiamo un <code>[WP_Query](https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/)()<\/code>argomento con gli argomenti per il numero di post (<code>$attributes['numSlides']<\/code>) e l&#8217;ID della categoria selezionata. Quindi si tratta di generare l&#8217;HTML corretto per far funzionare cycle2, scorrere i post e visualizzare le immagini in primo piano come diapositive.<\/p>\n<pre><code>function awp_gutenberg_slider_render($attributes, $content) {\n    if (empty($attributes['termId'])) {\n        return '';\n    }\n\u00a0\n    $postQuery = new WP_Query([\n        'posts_per_page' =&gt; $attributes['numSlides'],\n        'cat' =&gt; $attributes['termId']\n    ]);\n\u00a0\n    if ($postQuery-&gt;have_posts()) {\n        $output = '&lt;div class=\"wp-block-awp-slider align'. $attributes['align']. '\"&gt;';\n        $output .= '&lt;div class=\"cycle-slideshow\" data-cycle-timeout=4000&gt;';\n        while ($postQuery-&gt;have_posts()) {\n            $postQuery-&gt;the_post();\n\u00a0\n            if (has_post_thumbnail()) {\n                $img_url = get_the_post_thumbnail_url(get_the_ID(), 'loop-thumbnail');\n                $output .= '&lt;img src=\"'. $img_url. '\" \/&gt;';\n            }\n        }\n        wp_reset_postdata();\n        $output .= '&lt;\/div&gt;';\n        $output .= '&lt;\/div&gt;';\n\u00a0\n        return $output;\n\u00a0\n    } else {\n        return '';\n    }\n}<\/code><\/pre>\n<p>Nota come aggiungo la corretta classe di allineamento dei blocchi in linea <code>#12<\/code>. Il risultato dovrebbe essere uno slider delle immagini in primo piano. Tieni presente che questo \u00e8 un esempio di base che presenta alcuni difetti. Ad esempio, recuperiamo gli ultimi tre post dalla categoria selezionata. Ma supponendo che uno di loro non abbia un&#8217;immagine in primo piano, il dispositivo di scorrimento mostrer\u00e0 solo due post.<\/p>\n<p>La cosa importante da ricordare \u00e8 restituire una stringa e non farla eco. Raccomando anche di utilizzare una sorta di funzionalit\u00e0 di creazione di modelli nel tema per rendering a blocchi dinamici come questi. Pu\u00f2 diventare rapidamente una riparazione disordinata e la creazione di HTML come una stringa.<\/p>\n<h2>Parole finali<\/h2>\n<p>Questo tutorial ti ha mostrato come creare un blocco personalizzato WordPress Gutenberg dinamico in cui esegui il rendering del contenuto del frontend in PHP. E hai visto come utilizzare il componente di ordine superiore per <code>withSelect<\/code>eseguire query per tutti i termini di categoria e un metodo per visualizzare un elenco selezionabile.<\/p>\n<p>Tutto il codice sopra \u00e8 scritto nel modo pi\u00f9 semplice possibile. Ho solo aggiunto il minimo assoluto di impostazioni. Il dispositivo di scorrimento funziona ma di solito ne vuoi di pi\u00f9, ad esempio creare collegamenti alle diapositive, mostrare i titoli dei post, le frecce del dispositivo di scorrimento o l&#8217;opzione per personalizzare la velocit\u00e0 o altre impostazioni del dispositivo di scorrimento. L&#8217;idea \u00e8 di mostrarti le basi e semplificare l&#8217;estensione, la costruzione e la modifica per soddisfare le esigenze del tuo progetto.<\/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>Un tutorial su come creare un blocco Gutenberg dinamico di WordPress con withSelect e rendering PHP. Il risultato finale \u00e8 uno slider.<\/p>\n","protected":false},"author":1,"featured_media":151907,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,720,939,939,1110,814,814,720,844,844,865,865],"tags":[1168],"class_list":["post-233884","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-gutenberg-6","category-n-a","category-plugin-2","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233884","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=233884"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233884\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/151907"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}