{"id":233382,"date":"2023-02-12T15:55:00","date_gmt":"2023-02-12T12:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233382"},"modified":"2022-11-10T23:23:35","modified_gmt":"2022-11-10T20:23:35","slug":"kuvavalinnan-lisaeaeminen-mukautettuun-wordpress-gutenberg-lohkoon","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kuvavalinnan-lisaeaeminen-mukautettuun-wordpress-gutenberg-lohkoon\/","title":{"rendered":"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 viesti on sinulle, joka luo mukautettua Gutenberg-lohkoa ja tarvitset tavan valita tai ladata kuva mediakirjastosta. Useimmat muut kentt\u00e4tyypit, kuten valintaruudut, tekstinsy\u00f6tteet tai v\u00e4rivalitsimet, ovat melko helppoja lis\u00e4t\u00e4, mutta median latausohjelma vaatii hieman enemm\u00e4n koodia. Luomme Inspector-komponentin, joka vastaa painikkeen luomisesta mediakirjaston avaamiseen, kuvan valitsemiseen ja valinnaisesti poistamiseen tai muuttamiseen my\u00f6hemmin. Kaikki k\u00e4ytt\u00e4m\u00e4ll\u00e4 tavallisia WordPress-komponentteja.<\/p>\n<p>Ennen kuin sukeltaamme koodiin, muista, ett\u00e4 t\u00e4m\u00e4 viesti vaatii Gutenbergin tiet\u00e4myst\u00e4 mukautettujen lohkojen kirjoittamisesta. Keskitymme vain median lataajaosaan emmek\u00e4 rekister\u00f6itymiseen ja Gutenberg-lohkon tekemiseen sin\u00e4ns\u00e4. Jos et ole varma kuinka kirjoittaa mukautettu Gutenberg-lohko, minulla on opetusohjelmasarja, joka kattaa juuri t\u00e4m\u00e4n:<\/p>\n<p>Kun se on poissa tielt\u00e4, sukeltakaamme suoraan sis\u00e4\u00e4n!<\/p>\n<h2>Mit\u00e4 teemme<\/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=\"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon\" ><\/a><\/p>\n<p>Valittu mediatoiminto on toiminnallisesti t\u00e4sm\u00e4lleen sama kuin WordPressin esittelykuvatoiminto. Lis\u00e4\u00e4mme Inspectoriin paneelin, joka koostuu painikkeesta kuvan valitsemiseksi.<\/p>\n<p>Kun napsautat painiketta, n\u00e4kyviin tulee &quot;Valitse tai l\u00e4het\u00e4 media&quot; -ikkuna, josta voit valita tiedoston mediakirjastosta. Rajoitamme Mediakirjaston n\u00e4ytt\u00e4m\u00e4\u00e4n vain kuvia. Kun kuva on valittu, ponnahdusikkuna sulkeutuu ja paneeli esikatselee valitun kuvan pieni pikkukuva. Alla n\u00e4kyv\u00e4t esikatselupainikkeet kuvan vaihtamista ja poistamista varten. Aivan kuten esittelykuvassa.<\/p>\n<p>T\u00e4ss\u00e4 opetusohjelmassa oletetaan, ett\u00e4 k\u00e4yt\u00e4t valittua kuvaa lohkon taustana \u2013 vain esimerkkin\u00e4. T\u00e4st\u00e4 syyst\u00e4 tallennamme kuvan URL-osoitteen. Lis\u00e4\u00e4n esimerkin valitun kuvan k\u00e4ytt\u00e4misest\u00e4 (sek\u00e4 funktiossa <code>edit<\/code>ett\u00e4 <code>save<\/code>funktiossa). Kuvaa valittaessa kuva n\u00e4kyy lohkomme taustana sek\u00e4 editorin sis\u00e4ll\u00e4 ett\u00e4 k\u00e4ytt\u00f6liittym\u00e4ss\u00e4.<\/p>\n<p>Tallennamme mediatunnuksen ja median URL-osoitteen lohkon attribuutteihin. Koodi k\u00e4ytt\u00e4\u00e4 paketissa <code>withSelect<\/code>olevaa korkeamman asteen komponenttia <code>wp.data<\/code>kysy\u00e4kseen lis\u00e4tietoja valitusta mediasta tunnuksella.<\/p>\n<p>&quot;Lainaan&quot; my\u00f6s luokkanimi\u00e4 WordPressin esitellyist\u00e4 kuvatoiminnoista varmistaakseni, ett\u00e4 kaikki n\u00e4ytt\u00e4\u00e4 hyv\u00e4lt\u00e4 eik\u00e4 sinun tarvitse kirjoittaa itse CSS:\u00e4\u00e4. T\u00e4m\u00e4 on tietysti valinnaista.<\/p>\n<h2>Valitun median tallentaminen attribuuteissa<\/h2>\n<p>Se, mit\u00e4 sinun on tallennettava lohkosi attribuutteihin, on v\u00e4h\u00e4n sinun p\u00e4\u00e4tett\u00e4viss\u00e4si. Meid\u00e4n on luonnollisesti tallennettava v\u00e4hint\u00e4\u00e4n mediatunnus. T\u00e4m\u00e4 saattaa riitt\u00e4\u00e4, jos sinun ei tarvitse k\u00e4ytt\u00e4\u00e4 median URL-osoitetta miss\u00e4\u00e4n komentosarjakoodissa. Esimerkiksi jos k\u00e4yt\u00e4t <code>ServerSideRender<\/code>miss\u00e4 PHP on vastuussa lohkon tulosteen render\u00f6imisest\u00e4. T\u00e4ll\u00f6in voit helposti saada kuvan URL-osoitteen mediatunnuksesta k\u00e4ytt\u00e4m\u00e4ll\u00e4 esimerkiksi <code>[wp_get_attachment_image_src](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_attachment_image_src\/)()<\/code>. Alla olevassa esimerkiss\u00e4 n\u00e4yt\u00e4n kuitenkin yksinkertaisen esimerkin kuvan n\u00e4ytt\u00e4misest\u00e4 lohkomme taustana, joten tallennan my\u00f6s median URL-osoitteen attribuutiksi. K\u00e4yt\u00e4mme URL-attribuuttia sek\u00e4 <code>edit<\/code>(taustan lis\u00e4\u00e4miseksi editorissa) ett\u00e4 in <code>save<\/code>(taustan lis\u00e4\u00e4miseksi k\u00e4ytt\u00f6liittym\u00e4\u00e4n).<\/p>\n<p>Aloitetaan m\u00e4\u00e4rittelem\u00e4ll\u00e4 ominaisuudet. Mediatunnuksen tulee olla tyyppinumero ja oletuksena 0. T\u00e4m\u00e4 tekee vertailusta helppoa. Median URL-osoitteen tulee olla tyyppimerkkijono ja oletuksena tyhj\u00e4 merkkijono.<\/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>Komponentin luominen<\/h2>\n<p>Jotta koodimme olisi j\u00e4rjestyksess\u00e4, m\u00e4\u00e4rittelemme erillisen komponentin lohkon <code>edit<\/code>toiminnalle. My\u00f6hemmin v\u00e4lit\u00e4mme t\u00e4m\u00e4n komponentin, jotta <code>withSelect<\/code>voimme k\u00e4\u00e4ri\u00e4 sen komponenttimme ymp\u00e4rille.<\/p>\n<p>Komponentin palautuksessa teemme yksinkertaisen <code>&lt;div&gt;<\/code>lohkon sis\u00e4ll\u00f6lle. Oletan, ett\u00e4 sinulla on tai sinulla on enemm\u00e4n todellista estosis\u00e4lt\u00f6\u00e4 korvaamaan valeesimerkkisis\u00e4lt\u00f6. My\u00f6s render\u00f6imme <code>InspectorControls<\/code>(paketti <code>wp.blockEditor<\/code>) lis\u00e4t\u00e4ksemme osion tarkastajaan. Toistaiseksi lis\u00e4\u00e4n tyhj\u00e4n <code>PanelBody<\/code>sis\u00e4\u00e4n <code>InspectorControls<\/code>. Lis\u00e4\u00e4n a <code>&lt;div&gt;<\/code>, jolla on sama luokka kuin WordPressin esittelykuvaosio k\u00e4ytt\u00e4\u00e4. T\u00e4m\u00e4 varmistaa, ett\u00e4 tyylimme n\u00e4ytt\u00e4\u00e4 hyv\u00e4lt\u00e4. My\u00f6hemmin t\u00e4yt\u00e4mme t\u00e4m\u00e4n <code>PanelBody<\/code>valitun mediatoiminnon koodilla.<\/p>\n<p>Mutta ensin tuhotaan tarvittava komponentti tiedoston alussa:<\/p>\n<pre><code>const { InspectorControls } = wp.blockEditor;\nconst { PanelBody } = wp.components;\nconst { Fragment } = wp.element;<\/code><\/pre>\n<p>Yl\u00e4puolella <code>registerBlockType<\/code>m\u00e4\u00e4rittelen yksinkertaisen komponentin nimelt\u00e4 <code>BlockEdit<\/code>. Jos haluat siirt\u00e4\u00e4 t\u00e4m\u00e4n erilliseen tiedostoon, voit tehd\u00e4 niin. T\u00e4m\u00e4 on yleist\u00e4 ja suositeltavaa, mutta t\u00e4ss\u00e4 opetusohjelmassa pid\u00e4n asiat yksinkertaisina ja pid\u00e4n sen samassa tiedostossa.<\/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>Nyt haluamme tehd\u00e4 t\u00e4m\u00e4n komponentin <code>edit<\/code>funktiossamme. Mutta haluamme k\u00e4\u00e4ri\u00e4 sen <code>withSelect<\/code>.<\/p>\n<h2>K\u00e4ytt\u00f6 toiminnossa <code>withSelect<\/code>_<code>edit<\/code><\/h2>\n<p>Jos et tunne <code>withSelect<\/code>, se on hy\u00f6dyllinen korkeamman asteen komponentti, jonka avulla voimme suorittaa kyselyit\u00e4. T\u00e4ll\u00e4 voit esimerkiksi kysell\u00e4 viestej\u00e4. K\u00e4yt\u00e4mme kuitenkin toimintoa <code>select('core').getMedia()<\/code>mediatunnuksen kyselyyn. Vastauksena saamme objektin, jossa on kaikki tiedotusv\u00e4lineiden tiedot. Vastauksena saamamme mediaobjekti toimitetaan sitten <code>BlockEdit<\/code>komponenttimme rekvisiittana k\u00e4ytt\u00f6valmiina. N\u00e4pp\u00e4r\u00e4.<\/p>\n<p>Varmistamme, ett\u00e4 kyselemme mediaa vain, jos mediatunnus-attribuutti todellakin on muu kuin 0. Muokkaustoimintomme n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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>Aivan lopussa, jonon sulkemisen j\u00e4lkeen <code>withSelect<\/code>, <code>#3<\/code>pyyd\u00e4mme <code>withSelect<\/code>palauttamaan <code>BlockEdit<\/code>komponenttimme. T\u00e4ll\u00e4 <code>BlockEdit<\/code>komponentillamme on nyt p\u00e4\u00e4sy <code>props.media<\/code>.<\/p>\n<h2>Mediavalinnan render\u00f6iminen<\/h2>\n<p>Lopuksi tulee hauska osa: Tarkastajan osa.<\/p>\n<p>Meit\u00e4 kiinnostava komponentti on <code>MediaUpload<\/code>(paketti <code>wp.blockEditor<\/code>). Jos olet kiinnostunut, WordPress Github -repossa Gutenbergille on <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\">dokumentaatiota t\u00e4st\u00e4 komponentista<\/a>. K\u00e4\u00e4rimme t\u00e4m\u00e4n komponentin my\u00f6s komponenttiin nimelt\u00e4 <code>MediaUploadCheck<\/code>(paketti <code>wp.blockEditor<\/code>). T\u00e4m\u00e4 komponentti varmistaa, ett\u00e4 nykyinen k\u00e4ytt\u00e4j\u00e4 pystyy k\u00e4ytt\u00e4m\u00e4\u00e4n Mediakirjastoa, joten on hyv\u00e4 k\u00e4yt\u00e4nt\u00f6 k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4.<\/p>\n<p>Komponentissa <code>MediaUpload<\/code>on vaadittu tuki: <code>render<\/code>. T\u00e4m\u00e4 komponentti toimii siten, ett\u00e4 m\u00e4\u00e4rit\u00e4mme rekvisiittalle funktion, <code>render<\/code>jossa render\u00f6imme tulosteen &quot;median latausalueelle&quot;. Meid\u00e4n tapauksessamme render\u00f6imme <code>Button<\/code>(paketin <code>wp.components<\/code>). MediaUploadin render\u00f6intisovelluksen sis\u00e4ll\u00e4 saamme p\u00e4\u00e4syn <code>open<\/code>toimintoon, jota voimme kutsua saadaksemme WordPressin avaamaan Mediakirjaston ponnahdusikkunan:<\/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=\"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon\" ><\/a><\/p>\n<p>Saatavilla on muutama lis\u00e4tarvike <code>MediaUpload<\/code>. K\u00e4sittelemme t\u00e4ss\u00e4 opetusohjelmassa t\u00e4rkeimm\u00e4t, jotta se toimisi, mutta voit pelata muutamilla muillakin. Saatat ainakin olla kiinnostunut ehdotuksesta, <code>allowedTypes<\/code>jossa voit rajoittaa sit\u00e4, mit\u00e4 tiedostotyyppej\u00e4 on mahdollista valita kirjastosta. Meid\u00e4n tapauksessamme asetimme sen sallimaan vain kuvat.<\/p>\n<h3>Lis\u00e4\u00e4m\u00e4ll\u00e4<code>MediaUpload<\/code><\/h3>\n<p>Pura ensin uudet komponentit;<\/p>\n<pre><code>const { Button } = wp.components;\nconst { MediaUpload, MediaUploadCheck } = wp.blockEditor;<\/code><\/pre>\n<p>Lis\u00e4t\u00e4\u00e4n <code>MediaUploadCheck<\/code>ja <code>MediaUpload<\/code>sis\u00e4ll\u00e4mme: <code>div<\/code>_<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=\"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon\" ><\/a><\/p>\n<p>Yll\u00e4 oleva koodi tuhoaa <code>open<\/code>funktion sis\u00e4ll\u00e4 <code>render<\/code>. Teemme yksinkertaisen, <code>Button<\/code>jossa sen <code>onClick<\/code>ominaisuus suorittaa <code>open<\/code>funktion. Olen my\u00f6s lis\u00e4nnyt samat luokkien nimet kuin WordPressin esitellyt kuvatoiminnot varmistaakseni, ettei meid\u00e4n tarvitse lis\u00e4t\u00e4 mit\u00e4\u00e4n tyyli\u00e4.<\/p>\n<p>Komponentin sis\u00e4ll\u00e4 <code>Button<\/code>tarkistamme, onko kuva asetettu (<code>attributes.mediaId<\/code>). Jos n\u00e4in ei ole, toistamme tekstin &quot;Valitse kuva&quot;. Meid\u00e4n pit\u00e4isi nyt saada t\u00e4m\u00e4 lohkoomme.<\/p>\n<p>Kun napsautat painiketta, Mediakirjaston ponnahdusikkunan pit\u00e4isi ilmesty\u00e4. Kuvan valitseminen ei kuitenkaan toimi t\u00e4ll\u00e4 hetkell\u00e4, koska meilt\u00e4 puuttuu rekvisiitta <code>onSelect<\/code>ja. Korjataan se nyt. Asetamme valitun mediatunnuksen ja asetimme suorittamaan toiminnon, jonka m\u00e4\u00e4rit\u00e4mme my\u00f6hemmin komponentissamme.<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>M\u00e4\u00e4ritet\u00e4\u00e4n <code>onSelectMedia<\/code>funktio komponentissamme.<\/p>\n<h3>Median valinnan k\u00e4sittely<\/h3>\n<p><strong>Huomautus<\/strong>: M\u00e4\u00e4rit\u00e4n funktioni nuolifunktioiksi (<code>onSelectMedia =() =&gt; { }<\/code>). Nuolitoiminnot ovat melko uusia ESNextiss\u00e4 ja melko hienoja. Huono puoli on, ett\u00e4 nuolitoimintojen k\u00e4ytt\u00e4minen edellytt\u00e4\u00e4, ett\u00e4 lis\u00e4\u00e4t t\u00e4m\u00e4n tuen Babel-kokoonpanoosi. <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\">Jos et ole tehnyt t\u00e4t\u00e4, suosittelen katsomaan t\u00e4m\u00e4n viestin<\/a> otsikon &quot;Babelin m\u00e4\u00e4ritt\u00e4minen&quot; alla .<\/p>\n<p>Juuri ennen komponentin return-lausetta m\u00e4\u00e4rit\u00e4n <code>onSelectMedia<\/code>funktion. Meid\u00e4n tarvitsee vain p\u00e4ivitt\u00e4\u00e4 attribuuttimme k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>setAttributes()<\/code>. Parametriksi <code>onSelectMedia<\/code>saamme mediaobjektin. Poimimme mediaobjektista vain sen, mit\u00e4 tarvitsemme. Meid\u00e4n tapauksessamme se on mediatunnus ja t\u00e4ysikokoinen URL, jotka ovat ominaisuudet <code>id<\/code>ja <code>url<\/code>vastaavasti.<\/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>Kokeile nyt, niin voit nyt valita kuvan mediakirjastosta. Valittu media tallennetaan lohkon attribuutteihin. Siit\u00e4 ei kuitenkaan ole viel\u00e4 esikatselua Inspectorissa, ja koska olet valinnut kuvan, kuvan valintapainike katoaa. Paneeli on nyt tyhj\u00e4. Seuraava vaihe on esikatselun render\u00f6iminen aina, kun kuva on valittu, sek\u00e4 vaihtoehtojen tarjoaminen sen poistamiseen tai muuttamiseen.<\/p>\n<h2>Esikatselukuvaa render\u00f6id\u00e4\u00e4n<\/h2>\n<p>Komponentin sis\u00e4ll\u00e4, <code>Button<\/code>jonka render\u00f6imme propin sis\u00e4ll\u00e4 <code>MediaUpload<\/code>, <code>render<\/code>toistamme tekstin &quot;Valitse kuva&quot;, jos kuvaa ei ole viel\u00e4 asetettu. Mutta meid\u00e4n on lis\u00e4tt\u00e4v\u00e4 koodi, kun kuva on asetettu t\u00e4h\u00e4n; esikatselu.<\/p>\n<p>K\u00e4yt\u00e4mme komponenttia <code>ResponsiveWrapper<\/code>(paketti <code>wp.components<\/code>) saadaksemme hyv\u00e4n esikatselun. Jotta <code>ResponsiveWrapper<\/code>se toimisi t\u00e4ysin, meid\u00e4n on tarjottava rekvisiitta korkeudelle ja leveydelle. Tarvitsemme my\u00f6s pikkukuvan URL-osoitteen. Ei ole mit\u00e4\u00e4n j\u00e4rke\u00e4 k\u00e4ytt\u00e4\u00e4 koko URL-osoitetta (joka voi olla j\u00e4ttim\u00e4inen) esikatselun tekemiseen Inspectorissa. T\u00e4st\u00e4 <code>withSelect<\/code>tulee rekvisiitta. Komponentin sis\u00e4ll\u00e4 render\u00f6imme yksinkertaisen <code>&lt;img&gt;<\/code>HTML-tunnisteen.<\/p>\n<p>Ensin tuhoamme tarvittavan komponentin:<\/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>Kuten n\u00e4ette, k\u00e4yt\u00e4mme <code>withSelect<\/code>komponentin meille toimittamaa potkuria, <code>props.media<\/code>. Haemme objektista median pikkukuvan koon leveyden, korkeuden ja URL-osoitteen.<\/p>\n<p>Sinun pit\u00e4isi nyt saada hieno esikatselu valitusta kuvasta!<\/p>\n<p>Koska tuomme esikatselukuvan sis\u00e4lle, <code>Button<\/code>esikatselukuvan napsauttaminen k\u00e4ynnist\u00e4\u00e4 toiminnon <code>Button<\/code>, <code>onClick<\/code>joka on mediakirjaston avaaminen. N\u00e4in voit jo muuttaa valittua kuvaa.<\/p>\n<p>T\u00e4ll\u00e4 hetkell\u00e4 valittua kuvaa ei voi poistaa tai nollata. Korjataan se!<\/p>\n<h3>Poistotoiminnon lis\u00e4\u00e4minen<\/h3>\n<p>Meid\u00e4n tulisi ainakin tarjota k\u00e4ytt\u00e4j\u00e4lle mahdollisuus poistaa valittu kuva. T\u00e4ll\u00e4 hetkell\u00e4 kun olet valinnut kuvan, voit vain muuttaa sit\u00e4, mutta et poistaa sit\u00e4.<\/p>\n<p>Teemme sen samalla tavalla kuin WordPress esitellylle kuvalle: Uusi <code>Button<\/code>esikatselukuvan alle (kokonaan sen ulkopuolella <code>MediaUploadCheck<\/code>). Tarjoamalla n\u00e4pp\u00e4r\u00e4\u00e4 rekvisiittaa <code>Button<\/code>saamme sen n\u00e4ytt\u00e4m\u00e4\u00e4n linkilt\u00e4 (<code>isLink<\/code>), jossa on punainen tekstiv\u00e4ri (<code>isDestructive<\/code>). Lue <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Buttonin dokumentaatio<\/a> n\u00e4hd\u00e4ksesi, mit\u00e4 muuta on mahdollista. K\u00e4\u00e4rimme painikkeen toisen <code>MediaUploadCheck<\/code>sis\u00e4\u00e4n varmistaaksemme, ett\u00e4 k\u00e4ytt\u00e4j\u00e4ll\u00e4 on oikeat ominaisuudet.<\/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>T\u00e4t\u00e4 tapahtumaa <code>Button<\/code>varten <code>onClick<\/code>suoritamme komponenttimme sis\u00e4ll\u00e4 uuden toiminnon: <code>removeMedia()<\/code>. M\u00e4\u00e4rittelemme sen jonnekin juuri ennen komponentin paluufunktiota, kuten teimme <code>onSelectMedia<\/code>.<\/p>\n<pre><code>const removeMedia =() =&gt; {\n    props.setAttributes({\n        mediaId: 0,\n        mediaUrl: ''\n    });\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4 toiminto vain nollaa kaksi attribuuttiarvoamme.<\/p>\n<p>Meill\u00e4 on nyt mukava, selke\u00e4 linkki kuvan poistamiseen:<\/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=\"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon\" ><\/a><\/p>\n<p>Kun napsautat uutta painiketta, valittu kuva ja itse painike katoavat ja kuvan valintapainike tulee uudelleen n\u00e4kyviin.<\/p>\n<h3>Korvauspainikkeen lis\u00e4\u00e4minen<\/h3>\n<p>T\u00e4m\u00e4 vaihe on t\u00e4ysin valinnainen. Kuten aiemmin mainittiin, kuvan esikatselukuvaa napsauttamalla avautuu Mediakirjasto ja voit vaihtaa kuvaa. T\u00e4m\u00e4 ei kuitenkaan v\u00e4ltt\u00e4m\u00e4tt\u00e4 ole niin intuitiivista kaikkien ymm\u00e4rrett\u00e4v\u00e4ksi. WordPress lis\u00e4\u00e4 erillisen painikkeen kuvan vaihtamista varten, jotta se olisi eritt\u00e4in selke\u00e4. Voimme tehd\u00e4 samoin.<\/p>\n<p>Muuta kuva -painikkeen n\u00e4ytt\u00e4miseksi toistamme periaatteessa koodin, joka meill\u00e4 on kuvan valitsemiseksi: toinen <code>MediaUpload<\/code>komponentti. Tarjoamme saman toiminnon <code>onSelect<\/code>, <code>allowedFileTypes<\/code>ja <code>value<\/code>kuten ennenkin. Rekvisiitin sis\u00e4ll\u00e4 <code>render<\/code>render\u00f6imme <code>MediaUpload<\/code>yksinkertaisesti toisen <code>Button<\/code>, joka avaa Mediakirjaston. Laitetaan t\u00e4m\u00e4 painike ennen Poista-painiketta \u2013 koska t\u00e4m\u00e4 on j\u00e4rkev\u00e4mp\u00e4\u00e4 loppuk\u00e4ytt\u00e4j\u00e4lle:<\/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>Joten nyt sinun pit\u00e4isi saada t\u00e4m\u00e4:<\/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=\"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon\" ><\/a><\/p>\n<h2>Valitun kuvan k\u00e4ytt\u00e4minen<\/h2>\n<p>T\u00e4h\u00e4n menness\u00e4 pit\u00e4isi olla melko selv\u00e4\u00e4, kuinka voit k\u00e4ytt\u00e4\u00e4 valittua kuvaa. Mediatunnus ja median URL-osoite on tallennettu lohkosi attribuutteihin. Kuitenkin yksinkertaisena esimerkkin\u00e4 sis\u00e4llyt\u00e4n koodin, joka asettaa valitun kuvan lohkon taustaksi. Koodi voidaan tehd\u00e4 t\u00e4sm\u00e4lleen samalla tavalla sek\u00e4 toiminnoissa <code>edit<\/code>ett\u00e4 <code>save<\/code>toiminnoissa. Luomme yksinkertaisesti tyyliobjektin, jota k\u00e4yt\u00e4mme lohkon rivitysdiv:ss\u00e4. Asetamme tyyliobjektissa taustakuvan median URL-osoitteeseen.<\/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>Muun mukautetun lohkon sis\u00e4ll\u00f6n kanssa se voi helposti n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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=\"Kuvavalinnan lis\u00e4\u00e4minen mukautettuun WordPress Gutenberg -lohkoon\" ><\/a><\/p>\n<p>Jos k\u00e4yt\u00e4t lohkotyyli\u00e4 sek\u00e4 <code>edit<\/code>ja <code>save<\/code>ett\u00e4, lohkosi pit\u00e4isi nyt saada valittu media taustaksi. Sek\u00e4 editorin sis\u00e4ll\u00e4 ett\u00e4 k\u00e4ytt\u00f6liittym\u00e4ss\u00e4.<\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s<\/h2>\n<p>Kuvan (tai tiedoston) valitseminen Mediakirjastosta on toiminto, jota sin\u00e4 Gutenberg-kehitt\u00e4j\u00e4n\u00e4 ep\u00e4ilem\u00e4tt\u00e4 tarvitset lohkoihisi. Olemme oppineet lis\u00e4\u00e4m\u00e4\u00e4n toiminnon kuvan valitsemiseksi mediakirjastosta mukautetussa Gutenberg-lohkossamme. Olemme tehneet sen samalla tavalla kuin WordPress itse tekee sen esitellylle kuvalle. (Muokkaa toukokuuta 2020: WordPress on nyt p\u00e4ivitt\u00e4nyt k\u00e4ytett\u00e4v\u00e4ksi esittelykuvan <code>useSelect<\/code>, sen sijaan React-koukun). T\u00e4m\u00e4 varmistaa, ett\u00e4 koodimme ei ole &quot;hakkeroitu&quot; ja suuri riski rikkoutua tulevissa p\u00e4ivityksiss\u00e4.<\/p>\n<p>Kerro minulle, jos olet k\u00e4ytt\u00e4nyt t\u00e4t\u00e4!<\/p>\n<h2>T\u00e4ysi koodi<\/h2>\n<p>Alla on koko koodi mukautetulle lohkolle, joka sis\u00e4lt\u00e4\u00e4 valitun mediatoiminnon. Eik\u00e4 oikeastaan \u200b\u200bmit\u00e4\u00e4n muuta. Se osa on sinun!<\/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\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4m\u00e4 opetusohjelma selitt\u00e4\u00e4, kuinka voit lis\u00e4t\u00e4 kuvanvalinta- tai latauspainikkeen Mediakirjastoon Inspectorissa mukautettua WordPress Gutenberg -lohkoa varten.<\/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":[895,938,938,730,730,895,813,1110,834,843,803,803,813,834,843,864,864],"tags":[1166],"class_list":["post-233382","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koodi","category-gutenberg-5","category-javascript-5","category-laajennuksia","category-n-a","category-opas-aloittelijoille","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=233382"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233382\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/153622"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}