{"id":233360,"date":"2023-02-12T15:44:00","date_gmt":"2023-02-12T12:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233360"},"modified":"2022-11-10T20:41:05","modified_gmt":"2022-11-10T17:41:05","slug":"hur-man-laegger-till-en-bildval-i-ditt-anpassade-wordpress-gutenberg-block","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-laegger-till-en-bildval-i-ditt-anpassade-wordpress-gutenberg-block\/","title":{"rendered":"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block"},"content":{"rendered":"\n<p>Det h\u00e4r inl\u00e4gget \u00e4r f\u00f6r dig som skapar ett anpassat Gutenberg-block och beh\u00f6ver ett s\u00e4tt att v\u00e4lja eller ladda upp en bild fr\u00e5n mediebiblioteket. De flesta andra f\u00e4lttyper, s\u00e5som kryssrutor, textinmatning eller f\u00e4rgv\u00e4ljare, \u00e4r ganska enkla att l\u00e4gga till men en medieuppladdningsverktyg kr\u00e4ver lite mer kod. Vi kommer att skapa en Inspector-komponent som \u00e4r ansvarig f\u00f6r att rendera en knapp f\u00f6r att \u00f6ppna Media Library, v\u00e4lja en bild och eventuellt ta bort eller \u00e4ndra den vid ett senare tillf\u00e4lle. Alla anv\u00e4nder vanliga WordPress-komponenter.<\/p>\n<p>Innan vi dyker in i koden, kom ih\u00e5g att detta inl\u00e4gg kr\u00e4ver viss Gutenberg-kunskap i hur man skriver anpassade block. Vi kommer bara att fokusera p\u00e5 medieuppladdningsdelen och inte hur man registrerar sig och g\u00f6r ett Gutenberg-block i sig. Om du \u00e4r os\u00e4ker p\u00e5 hur man skriver ett anpassat Gutenberg-block har jag en handledningsserie som t\u00e4cker exakt detta:<\/p>\n<p>Med det ur v\u00e4gen, l\u00e5t oss dyka direkt in!<\/p>\n<h2>Vad vi ska g\u00f6ra<\/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=\"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block\" ><\/a><\/p>\n<p>Funktionen f\u00f6r att v\u00e4lja media kommer funktionellt att vara exakt densamma som WordPress utvalda bildfunktion. Vi kommer inuti Inspector att l\u00e4gga till en panel som best\u00e5r av en knapp f\u00f6r att v\u00e4lja en bild.<\/p>\n<p>N\u00e4r du klickar p\u00e5 knappen kommer f\u00f6nstret &quot;V\u00e4lj eller ladda upp media&quot; att dyka upp s\u00e5 att du kan v\u00e4lja en fil fr\u00e5n mediebiblioteket. Vi begr\u00e4nsar mediebiblioteket till att endast visa bilder. N\u00e4r en bild har valts st\u00e4ngs popup-f\u00f6nstret och panelen f\u00f6rhandsgranskar en liten miniatyr av den valda bilden. Nedan visas f\u00f6rhandsgranskningsknapparna f\u00f6r att \u00e4ndra och ta bort bilden. Exakt som med utvald bild.<\/p>\n<p>Denna handledning f\u00f6ruts\u00e4tter att du kommer att anv\u00e4nda den valda bilden som blockets bakgrund &#8211; bara som ett exempel. Det \u00e4r d\u00e4rf\u00f6r vi lagrar bildens URL. Jag ska inkludera ett exempel p\u00e5 hur man anv\u00e4nder den valda bilden (b\u00e5de i <code>edit<\/code>och i <code>save<\/code>funktionen). N\u00e4r du v\u00e4ljer en bild kommer bilden att visas som bakgrund till v\u00e5rt block, b\u00e5de i editorn och i frontend.<\/p>\n<p>Vi lagrar media-ID och media-URL i blockets attribut. Koden anv\u00e4nder <code>withSelect<\/code>, en h\u00f6gre ordningskomponent som tillhandah\u00e5lls i <code>wp.data<\/code>paketet, f\u00f6r att s\u00f6ka mer information om det valda mediet, med ID.<\/p>\n<p>Jag &quot;l\u00e5nar&quot; \u00e4ven klassnamn fr\u00e5n WordPresss utvalda bildfunktionalitet f\u00f6r att s\u00e4kerst\u00e4lla att allt ser bra ut och att det inte finns n\u00e5got behov av att skriva n\u00e5gon CSS sj\u00e4lv. Detta \u00e4r naturligtvis valfritt.<\/p>\n<h2>Spara det valda mediet i attribut<\/h2>\n<p>Vad du beh\u00f6ver spara i ditt blocks attribut \u00e4r lite upp till dig. Som ett minimum m\u00e5ste vi lagra media-ID, s\u00e5 klart. Detta kan vara tillr\u00e4ckligt om du inte beh\u00f6ver anv\u00e4nda medias URL n\u00e5gonstans i skriptkoden. Till exempel om du anv\u00e4nder <code>ServerSideRender<\/code>d\u00e4r PHP \u00e4r ansvarig f\u00f6r att rendera blockets utdata. I s\u00e5 fall kan du enkelt f\u00e5 bildens URL fr\u00e5n media-ID med <code>[wp_get_attachment_image_src](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_attachment_image_src\/)()<\/code>t.ex. Men i exemplet nedan visar jag ett enkelt exempel p\u00e5 att visa bilden som bakgrund till v\u00e5rt block, s\u00e5 jag lagrar \u00e4ven media-URL som attribut. Vi kommer att anv\u00e4nda URL-attributet i b\u00e5de <code>edit<\/code>(f\u00f6r att l\u00e4gga till bakgrunden i editorn) och i <code>save<\/code>(f\u00f6r att l\u00e4gga till bakgrunden i frontend).<\/p>\n<p>L\u00e5t oss b\u00f6rja med att definiera v\u00e5ra attribut. Media ID ska vara typnummer och standard till 0. Detta g\u00f6r det enkelt att j\u00e4mf\u00f6ra mot. Och media URL ska vara typ str\u00e4ng med standard tom str\u00e4ng.<\/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>Skapar komponenten<\/h2>\n<p>F\u00f6r att g\u00f6ra v\u00e5r kod mer \u00f6versk\u00e5dlig definierar vi en separat komponent f\u00f6r blockets <code>edit<\/code>funktion. Vi kommer senare att vidarebefordra denna komponent till <code>withSelect<\/code>att linda den runt v\u00e5r komponent.<\/p>\n<p>I komponentens retur g\u00f6r vi ett enkelt <code>&lt;div&gt;<\/code>f\u00f6r blockinneh\u00e5llet. Jag antar att du kommer eller har mer faktiskt blockinneh\u00e5ll f\u00f6r att ers\u00e4tta dummy-exemplets inneh\u00e5ll. Vi renderar ocks\u00e5 <code>InspectorControls<\/code>(paket <code>wp.blockEditor<\/code>) f\u00f6r att l\u00e4gga till ett avsnitt till inspekt\u00f6ren. F\u00f6r nu l\u00e4gger jag till en tom <code>PanelBody<\/code>inuti <code>InspectorControls<\/code>. Jag l\u00e4gger till en <code>&lt;div&gt;<\/code>med samma klass som WordPress&#8217; utvalda bildsektion anv\u00e4nder. Detta g\u00f6r att v\u00e5r styling ser bra ut. Senare kommer vi att fylla detta <code>PanelBody<\/code>med koden f\u00f6r den valda mediafunktionen.<\/p>\n<p>Men f\u00f6rst, l\u00e5t oss destrukturera den n\u00f6dv\u00e4ndiga komponenten i b\u00f6rjan av filen:<\/p>\n<pre><code>const { InspectorControls } = wp.blockEditor;\nconst { PanelBody } = wp.components;\nconst { Fragment } = wp.element;<\/code><\/pre>\n<p>Ovanf\u00f6r <code>registerBlockType<\/code>definierar jag en enkel komponent som heter <code>BlockEdit<\/code>. Om du f\u00f6redrar att flytta detta till en separat fil \u00e4r du v\u00e4lkommen att g\u00f6ra det. Detta \u00e4r vanligt och rekommenderat, men f\u00f6r den h\u00e4r handledningen h\u00e5ller jag saker enkelt och h\u00e5ller det i samma fil.<\/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>Nu vill vi \u00e5terge denna komponent i v\u00e5r <code>edit<\/code>funktion. Men vi vill sl\u00e5 in det i en <code>withSelect<\/code>.<\/p>\n<h2>Anv\u00e4nder <code>withSelect<\/code>i <code>edit<\/code>funktionen<\/h2>\n<p>Om du inte \u00e4r bekant med <code>withSelect<\/code>, \u00e4r det en anv\u00e4ndbar h\u00f6gre ordningskomponent som l\u00e5ter oss utf\u00f6ra fr\u00e5gor. Du kan till exempel fr\u00e5ga inl\u00e4gg med detta. Vi kommer dock att anv\u00e4nda funktionen <code>select('core').getMedia()<\/code>f\u00f6r att fr\u00e5ga media-ID:t. Som svar f\u00e5r vi ett objekt med all medias information. Medieobjektet vi f\u00e5r som svar kommer sedan att tillhandah\u00e5llas som rekvisita i v\u00e5r <code>BlockEdit<\/code>komponent, redo att anv\u00e4ndas. Tjusig.<\/p>\n<p>Vi ser till att bara fr\u00e5ga media om media ID-attributet faktiskt \u00e4r inst\u00e4llt p\u00e5 n\u00e5got annat \u00e4n 0. S\u00e5 h\u00e4r kommer v\u00e5r redigeringsfunktion att se ut:<\/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>I slutet, efter att ha st\u00e4ngt <code>withSelect<\/code>i k\u00f6 <code>#3<\/code>\u00e4r det d\u00e4r vi ber <code>withSelect<\/code>om att returnera v\u00e5r <code>BlockEdit<\/code>komponent. Med detta har v\u00e5r <code>BlockEdit<\/code>komponent nu tillg\u00e5ng till <code>props.media<\/code>.<\/p>\n<h2>\u00c5terge ett mediaval<\/h2>\n<p>\u00c4ntligen kommer den roliga delen: delen i Inspekt\u00f6ren.<\/p>\n<p>Komponenten vi \u00e4r intresserade av \u00e4r <code>MediaUpload<\/code>(paket <code>wp.blockEditor<\/code>). Om du \u00e4r intresserad har WordPress Github repo f\u00f6r Gutenberg lite <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\">dokumentation om den h\u00e4r komponenten<\/a>. Vi kommer ocks\u00e5 att linda in den h\u00e4r komponenten i en komponent som heter <code>MediaUploadCheck<\/code>(paket <code>wp.blockEditor<\/code>). Den h\u00e4r komponenten ser till att den aktuella anv\u00e4ndaren har kapacitet att anv\u00e4nda mediebiblioteket, s\u00e5 det \u00e4r bra att anv\u00e4nda detta.<\/p>\n<p>Komponenten <code>MediaUpload<\/code>har en n\u00f6dv\u00e4ndig rekvisita: <code>render<\/code>. S\u00e4ttet som den h\u00e4r komponenten fungerar p\u00e5 \u00e4r att vi definierar en funktion f\u00f6r <code>render<\/code>rekvisitan d\u00e4r vi renderar utdata f\u00f6r &quot;mediauppladdningsomr\u00e5det&quot;. I v\u00e5rt fall kommer vi att g\u00f6ra ett <code>Button<\/code>(paket <code>wp.components<\/code>). Inuti MediaUploads renderingspropp f\u00e5r vi tillg\u00e5ng till <code>open<\/code>funktionen som vi kan anropa f\u00f6r att f\u00e5 WordPress att \u00f6ppna popupen Media Library:<\/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=\"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block\" ><\/a><\/p>\n<p>Det finns n\u00e5gra fler rekvisita tillg\u00e4ngliga f\u00f6r <code>MediaUpload<\/code>. Vi kommer att t\u00e4cka de viktiga f\u00f6r att g\u00f6ra det funktionellt i denna handledning, men det finns n\u00e5gra fler du kan spela med. Du kan \u00e5tminstone vara intresserad av rekvisiten <code>allowedTypes<\/code>d\u00e4r du kan begr\u00e4nsa vilka filtyper som \u00e4r m\u00f6jliga att v\u00e4lja i biblioteket. I v\u00e5rt fall st\u00e4ller vi in \u200b\u200bdet p\u00e5 att endast till\u00e5ta bilder.<\/p>\n<h3>L\u00e4gger till<code>MediaUpload<\/code><\/h3>\n<p>Destrukturera de nya komponenterna f\u00f6rst;<\/p>\n<pre><code>const { Button } = wp.components;\nconst { MediaUpload, MediaUploadCheck } = wp.blockEditor;<\/code><\/pre>\n<p>L\u00e5t oss l\u00e4gga till <code>MediaUploadCheck<\/code>och <code>MediaUpload<\/code>in i v\u00e5r <code>div<\/code>i v\u00e5r <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=\"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block\" ><\/a><\/p>\n<p>Koden ovan destrukturerar <code>open<\/code>inuti funktionen f\u00f6r <code>render<\/code>. Vi g\u00f6r en enkel <code>Button<\/code>d\u00e4r dess <code>onClick<\/code>egenskap kommer att k\u00f6ra <code>open<\/code>funktionen. Jag har ocks\u00e5 lagt till samma klassnamn som WordPress utvalda bildfunktionalitet f\u00f6r att s\u00e4kerst\u00e4lla att vi inte beh\u00f6ver l\u00e4gga till n\u00e5gon styling.<\/p>\n<p>Inuti <code>Button<\/code>komponenten kontrollerar vi om en bild har st\u00e4llts in eller inte (<code>attributes.mediaId<\/code>). Om det inte \u00e4r det, upprepar vi texten &quot;V\u00e4lj en bild&quot;. Vi borde nu f\u00e5 det h\u00e4r i v\u00e5rt block.<\/p>\n<p>N\u00e4r du klickar p\u00e5 knappen b\u00f6r popupen Media Library visas. Men att v\u00e4lja en bild fungerar inte just nu, eftersom vi saknar <code>onSelect<\/code>och <code>value<\/code>rekvisita p\u00e5 <code>MediaUpload<\/code>. L\u00e5t oss fixa det nu. Vi st\u00e4ller <code>value<\/code>in det valda media-ID:t och vi st\u00e4ller in <code>onSelect<\/code>att k\u00f6ra en funktion som vi senare kommer att definiera inuti v\u00e5r komponent.<\/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>L\u00e5t oss definiera <code>onSelectMedia<\/code>funktionen inom v\u00e5r komponent.<\/p>\n<h3>Hantera val av media<\/h3>\n<p><strong>Obs<\/strong>: Jag definierar mina funktioner som pilfunktioner (<code>onSelectMedia =() =&gt; { }<\/code>). Pilfunktioner \u00e4r ganska nya i ESNext och ganska snygga. Nackdelen \u00e4r att anv\u00e4ndning av pilfunktioner kr\u00e4ver att du l\u00e4gger till st\u00f6d f\u00f6r detta i din Babel-konfiguration. Om du inte har gjort detta rekommenderar jag att du tittar under rubriken &#8221;S\u00e4tta upp Babel&quot; i <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\">det h\u00e4r inl\u00e4gget<\/a>.<\/p>\n<p>Precis f\u00f6re komponentens retursats definierar jag en <code>onSelectMedia<\/code>funktion. Allt vi beh\u00f6ver g\u00f6ra \u00e4r att uppdatera v\u00e5ra attribut med <code>setAttributes()<\/code>. Som parameter <code>onSelectMedia<\/code>f\u00e5r vi ett mediaobjekt. Vi extraherar helt enkelt det vi beh\u00f6ver fr\u00e5n medieobjektet. I v\u00e5rt fall \u00e4r det media-ID:t och webbadressen i full storlek, som \u00e4r <code>id<\/code>respektive egenskaper <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>Prova det nu och du kommer nu att kunna v\u00e4lja en bild fr\u00e5n mediebiblioteket. Det valda mediet sparas i blockets attribut. Det finns dock ingen f\u00f6rhandsgranskning av den i Inspekt\u00f6ren \u00e4nnu, och eftersom du har valt en bild f\u00f6rsvinner knappen f\u00f6r att v\u00e4lja en bild. Panelen \u00e4r nu tom. N\u00e4sta steg \u00e4r att \u00e5terge f\u00f6rhandsgranskningen n\u00e4r en bild har valts samt att tillhandah\u00e5lla alternativ f\u00f6r att ta bort eller \u00e4ndra den.<\/p>\n<h2>\u00c5terge en f\u00f6rhandsgranskningsbild<\/h2>\n<p>Inuti <code>Button<\/code>komponenten vi renderar inuti <code>MediaUpload<\/code>s <code>render<\/code>rekvisita ekar vi en text &quot;V\u00e4lj en bild&quot; om en bild \u00e4nnu inte \u00e4r inst\u00e4lld. Men vi m\u00e5ste l\u00e4gga till lite kod f\u00f6r n\u00e4r en bild st\u00e4lls in h\u00e4r; en f\u00f6rhandsvisning.<\/p>\n<p>F\u00f6r att hj\u00e4lpa oss att g\u00f6ra en snygg f\u00f6rhandsvisning anv\u00e4nder vi komponenten <code>ResponsiveWrapper<\/code>(paketet <code>wp.components<\/code>). F\u00f6r att <code>ResponsiveWrapper<\/code>fungera fullt ut m\u00e5ste vi tillhandah\u00e5lla rekvisita f\u00f6r h\u00f6jd och bredd. Vi beh\u00f6ver ocks\u00e5 webbadressen f\u00f6r miniatyrbilder. Det \u00e4r ingen id\u00e9 att anv\u00e4nda hela URL-adressen (som kan vara gigantisk) f\u00f6r att g\u00f6ra en f\u00f6rhandsgranskning inuti inspekt\u00f6ren. Det \u00e4r h\u00e4r rekvisiten <code>withSelect<\/code>kommer in. Inuti komponenten renderar vi en enkel <code>&lt;img&gt;<\/code>HTML-tagg.<\/p>\n<p>F\u00f6rst destrukturerar vi den n\u00f6dv\u00e4ndiga komponenten:<\/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>Som du kan se kommer vi \u00e5t rekvisiten <code>withSelect<\/code>som komponenten gav oss, <code>props.media<\/code>. Vi h\u00e4mtar bredd, h\u00f6jd och webbadress till mediets miniatyrstorlek fr\u00e5n objektet.<\/p>\n<p>Du b\u00f6r nu f\u00e5 en fin f\u00f6rhandsvisning av den valda bilden!<\/p>\n<p>Eftersom vi \u00e5terger f\u00f6rhandsgranskningsbilden inuti <code>Button<\/code>kommer klickningen p\u00e5 f\u00f6rhandsgranskningsbilden att utl\u00f6sa <code>Button<\/code>funktionen <code>onClick<\/code>&#8211; som \u00e4r att \u00f6ppna mediebiblioteket. P\u00e5 s\u00e5 s\u00e4tt kan du redan \u00e4ndra den valda bilden.<\/p>\n<p>F\u00f6r n\u00e4rvarande finns det inget s\u00e4tt att ta bort eller \u00e5terst\u00e4lla den valda bilden. L\u00e5t oss fixa det!<\/p>\n<h3>L\u00e4gger till en borttagningsfunktion<\/h3>\n<p>Vi b\u00f6r \u00e5tminstone erbjuda m\u00f6jligheten f\u00f6r anv\u00e4ndaren att ta bort den valda bilden. Fr\u00e5n och med nu n\u00e4r du har valt en bild kan du bara \u00e4ndra den, men inte ta bort den.<\/p>\n<p>Vi kommer att g\u00f6ra det p\u00e5 samma s\u00e4tt som WordPress g\u00f6r f\u00f6r utvalda bilder: En ny <code>Button<\/code>under f\u00f6rhandsgranskningsbilden (helt utanf\u00f6r dess <code>MediaUploadCheck<\/code>). Genom att tillhandah\u00e5lla n\u00e5gra smarta rekvisita <code>Button<\/code>f\u00e5r vi det att se ut som en l\u00e4nk (<code>isLink<\/code>) med r\u00f6d textf\u00e4rg (<code>isDestructive<\/code>). L\u00e4s <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentationen f\u00f6r Button<\/a> f\u00f6r att se vad mer som \u00e4r m\u00f6jligt. Vi lindar in knappen i \u00e4nnu en <code>MediaUploadCheck<\/code>, bara f\u00f6r att s\u00e4kerst\u00e4lla att anv\u00e4ndaren har r\u00e4tt kapacitet.<\/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>F\u00f6r detta <code>Button<\/code>evenemang <code>onClick<\/code>k\u00f6r vi en ny funktion i v\u00e5r komponent: <code>removeMedia()<\/code>. Vi definierar det n\u00e5gonstans precis innan komponentens returfunktion, som vi gjorde med <code>onSelectMedia<\/code>.<\/p>\n<pre><code>const removeMedia =() =&gt; {\n    props.setAttributes({\n        mediaId: 0,\n        mediaUrl: ''\n    });\n}<\/code><\/pre>\n<p>Allt denna funktion g\u00f6r \u00e4r att \u00e5terst\u00e4lla v\u00e5ra tv\u00e5 attributv\u00e4rden.<\/p>\n<p>Vi kommer nu att ha en trevlig, tydlig l\u00e4nk f\u00f6r att ta bort bilden:<\/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=\"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block\" ><\/a><\/p>\n<p>N\u00e4r du klickar p\u00e5 den nya knappen f\u00f6rsvinner den valda bilden och sj\u00e4lva knappen och knappen f\u00f6r att v\u00e4lja en bild visas igen.<\/p>\n<h3>L\u00e4gger till en ers\u00e4tt-knapp<\/h3>\n<p>Detta steg \u00e4r helt valfritt. Som n\u00e4mnts tidigare, genom att klicka p\u00e5 bildens f\u00f6rhandsgranskningsbild \u00f6ppnas Media Library och l\u00e5ter dig \u00e4ndra bilden. Men detta kanske inte \u00e4r lika intuitivt f\u00f6r alla att f\u00f6rst\u00e5. WordPress l\u00e4gger till en separat knapp f\u00f6r att \u00e4ndra bilden, bara f\u00f6r att g\u00f6ra det v\u00e4ldigt tydligt. Vi kan g\u00f6ra detsamma.<\/p>\n<p>F\u00f6r att \u00e5terge en \u00e4ndra bildknapp upprepar vi i princip koden vi har f\u00f6r att v\u00e4lja bilden: en annan <code>MediaUpload<\/code>komponent. Vi tillhandah\u00e5ller samma funktion f\u00f6r <code>onSelect<\/code>och <code>allowedFileTypes<\/code>som <code>value<\/code>tidigare. Inuti <code>render<\/code>rekvisitan <code>MediaUpload<\/code>g\u00f6r vi helt enkelt en annan <code>Button<\/code>som \u00f6ppnar mediebiblioteket. L\u00e5t oss placera den h\u00e4r knappen f\u00f6re knappen Ta bort \u2013 eftersom detta \u00e4r mer meningsfullt f\u00f6r slutanv\u00e4ndaren:<\/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>S\u00e5 nu borde du f\u00e5 det h\u00e4r:<\/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=\"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block\" ><\/a><\/p>\n<h2>Anv\u00e4nder den valda bilden<\/h2>\n<p>Vid det h\u00e4r laget borde det vara ganska klart hur du kan anv\u00e4nda den valda bilden. Du har medie-ID och media-URL lagrade i ditt blocks attribut. Men som ett enkelt exempel kommer jag att inkludera en kod som st\u00e4ller in den valda bilden som blockets bakgrund. Koden kan g\u00f6ras p\u00e5 exakt samma s\u00e4tt i b\u00e5de <code>edit<\/code>och <code>save<\/code>funktionerna. Vi skapar helt enkelt ett stilobjekt som vi applicerar p\u00e5 blockets omslagsdiv. I stilobjektet s\u00e4tter vi bakgrundsbild till media-URL.<\/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>Med resten av ditt anpassade blockinneh\u00e5ll kan det enkelt se ut s\u00e5 h\u00e4r:<\/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=\"Hur man l\u00e4gger till en bildval i ditt anpassade WordPress Gutenberg-block\" ><\/a><\/p>\n<p>Om du till\u00e4mpar blockstilen i b\u00e5de <code>edit<\/code>och <code>save<\/code>, b\u00f6r ditt block nu f\u00e5 det valda mediet som bakgrund. B\u00e5de inne i editorn och i frontend.<\/p>\n<h2>Slutsats<\/h2>\n<p>Att v\u00e4lja en bild (eller fil) fr\u00e5n Mediabiblioteket \u00e4r en funktion som du som Gutenberg-utvecklare utan tvekan kommer att beh\u00f6va f\u00f6r dina block. Vi har l\u00e4rt oss hur man l\u00e4gger till en funktion f\u00f6r att v\u00e4lja en bild fr\u00e5n mediebiblioteket i v\u00e5rt anpassade Gutenberg-block. Vi har gjort det p\u00e5 samma s\u00e4tt som WordPress sj\u00e4lv g\u00f6r det f\u00f6r den utvalda bilden. (Redigera maj 2020: WordPress har nu uppdaterat den utvalda bilden f\u00f6r att anv\u00e4nda <code>useSelect<\/code>, React-kroken ist\u00e4llet). Detta s\u00e4kerst\u00e4ller att v\u00e5r kod inte \u00e4r &quot;hackisk&quot; med h\u00f6g risk att g\u00e5 s\u00f6nder i framtida uppdateringar.<\/p>\n<p>L\u00e5t mig veta om du har haft n\u00e5gon anv\u00e4ndning av detta!<\/p>\n<h2>Fullst\u00e4ndig kod<\/h2>\n<p>Nedan finns den fullst\u00e4ndiga koden f\u00f6r ett anpassat block som har den utvalda mediafunktionen. Och inget annat egentligen. Den delen \u00e4r upp till dig!<\/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\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Den h\u00e4r handledningen f\u00f6rklarar hur du l\u00e4gger till en bildvals- eller uppladdningsknapp f\u00f6r mediebiblioteket i Inspector f\u00f6r ditt anpassade WordPress Gutenberg-block.<\/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":[901,838,942,942,848,734,734,901,1110,807,807,818,818,838,848,868,868],"tags":[1173],"class_list":["post-233360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-guide-foer-nyboerjare","category-gutenberg-9","category-handledningar","category-javascript-9","category-n-a","category-php-9","category-plugins-3","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233360"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233360\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/153622"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}