{"id":233420,"date":"2023-02-12T15:12:00","date_gmt":"2023-02-12T12:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233420"},"modified":"2022-11-10T23:35:32","modified_gmt":"2022-11-10T20:35:32","slug":"come-aggiungere-unimmagine-seleziona-nel-blocco-gutenberg-di-wordpress-personalizzato","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-unimmagine-seleziona-nel-blocco-gutenberg-di-wordpress-personalizzato\/","title":{"rendered":"Come aggiungere un&#8217;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato"},"content":{"rendered":"\n<p>Questo post \u00e8 per te che stai creando un blocco Gutenberg personalizzato e hai bisogno di un modo per selezionare o caricare un&#8217;immagine dalla Libreria multimediale. La maggior parte degli altri tipi di campo, come caselle di controllo, input di testo o colorpicker, sono abbastanza facili da aggiungere, ma un caricatore multimediale richiede un po&#8217; pi\u00f9 di codice. Creeremo un componente Inspector che \u00e8 responsabile del rendering di un pulsante per aprire il Catalogo multimediale, selezionare un&#8217;immagine e, facoltativamente, rimuoverla o modificarla in un secondo momento. Il tutto utilizzando componenti standard di WordPress.<\/p>\n<p>Prima di approfondire il codice, tieni presente che questo post richiede alcune conoscenze di Gutenberg su come scrivere blocchi personalizzati. Ci concentreremo solo sulla parte dell&#8217;uploader multimediale e non su come registrarsi e creare un blocco Gutenberg in s\u00e9. Se non sei sicuro di come scrivere un blocco Gutenberg personalizzato, ho una serie di tutorial che copre esattamente questo:<\/p>\n<p>Detto questo, tuffiamoci subito!<\/p>\n<h2>Cosa faremo<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.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-153621-61e511f57cf93.png\" alt=\"Come aggiungere un&#039;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato\" ><\/a><\/p>\n<p>La funzione di selezione dei media sar\u00e0 funzionalmente esattamente la stessa della funzione di immagine in primo piano di WordPress. All&#8217;interno di Inspector aggiungeremo un pannello che consiste in un pulsante per scegliere un&#8217;immagine.<\/p>\n<p>Quando si fa clic sul pulsante, viene visualizzata la finestra &quot;Seleziona o carica file multimediali&quot; che consente di selezionare un file dal Catalogo multimediale. Limitiamo il Catalogo multimediale a mostrare solo le immagini. Una volta selezionata un&#8217;immagine, il popup si chiude e il pannello visualizza in anteprima un piccola miniatura dell&#8217;immagine selezionata. Sotto appariranno i pulsanti di anteprima per modificare e rimuovere l&#8217;immagine. Esattamente come con l&#8217;immagine in primo piano.<\/p>\n<p>Questo tutorial presuppone che utilizzerai l&#8217;immagine selezionata come sfondo del blocco, solo come esempio. Questo \u00e8 il motivo per cui memorizziamo l&#8217;URL dell&#8217;immagine. Includer\u00f2 un esempio su come utilizzare l&#8217;immagine selezionata (sia nella funzione <code>edit<\/code>che nella <code>save<\/code>funzione). Quando si sceglie un&#8217;immagine, l&#8217;immagine apparir\u00e0 come sfondo del nostro blocco, sia all&#8217;interno dell&#8217;editor che nel frontend.<\/p>\n<p>Memorizziamo l&#8217;ID del supporto e l&#8217;URL del supporto negli attributi del blocco. Il codice utilizza <code>withSelect<\/code>, un componente di ordine superiore fornito nel <code>wp.data<\/code>pacchetto, per richiedere ulteriori informazioni sul supporto selezionato, in base all&#8217;ID.<\/p>\n<p>Sto anche &quot;prendendo in prestito&quot; i nomi delle classi dalla funzionalit\u00e0 dell&#8217;immagine in primo piano di WordPress per assicurarmi che tutto appaia a posto e non sia necessario scrivere alcun CSS da soli. Questo \u00e8 ovviamente facoltativo.<\/p>\n<h2>Salvataggio del supporto selezionato negli attributi<\/h2>\n<p>Quello che devi salvare negli attributi del tuo blocco dipende un po&#8217; da te. Come minimo dobbiamo memorizzare l&#8217;ID del supporto, ovviamente. Questo potrebbe essere sufficiente se non \u00e8 necessario utilizzare l&#8217;URL del supporto in un punto qualsiasi del codice dello script. Ad esempio, se utilizzi <code>ServerSideRender<\/code>dove PHP \u00e8 responsabile del rendering dell&#8217;output del blocco. In tal caso puoi facilmente ottenere l&#8217;URL dell&#8217;immagine dall&#8217;ID del supporto utilizzando ad esempio <code>[wp_get_attachment_image_src](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_attachment_image_src\/)()<\/code>. Tuttavia, nell&#8217;esempio seguente sto mostrando un semplice esempio di visualizzazione dell&#8217;immagine come sfondo del nostro blocco, quindi memorizzo anche l&#8217;URL multimediale come attributo. Useremo l&#8217;attributo URL sia in <code>edit<\/code>(per aggiungere lo sfondo nell&#8217;editor) che in <code>save<\/code>(per aggiungere lo sfondo nel frontend).<\/p>\n<p>Iniziamo definendo i nostri attributi. L&#8217;ID supporto deve essere il numero del tipo e il valore predefinito \u00e8 0. Ci\u00f2 semplifica il confronto. E l&#8217;URL del supporto dovrebbe essere di tipo string con una stringa vuota predefinita.<\/p>\n<pre><code>attributes: {\n    mediaId: {\n        type: 'number',\n        default: 0\n    },\n    mediaUrl: {\n        type: 'string',\n        default: ''\n    }\n},<\/code><\/pre>\n<h2>Creazione del componente<\/h2>\n<p>Per rendere il nostro codice pi\u00f9 ordinato definiamo un componente separato per la <code>edit<\/code>funzione del blocco. In seguito passeremo questo componente <code>withSelect<\/code>per avvolgerlo attorno al nostro componente.<\/p>\n<p>Nella restituzione del componente rendiamo semplice <code>&lt;div&gt;<\/code>per il contenuto del blocco. Presumo che avrai o avrai pi\u00f9 contenuti di blocco effettivi per sostituire il contenuto di esempio fittizio. Eseguiamo anche il rendering <code>InspectorControls<\/code>(pacchetto <code>wp.blockEditor<\/code>) per aggiungere una sezione all&#8217;ispettore. Per ora aggiungo un vuoto <code>PanelBody<\/code>all&#8217;interno del file <code>InspectorControls<\/code>. Aggiungo una <code>&lt;div&gt;<\/code>con la stessa classe utilizzata dalla sezione delle immagini in primo piano di WordPress. Questo assicura che il nostro stile abbia un bell&#8217;aspetto. In seguito lo riempiremo <code>PanelBody<\/code>con il codice per la funzionalit\u00e0 del supporto selezionato.<\/p>\n<p>Ma prima, destrutturamo il componente necessario all&#8217;inizio del file:<\/p>\n<pre><code>const { InspectorControls } = wp.blockEditor;\nconst { PanelBody } = wp.components;\nconst { Fragment } = wp.element;<\/code><\/pre>\n<p>Sopra <code>registerBlockType<\/code>definisco un semplice componente chiamato <code>BlockEdit<\/code>. Se preferisci spostarlo in un file separato, puoi farlo. Questo \u00e8 comune e consigliato, ma per questo tutorial manterr\u00f2 le cose semplici e lo tengo nello stesso file.<\/p>\n<pre><code>const BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    return (&lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Select block background image', 'awp')}\n                    initialOpen={ true }\n                &gt;\n                    &lt;div className=\"editor-post-featured-image\"&gt;\n                        ...We will add code here...\n                    &lt;\/div&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n};<\/code><\/pre>\n<p>Ora vogliamo rendere questo componente nella nostra <code>edit<\/code>funzione. Ma vogliamo avvolgerlo in un <code>withSelect<\/code>.<\/p>\n<h2>Utilizzo <code>withSelect<\/code>nella <code>edit<\/code>funzione<\/h2>\n<p>Se non hai familiarit\u00e0 con <code>withSelect<\/code>, \u00e8 un utile componente di ordine superiore che ci consente di eseguire query. Ad esempio, puoi interrogare i post con questo. Utilizzeremo tuttavia la funzione <code>select('core').getMedia()<\/code>per interrogare l&#8217;ID del supporto. Come risposta otterremo un oggetto con tutte le informazioni dei media. L&#8217;oggetto multimediale che otteniamo in risposta verr\u00e0 quindi fornito come supporto nel nostro <code>BlockEdit<\/code>componente, pronto per l&#8217;uso. Elegante.<\/p>\n<p>Ci assicuriamo di interrogare il supporto solo se l&#8217;attributo ID supporto \u00e8 effettivamente impostato su qualcosa di diverso da 0. Ecco come apparir\u00e0 la nostra funzione di modifica:<\/p>\n<pre><code>edit: withSelect((select, props) =&gt; {\n    return { media: props.attributes.mediaId? select('core').getMedia(props.attributes.mediaId): undefined };\n})(BlockEdit),<\/code><\/pre>\n<p>Alla fine, dopo aver chiuso <code>withSelect<\/code>in fila, <code>#3<\/code>\u00e8 dove chiediamo <code>withSelect<\/code>di restituire il nostro <code>BlockEdit<\/code>componente. Con questo il nostro <code>BlockEdit<\/code>componente ora ha accesso a <code>props.media<\/code>.<\/p>\n<h2>Rendering di una selezione multimediale<\/h2>\n<p>Infine arriva la parte divertente: la parte nell&#8217;ispettore.<\/p>\n<p>Il componente che ci interessa \u00e8 <code>MediaUpload<\/code>(pacchetto <code>wp.blockEditor<\/code>). Se sei interessato, il repository Github di WordPress per Gutenberg ha <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/block-editor\/src\/components\/media-upload\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">della documentazione su questo componente<\/a>. Avvolgeremo anche questo componente all&#8217;interno di un componente chiamato <code>MediaUploadCheck<\/code>(package <code>wp.blockEditor<\/code>). Questo componente si assicura che l&#8217;utente corrente disponga delle capacit\u00e0 per utilizzare il Catalogo multimediale, quindi \u00e8 buona norma utilizzarlo.<\/p>\n<p>Il <code>MediaUpload<\/code>componente ha un prop richiesto: <code>render<\/code>. Il modo in cui funziona questo componente \u00e8 che definiamo una funzione per l&#8217; oggetto di <code>render<\/code>scena in cui eseguiamo il rendering dell&#8217;output per &quot;l&#8217;area di caricamento multimediale&quot;. Nel nostro caso renderemo un <code>Button<\/code>(pacchetto <code>wp.components<\/code>). All&#8217;interno del supporto di rendering di MediaUpload otteniamo l&#8217;accesso alla <code>open<\/code>funzione che possiamo chiamare per fare in modo che WordPress apra il popup della Libreria multimediale:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f6d571d.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-153621-61e511f6d571d.png\" alt=\"Come aggiungere un&#039;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato\" ><\/a><\/p>\n<p>Sono disponibili altri oggetti di scena per <code>MediaUpload<\/code>. Tratteremo quelli importanti per renderlo funzionale in questo tutorial, ma ce ne sono altri con cui puoi giocare. Potresti almeno essere interessato al supporto <code>allowedTypes<\/code>in cui puoi limitare i tipi di file che \u00e8 possibile selezionare nella Libreria. Nel nostro caso lo impostiamo per consentire solo le immagini.<\/p>\n<h3>Aggiungendo il<code>MediaUpload<\/code><\/h3>\n<p>Destrutturare prima i nuovi componenti;<\/p>\n<pre><code>const { Button } = wp.components;\nconst { MediaUpload, MediaUploadCheck } = wp.blockEditor;<\/code><\/pre>\n<p>Aggiungiamo <code>MediaUploadCheck<\/code>e <code>MediaUpload<\/code>dentro il nostro <code>div<\/code>nel nostro <code>PanelBody<\/code>:<\/p>\n<pre><code>&lt;div className=\"editor-post-featured-image\"&gt;\n    &lt;MediaUploadCheck&gt;\n        &lt;MediaUpload\n            allowedTypes={ ['image'] }\n            render={({open}) =&gt; (&lt;Button \n                    className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n                    onClick={open}\n                &gt;\n                    {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n                &lt;\/Button&gt;\n            )}\n        \/&gt;\n    &lt;\/MediaUploadCheck&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fa0bf3f.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-153621-61e511fa0bf3f.png\" alt=\"Come aggiungere un&#039;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato\" ><\/a><\/p>\n<p>Il codice sopra destruttura <code>open<\/code>all&#8217;interno della funzione per <code>render<\/code>. Rendiamo semplice <code>Button<\/code>dove la sua <code>onClick<\/code>propriet\u00e0 eseguir\u00e0 la <code>open<\/code>funzione. Ho anche aggiunto gli stessi nomi di classe della funzionalit\u00e0 dell&#8217;immagine in primo piano di WordPress per assicurarci di non dover aggiungere alcuno stile.<\/p>\n<p>All&#8217;interno del <code>Button<\/code>componente controlliamo se \u00e8 stata impostata o meno un&#8217;immagine (<code>attributes.mediaId<\/code>). In caso contrario, facciamo eco al testo &quot;Scegli un&#8217;immagine&quot;. Ora dovremmo averlo nel nostro blocco.<\/p>\n<p>Quando si fa clic sul pulsante, dovrebbe apparire il popup Catalogo multimediale. Tuttavia, la selezione di un&#8217;immagine non funziona al momento, perch\u00e9 ci mancano gli oggetti di scena <code>onSelect<\/code>e su. Risolviamolo ora. Impostiamo l&#8217;ID del supporto selezionato e impostiamo l&#8217;esecuzione di una funzione che definiremo in seguito all&#8217;interno del nostro componente.<code>value``MediaUpload``value``onSelect<\/code><\/p>\n<pre><code>...\n&lt;MediaUploadCheck&gt;\n    &lt;MediaUpload\n        onSelect={onSelectMedia}\n        value={attributes.mediaId}\n        allowedTypes={ ['image'] }\n        ...<\/code><\/pre>\n<p>Definiamo la <code>onSelectMedia<\/code>funzione all&#8217;interno del nostro componente.<\/p>\n<h3>Gestione della selezione dei media<\/h3>\n<p><strong>Nota<\/strong>: sto definendo le mie funzioni come funzioni freccia (<code>onSelectMedia =() =&gt; { }<\/code>). Le funzioni delle frecce sono piuttosto nuove in ESNext e piuttosto eleganti. Lo svantaggio \u00e8 che l&#8217;utilizzo delle funzioni freccia richiede l&#8217;aggiunta del supporto per questo nella configurazione di Babel. Se non l&#8217;hai fatto, ti consiglio di guardare sotto il titolo &quot;Impostazione di Babel&quot; in <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-gutenberg-blocks-part-1-setting-up-the-development-environment\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo post<\/a>.<\/p>\n<p>Subito prima dell&#8217;istruzione di ritorno del componente definisco una <code>onSelectMedia<\/code>funzione. Tutto quello che dobbiamo fare \u00e8 aggiornare i nostri attributi usando <code>setAttributes()<\/code>. Come parametro <code>onSelectMedia<\/code>otteniamo un oggetto multimediale. Estraiamo semplicemente ci\u00f2 di cui abbiamo bisogno dall&#8217;oggetto multimediale. Nel nostro caso sono l&#8217;ID del supporto e l&#8217;URL a grandezza naturale, che sono rispettivamente le propriet\u00e0 <code>id<\/code>e <code>url<\/code>.<\/p>\n<pre><code>const BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const onSelectMedia = (media) =&gt; {\n        props.setAttributes({\n            mediaId: media.id,\n            mediaUrl: media.url\n        });\n    }\n\u00a0\n    return(\n        ...<\/code><\/pre>\n<p>Provalo ora e ora sarai in grado di selezionare un&#8217;immagine dalla Libreria multimediale. Il supporto selezionato viene salvato negli attributi del blocco. Tuttavia non c&#8217;\u00e8 ancora un&#8217;anteprima nell&#8217;Inspector e poich\u00e9 hai selezionato un&#8217;immagine il pulsante per selezionare un&#8217;immagine scompare. Il pannello ora \u00e8 vuoto. Il passaggio successivo \u00e8 il rendering dell&#8217;anteprima ogni volta che \u00e8 stata selezionata un&#8217;immagine, oltre a fornire le opzioni per rimuoverla o modificarla.<\/p>\n<h2>Rendering di un&#8217;immagine di anteprima<\/h2>\n<p>All&#8217;interno del <code>Button<\/code>componente che renderizziamo all&#8217;interno <code>MediaUpload<\/code>del <code>render<\/code>prop di &#8216; echeggiamo un testo &quot;Scegli un&#8217;immagine&quot; se un&#8217;immagine non \u00e8 ancora impostata. Ma abbiamo bisogno di aggiungere del codice per quando un&#8217;immagine \u00e8 impostata all&#8217;interno qui; un&#8217;anteprima.<\/p>\n<p>Per aiutarci a rendere una bella anteprima utilizziamo il componente <code>ResponsiveWrapper<\/code>(pacchetto <code>wp.components<\/code>). Al fine di <code>ResponsiveWrapper<\/code>funzionare completamente, dobbiamo fornire puntelli per l&#8217;altezza e la larghezza. Abbiamo anche bisogno dell&#8217;URL della miniatura. Non ha senso usare l&#8217;URL completo (che pu\u00f2 essere gigantesco) per eseguire il rendering di un&#8217;anteprima all&#8217;interno dell&#8217;Inspector. \u00c8 qui che <code>withSelect<\/code>entra in gioco il sostegno. All&#8217;interno del componente eseguiamo il rendering di un semplice <code>&lt;img&gt;<\/code>tag HTML.<\/p>\n<p>Per prima cosa destrutturiamo il componente necessario:<\/p>\n<pre><code>const { ResponsiveWrapper } = wp.components;<\/code><\/pre>\n<pre><code>&lt;Button \n    className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n    onClick={open}\n&gt;\n    {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n    {props.media != undefined &amp;&amp; \n        &lt;ResponsiveWrapper\n                naturalWidth={ props.media.media_details.width }\n            naturalHeight={ props.media.media_details.height }\n            &gt;\n                &lt;img src={props.media.source_url} \/&gt;\n            &lt;\/ResponsiveWrapper&gt;\n    }\n&lt;\/Button&gt;<\/code><\/pre>\n<p>Come puoi vedere accediamo all&#8217;elica che il <code>withSelect<\/code>componente ci ha fornito, <code>props.media<\/code>. Recuperiamo la larghezza, l&#8217;altezza e l&#8217;URL in base alle dimensioni della miniatura del supporto dall&#8217;oggetto.<\/p>\n<p>Ora dovresti ottenere una bella anteprima dell&#8217;immagine selezionata!<\/p>\n<p>Poich\u00e9 eseguiamo il rendering dell&#8217;immagine di anteprima all&#8217;interno del <code>Button<\/code>clic sull&#8217;immagine di anteprima si attiver\u00e0 la funzione <code>Button<\/code>di &#8216; <code>onClick<\/code>, che \u00e8 quella di aprire il Catalogo multimediale. In questo modo puoi gi\u00e0 modificare l&#8217;immagine selezionata.<\/p>\n<p>Al momento non \u00e8 possibile rimuovere o ripristinare l&#8217;immagine selezionata. Risolviamolo!<\/p>\n<h3>Aggiunta di una funzione di rimozione<\/h3>\n<p>Dovremmo almeno offrire all&#8217;utente la possibilit\u00e0 di rimuovere l&#8217;immagine selezionata. A partire da ora, una volta selezionata un&#8217;immagine, puoi solo cambiarla, ma non rimuoverla.<\/p>\n<p>Lo faremo come fa WordPress per l&#8217;immagine in primo piano: una nuova <code>Button<\/code>immagine sotto l&#8217;anteprima (interamente al di fuori del suo <code>MediaUploadCheck<\/code>). Fornendo alcuni oggetti di scena intelligenti, lo <code>Button<\/code>facciamo sembrare un collegamento (<code>isLink<\/code>) con il colore del testo rosso (<code>isDestructive<\/code>). Leggi la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentazione per Button<\/a> per vedere cos&#8217;altro \u00e8 possibile. Avvolgiamo il pulsante all&#8217;interno dell&#8217;ennesimo <code>MediaUploadCheck<\/code>, solo per garantire che l&#8217;utente abbia le giuste capacit\u00e0.<\/p>\n<pre><code>        ...\n        &lt;\/MediaUploadCheck&gt;\n        {attributes.mediaId != 0 &amp;&amp; \n            &lt;MediaUploadCheck&gt;\n                &lt;Button onClick={removeMedia} isLink isDestructive&gt;{__('Remove image', 'awp')}&lt;\/Button&gt;\n            &lt;\/MediaUploadCheck&gt;\n        }\n    &lt;\/div&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>Per questo evento eseguiamo una nuova funzione all&#8217;interno del nostro componente <code>Button<\/code>:. Lo definiamo da qualche parte subito prima della funzione di ritorno del componente, come abbiamo fatto con .<code>onClick``removeMedia()``onSelectMedia<\/code><\/p>\n<pre><code>const removeMedia =() =&gt; {\n    props.setAttributes({\n        mediaId: 0,\n        mediaUrl: ''\n    });\n}<\/code><\/pre>\n<p>Tutto ci\u00f2 che fa questa funzione \u00e8 ripristinare i nostri due valori di attributo.<\/p>\n<p>Ora avremo un link carino e chiaro per rimuovere l&#8217;immagine:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511faedb09.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-153621-61e511faedb09.png\" alt=\"Come aggiungere un&#039;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato\" ><\/a><\/p>\n<p>Quando si fa clic sul nuovo pulsante, l&#8217;immagine selezionata e il pulsante stesso scompaiono e viene visualizzato nuovamente il pulsante per la selezione di un&#8217;immagine.<\/p>\n<h3>Aggiunta di un pulsante di sostituzione<\/h3>\n<p>Questo passaggio \u00e8 completamente facoltativo. Come accennato in precedenza, facendo clic sull&#8217;immagine di anteprima dell&#8217;immagine si aprir\u00e0 la Libreria multimediale e ti consentir\u00e0 di modificare l&#8217;immagine. Tuttavia questo potrebbe non essere cos\u00ec intuitivo da capire per tutti. WordPress aggiunge un pulsante separato per modificare l&#8217;immagine, solo per renderlo molto chiaro. Possiamo fare lo stesso.<\/p>\n<p>Per rendere un pulsante cambia immagine ripetiamo sostanzialmente il codice che abbiamo per selezionare l&#8217;immagine: un altro <code>MediaUpload<\/code>componente. Forniamo la stessa funzione per e <code>onSelect<\/code>come prima. All&#8217;interno dell&#8217;oggetto di scena ne realizziamo semplicemente un altro che apre la Libreria multimediale. Mettiamo questo pulsante prima del pulsante Rimuovi, poich\u00e9 ha pi\u00f9 senso per l&#8217;utente finale:<code>allowedFileTypes``value``render``MediaUpload``Button<\/code><\/p>\n<pre><code>&lt;\/MediaUploadCheck&gt;\n{attributes.mediaId != 0 &amp;&amp; \n    &lt;MediaUploadCheck&gt;\n        &lt;MediaUpload\n            title={__('Replace image', 'awp')}\n            value={attributes.mediaId}\n            onSelect={onSelectMedia}\n            allowedTypes={['image']}\n            render={({open}) =&gt; (&lt;Button onClick={open} isDefault isLarge&gt;{__('Replace image', 'awp')}&lt;\/Button&gt;\n            )}\n        \/&gt;\n    &lt;\/MediaUploadCheck&gt;\n}\n{attributes.mediaId != 0 &amp;&amp; \n    &lt;MediaUploadCheck&gt;\n        &lt;Button onClick={removeMedia} ...<\/code><\/pre>\n<p>Quindi ora dovresti ottenere questo:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.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-153621-61e511f57cf93.png\" alt=\"Come aggiungere un&#039;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato\" ><\/a><\/p>\n<h2>Utilizzando l&#8217;immagine selezionata<\/h2>\n<p>A questo punto dovrebbe essere abbastanza chiaro come utilizzare l&#8217;immagine selezionata. Hai l&#8217;ID media e l&#8217;URL media memorizzati negli attributi del tuo blocco. Tuttavia, come semplice esempio includer\u00f2 del codice che imposta l&#8217;immagine selezionata come sfondo del blocco. Il codice pu\u00f2 essere eseguito esattamente allo stesso modo in entrambe <code>edit<\/code>le <code>save<\/code>funzioni e. Creiamo semplicemente un oggetto di stile che applichiamo sul div di wrapping del blocco. Nell&#8217;oggetto di stile impostiamo l&#8217;immagine di sfondo sull&#8217;URL del media.<\/p>\n<pre><code>    ...\n    const blockStyle = {\n        backgroundImage: attributes.mediaUrl != 0? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n    };\n\u00a0\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n            ...\n            &lt;\/InspectorControls&gt;\n            &lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n        ...<\/code><\/pre>\n<p>Con il resto del contenuto del tuo blocco personalizzato potrebbe facilmente assomigliare a questo:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fd78dce.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-153621-61e511fd78dce.png\" alt=\"Come aggiungere un&#039;immagine Seleziona nel blocco Gutenberg di WordPress personalizzato\" ><\/a><\/p>\n<p>Se applichi lo stile del blocco in entrambi <code>edit<\/code>e <code>save<\/code>, il tuo blocco dovrebbe ora avere il supporto selezionato come sfondo. Sia all&#8217;interno dell&#8217;editor che nel frontend.<\/p>\n<h2>Conclusione<\/h2>\n<p>La selezione di un&#8217;immagine (o file) dalla Libreria multimediale \u00e8 una funzione di cui senza dubbio tu, come sviluppatore Gutenberg, avrai bisogno per i tuoi blocchi. Abbiamo imparato come aggiungere una funzione per selezionare un&#8217;immagine dalla Libreria multimediale nel nostro blocco Gutenberg personalizzato. L&#8217;abbiamo fatto allo stesso modo in cui lo stesso WordPress lo fa per l&#8217;immagine in primo piano. (Modifica maggio 2020: WordPress ha ora aggiornato l&#8217;immagine in primo piano da utilizzare <code>useSelect<\/code>, invece l&#8217;hook React). Questo assicura che il nostro codice non sia &quot;hack-ish&quot; con un alto rischio di violazione degli aggiornamenti futuri.<\/p>\n<p>Fammi sapere se l&#8217;hai usato in qualche modo!<\/p>\n<h2>Codice completo<\/h2>\n<p>Di seguito \u00e8 riportato il codice completo per un blocco personalizzato che presenta la funzionalit\u00e0 di selezione del supporto. E nient&#8217;altro davvero. Quella parte dipende da te!<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { InspectorControls, MediaUpload, MediaUploadCheck } = wp.blockEditor;\nconst { PanelBody, Button, ResponsiveWrapper } = wp.components;\nconst { Fragment } = wp.element;\nconst { withSelect } = wp.data;\nconst { __ } = wp.i18n;\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const removeMedia = () =&gt; {\n        props.setAttributes({\n            mediaId: 0,\n            mediaUrl: ''\n        });\n    }\n    const onSelectMedia = (media) =&gt; {\n        props.setAttributes({\n            mediaId: media.id,\n            mediaUrl: media.url\n        });\n    }\n\u00a0\n    const blockStyle = {\n        backgroundImage: attributes.mediaUrl != ''? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n    };\n    return (&lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Select block background image', 'awp')}\n                    initialOpen={ true }\n                &gt;\n                    &lt;div className=\"editor-post-featured-image\"&gt;\n                        &lt;MediaUploadCheck&gt;\n                            &lt;MediaUpload\n                                onSelect={onSelectMedia}\n                                value={attributes.mediaId}\n                                allowedTypes={ ['image'] }\n                                render={({open}) =&gt; (&lt;Button \n                                        className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n                                        onClick={open}\n                                    &gt;\n                                        {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n                                        {props.media != undefined &amp;&amp; \n                                                &lt;ResponsiveWrapper\n                                                naturalWidth={ props.media.media_details.width }\n                                            naturalHeight={ props.media.media_details.height }\n                                            &gt;\n                                                &lt;img src={props.media.source_url} \/&gt;\n                                            &lt;\/ResponsiveWrapper&gt;\n                                            }\n                                    &lt;\/Button&gt;\n                                )}\n                            \/&gt;\n                        &lt;\/MediaUploadCheck&gt;\n                        {attributes.mediaId != 0 &amp;&amp; \n                            &lt;MediaUploadCheck&gt;\n                                &lt;MediaUpload\n                                    title={__('Replace image', 'awp')}\n                                    value={attributes.mediaId}\n                                    onSelect={onSelectMedia}\n                                    allowedTypes={['image']}\n                                    render={({open}) =&gt; (&lt;Button onClick={open} isDefault isLarge&gt;{__('Replace image', 'awp')}&lt;\/Button&gt;\n                                    )}\n                                \/&gt;\n                            &lt;\/MediaUploadCheck&gt;\n                        }\n                        {attributes.mediaId != 0 &amp;&amp; \n                            &lt;MediaUploadCheck&gt;\n                                &lt;Button onClick={removeMedia} isLink isDestructive&gt;{__('Remove image', 'awp')}&lt;\/Button&gt;\n                            &lt;\/MediaUploadCheck&gt;\n                        }\n                    &lt;\/div&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n};\nregisterBlockType('awp\/imageselectinspector', {\n    title: 'AWP Imageselect',\n    icon: 'smiley',\n    category: 'layout',\n    supports: {\n        align: true\n    },\n    attributes: {\n        mediaId: {\n            type: 'number',\n            default: 0\n        },\n        mediaUrl: {\n            type: 'string',\n            default: ''\n        }\n    }, \n    edit: withSelect((select, props) =&gt; {\n        return { media: props.attributes.mediaId? select('core').getMedia(props.attributes.mediaId): undefined };\n    })(BlockEdit),\n    save: (props) =&gt; {\n        const { attributes } = props;\n        const blockStyle = {\n            backgroundImage: attributes.mediaUrl != ''? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n        };\n        return (&lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\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>Questo tutorial spiega come aggiungere un pulsante di selezione o caricamento dell&#8217;immagine per la Libreria multimediale all&#8217;interno di Inspector per il blocco Gutenberg di WordPress personalizzato.<\/p>\n","protected":false},"author":1,"featured_media":153622,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,835,939,939,731,731,1110,804,804,814,814,835,844,844,865,865],"tags":[1168],"class_list":["post-233420","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-guida-per-principianti","category-gutenberg-6","category-javascript-6","category-n-a","category-php-6","category-plugin-2","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233420","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=233420"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233420\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/153622"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}