{"id":234015,"date":"2023-02-27T13:10:00","date_gmt":"2023-02-27T10:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234015"},"modified":"2022-11-11T13:53:42","modified_gmt":"2022-11-11T10:53:42","slug":"luo-mukautettu-gutenberg-lohko-osa-4-attribuutit","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/luo-mukautettu-gutenberg-lohko-osa-4-attribuutit\/","title":{"rendered":"Luo mukautettu Gutenberg-lohko \u2013 Osa 4: Attribuutit"},"content":{"rendered":"\n<p>T\u00e4ss\u00e4 osassa tarkastellaan attribuuttien m\u00e4\u00e4ritt\u00e4mist\u00e4, niiden arvojen hakemista ja p\u00e4ivitt\u00e4mist\u00e4. Attribuuttien avulla voimme hyv\u00e4ksy\u00e4 sy\u00f6tteen editorista, tallentaa sen ja tulostaa sen haluamallamme tavalla. Edellisess\u00e4 <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-gutenberg-create-custom-blocks-part-3-props-wordpress-components\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vaiheessa<\/a> tarkastelimme WordPressin komponentteja, mist\u00e4 ne l\u00f6ytyv\u00e4t ja miten ne toteutetaan. T\u00e4ss\u00e4 postauksessa lis\u00e4\u00e4mme rekvisiitta yhteyden muodostamiseen attribuutteihin \u2013 tallennettuihin tietoihin.<\/p>\n<h2>Attribuuttien m\u00e4\u00e4rittely<\/h2>\n<p>Attribuutit lis\u00e4t\u00e4\u00e4n objekteina taulukossa olevaan <code>attributes<\/code>ominaisuuteen <code>registerBlockType()<\/code>. Kunkin m\u00e4\u00e4ritteen avain on m\u00e4\u00e4ritteen nimi, ja sinulla on oltava <code>type<\/code>v\u00e4hint\u00e4\u00e4n ominaisuus.<\/p>\n<p>Omaisuus <code>type<\/code>voi olla mik\u00e4 tahansa seuraavista; <code>null<\/code>, <code>boolean<\/code>, <code>object<\/code>, <code>array<\/code>, <code>number<\/code>, <code>string<\/code>, tai <code>integer<\/code>.<\/p>\n<p>Voit halutessasi m\u00e4\u00e4ritt\u00e4\u00e4 ominaisuuden <code>default<\/code>m\u00e4\u00e4ritteen aloitusarvon m\u00e4\u00e4ritt\u00e4miseksi. Jos et anna oletusarvoa, m\u00e4\u00e4ritteen oletusarvo on <code>null<\/code>.<\/p>\n<p>Toinen attribuuttiominaisuus on <code>source<\/code>se, ett\u00e4 se toimii yhdess\u00e4 <code>selector<\/code>ominaisuuden kanssa, mutta n\u00e4m\u00e4 ovat nirsoja asioita, joita tarkastellaan tarkemmin alla.<\/p>\n<p>Esimerkiksi kahden attribuutin m\u00e4\u00e4ritt\u00e4minen; <code>exampleText<\/code>merkkijonona ja <code>postIds<\/code>taulukona n\u00e4ytt\u00e4isi t\u00e4lt\u00e4:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    attributes: {\n        exampleText: {\n            type: 'string',\n            default: ''\n        },\n        postIds: {\n            type: 'array'\n            default: []\n        }\n    },\n    edit: (props) =&gt; { \n    ...<\/code><\/pre>\n<p><strong>Kaikki mit\u00e4 tarvitset tallennettavaksi lohkoasi varten (sy\u00f6te k\u00e4ytt\u00e4j\u00e4lt\u00e4\/editorilta) vaatii m\u00e4\u00e4ritteen<\/strong>. Sin\u00e4 p\u00e4\u00e4t\u00e4t, kuinka rakennat tietosi m\u00e4\u00e4rittelem\u00e4ll\u00e4 kullekin erilliset attribuutit tai yhdist\u00e4m\u00e4ll\u00e4 ne kaikki yhteen objektiin. Ero on vain siin\u00e4, kuinka haet heid\u00e4n tietonsa ja kuinka p\u00e4ivit\u00e4t ne.<\/p>\n<h2>Haetaan attribuuttiarvoja<\/h2>\n<p>Attribuutit ovat k\u00e4ytett\u00e4viss\u00e4 lohkojesi <code>edit<\/code>ja <code>save<\/code>toimintojesi rekvisiittana. Jos olet seurannut t\u00e4t\u00e4 sarjaa <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-gutenberg-create-custom-blocks-part-3-props-wordpress-components\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">edellisest\u00e4 vaiheesta<\/a>, muista, ett\u00e4 p\u00e4ivitimme funktiot v\u00e4litt\u00e4m\u00e4\u00e4n rekvisiitta parametreina.<\/p>\n<p>On yleist\u00e4 <strong>tuhota<\/strong> attribuutteja rekvisiittasta, kuten yleens\u00e4 viittaat niihin. Esimerkiksi attribuutin tulostaminen <code>exampleText<\/code>n\u00e4ytt\u00e4isi t\u00e4lt\u00e4:<\/p>\n<pre><code>edit: (props) =&gt; { \n    const { attributes } = props;\n    return &lt;div&gt;{attributes.exampleText}&lt;\/div&gt;\n},<\/code><\/pre>\n<h2>P\u00e4ivitet\u00e4\u00e4n m\u00e4\u00e4ritteiden arvoja<\/h2>\n<p>Attribuuttien p\u00e4ivitt\u00e4miseksi meill\u00e4 on rekvisiittassa k\u00e4ytett\u00e4viss\u00e4 menetelm\u00e4 nimelt\u00e4 <code>setAttributes()<\/code>. T\u00e4m\u00e4 funktio hyv\u00e4ksyy objektin, johon voit lis\u00e4t\u00e4 mink\u00e4 tahansa m\u00e4\u00e4ritteen, jonka haluat p\u00e4ivitt\u00e4\u00e4. Voit p\u00e4ivitt\u00e4\u00e4 vain yhden m\u00e4\u00e4ritteen, useamman tai kaikki kerralla. Jos olet m\u00e4\u00e4ritt\u00e4nyt useita m\u00e4\u00e4ritteit\u00e4 ja soita <code>setAttributes()<\/code>p\u00e4ivitt\u00e4\u00e4ksesi vain yhden niist\u00e4, muita ei kosketa.<\/p>\n<p>Jos sinulla on kokemusta Reactista, huomaat todenn\u00e4k\u00f6isesti v\u00e4litt\u00f6m\u00e4sti yht\u00e4l\u00e4isyydet <code>setAttributes()<\/code>ja v\u00e4lill\u00e4 <code>setState()<\/code>. Ne toimivat t\u00e4sm\u00e4lleen samalla tavalla, mutta erona on, ett\u00e4 Reactin tila on vain jotain, joka on tallennettu paikallisesti kyseiseen komponenttiin, ja attribuutit tallennetaan itse asiassa datana komponentin ulkopuolelle.<\/p>\n<p>Attribuutin p\u00e4ivitt\u00e4mist\u00e4 varten funktio yleens\u00e4 tuhotaan rekvisiittasta ja kutsutaan sit\u00e4 n\u00e4in: Alla p\u00e4ivit\u00e4mme <code>exampleText<\/code>attribuutin muotoon &quot;Hei&quot;.<\/p>\n<pre><code>const { setAttributes } = props;\nsetAttributes({ exampleText: 'Hi' });<\/code><\/pre>\n<p>Luonnollisesti ajaisit <code>setAttributes()<\/code>jonkin toiminnon sis\u00e4lt\u00e4. Yleinen esimerkki on <code>onChange<\/code>propin sis\u00e4ll\u00e4 jonkinlaisessa sy\u00f6tt\u00f6kent\u00e4ss\u00e4, jota k\u00e4ytet\u00e4\u00e4n <code>exampleText<\/code>attribuutin arvon tallentamiseen.<\/p>\n<p>Muista tallentaa attribuutit siin\u00e4 tyypiss\u00e4, jonka m\u00e4\u00e4ritit attribuutille. Sinulla ei ole onnea yritt\u00e4\u00e4 tallentaa objekteja esimerkiksi merkkijonoattribuutiksi.<\/p>\n<p>Kokeillaan k\u00e4yt\u00e4nn\u00f6ss\u00e4! Tee aloite <code>npm run start<\/code>, jos et ole jo tehnyt.<\/p>\n<h2>Attribuutin n\u00e4ytt\u00e4minen mukautetussa tekstisy\u00f6t\u00f6ss\u00e4 ja m\u00e4\u00e4ritteen arvon p\u00e4ivitt\u00e4minen<\/h2>\n<p>Edellisess\u00e4 vaiheessa lis\u00e4simme joitain komponentteja sis\u00e4\u00e4n <code>edit<\/code>, esim. tekstinsy\u00f6tt\u00f6, mutta mit\u00e4\u00e4n ei tallennettu. Lis\u00e4t\u00e4\u00e4n attribuutti ja yksi tekstisy\u00f6te sille lohkoomme. Varmistamme molemmat, ett\u00e4 tekstinsy\u00f6tt\u00f6 n\u00e4ytt\u00e4\u00e4 nykyisen arvon, ja aina kun sy\u00f6tt\u00f6\u00e4 muutetaan, p\u00e4ivit\u00e4mme attribuutin.<\/p>\n<h3>Lis\u00e4\u00e4m\u00e4ll\u00e4 tekstinsy\u00f6t\u00f6n ja sen <code>onChange<\/code>prop<\/h3>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { TextControl } = wp.components;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    attributes: {\n        exampleText: {\n            type: 'string',\n            default: ''\n        }\n    },\n    edit: (props) =&gt; { \n        const { attributes, setAttributes } = props;\n        return (&lt;div&gt;\n                &lt;TextControl \n                    value={attributes.exampleText}\n                    onChange={(newtext) =&gt; setAttributes({ exampleText: newtext })}\n                \/&gt; \n            &lt;\/div&gt;\n        );\n    },\n    save:() =&gt; { \n        return &lt;div&gt;:)&lt;\/div&gt; \n    }\n});<\/code><\/pre>\n<p>Tuhoamme <code>attributes<\/code>ja <code>setAttributes<\/code>koska <code>props<\/code>k\u00e4yt\u00e4mme molempia. Sitten k\u00e4yt\u00e4mme <code>TextControl<\/code>komponenttia WordPress- <code>wp.components<\/code>paketista. Annamme sille kaksi rekvisiittaa; <code>value<\/code>asettaa sy\u00f6tteen arvon (sek\u00e4 alussa ett\u00e4 kirjoittamisen aikana) ja toiminnon sy\u00f6tteen tapahtumaan <code>onChange<\/code>.<\/p>\n<p>Asetamme <code>value<\/code>sen attribuuttimme arvoon; <code>attributes.exampleText<\/code>. Siin\u00e4 <code>onChange<\/code>tapauksessa, ett\u00e4 suoritamme funktion, joka v\u00e4litt\u00e4\u00e4 sy\u00f6tteemme kirjoitetun arvon parametrina <code>newtext<\/code>(sy\u00f6tearvo on komponentista palautettu prop). T\u00e4ss\u00e4 funktiossa kutsumme <code>setAttributes()<\/code>ja p\u00e4ivit\u00e4mme attribuutin <code>exampleText<\/code>sy\u00f6tteeseen kirjoitetuksi.<\/p>\n<p>T\u00e4m\u00e4 on perus React &#8211; paitsi, ett\u00e4 ty\u00f6skentelemme attribuuttien emmek\u00e4 tilan kanssa. Jos yll\u00e4 oleva h\u00e4mment\u00e4\u00e4 sinua, suosittelen katsomaan nopeaa opetusohjelmaa Reactissa, koska n\u00e4m\u00e4 selitt\u00e4v\u00e4t t\u00e4m\u00e4n tavan todenn\u00e4k\u00f6isesti paremmin kuin min\u00e4!<\/p>\n<p>P\u00e4ivit\u00e4 editori ja katso kuinka lohko toimii! Sinun pit\u00e4isi saada tavallinen tekstisy\u00f6te asioiden kirjoittamista varten, ja se tallennetaan aina, kun painat Tallenna\/P\u00e4ivit\u00e4 j\u00e4lkimuokkauksessa.<\/p>\n<h3>Tulos k\u00e4ytt\u00f6liittym\u00e4ss\u00e4 ja tietokannassa<\/h3>\n<p>Jos katsot viesti\u00e4si k\u00e4ytt\u00f6liittym\u00e4ss\u00e4, sen pit\u00e4isi silti kaikua div:ll\u00e4, koska se on edelleen <code>save<\/code>toiminnassamme. Mutta jotain on tapahtunut kulissien takana! Lohkomme kommenttilohko sis\u00e4lt\u00e4\u00e4 nyt JSON-attribuuttimme arvon.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151357-61e4ca89cf1d2.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-151357-61e4ca89cf1d2.png\" alt=\"Luo mukautettu Gutenberg-lohko \u2013 Osa 4: Attribuutit\" ><\/a><\/p>\n<p>Et n\u00e4e kommenttilohkoja mallissa, joka tekee normaalin <code>the_content()<\/code>kutsun. N\u00e4hd\u00e4ksesi kommenttilohkot sinulla on kaksi vaihtoehtoa. Katso joko <code>post_content<\/code>viestien tietokantataulukkoa. Tai lis\u00e4\u00e4 <code>echo get_the_content()<\/code>malli ja katso sit\u00e4 Tarkastus\/virheenkorjausty\u00f6kalussa.<\/p>\n<p>Ilmeisesti meill\u00e4 on p\u00e4\u00e4sy my\u00f6s attribuutteihin <code>save<\/code>, rekvisiittasta.<\/p>\n<h3>N\u00e4ytet\u00e4\u00e4n sy\u00f6tteen arvo sis\u00e4\u00e4n<code>save<\/code><\/h3>\n<p>N\u00e4ytet\u00e4\u00e4n attribuutin arvo div:n sis\u00e4ll\u00e4 <code>save<\/code>funktiossamme:<\/p>\n<pre><code>save: (props) =&gt; { \n    const { attributes } = props;\n    return &lt;div&gt;{attributes.exampleText}&lt;\/div&gt;\n}<\/code><\/pre>\n<p>Huomautus: Kun olet tehnyt t\u00e4m\u00e4n muutoksen, saat rikkin\u00e4isen lohkon viestiin, johon olet jo lis\u00e4nnyt t\u00e4m\u00e4n lohkon. T\u00e4m\u00e4 tapahtuu, koska editori kohtaa erilaisen tulosteen <code>save<\/code>kuin mit\u00e4 olemme nyt m\u00e4\u00e4ritt\u00e4neet. Poista lohko ja lis\u00e4\u00e4 se uudelleen. Kirjoita jotain tekstinsy\u00f6tt\u00f6\u00f6n, p\u00e4ivit\u00e4 viesti ja tarkastele sit\u00e4 k\u00e4ytt\u00f6liittym\u00e4ss\u00e4.<\/p>\n<p>Ja t\u00e4m\u00e4 on itse asiassa asian ydin. Sin\u00e4 p\u00e4\u00e4t\u00e4t, mit\u00e4 m\u00e4\u00e4ritteit\u00e4 tarvitset tallentaaksesi haluamasi lohkoon. Siin\u00e4 <code>edit<\/code>hahmotat tapoja, joilla k\u00e4ytt\u00e4j\u00e4 voi sy\u00f6tt\u00e4\u00e4, huolehtien siit\u00e4, ett\u00e4 nykyiset arvot n\u00e4kyv\u00e4t ja p\u00e4ivitt\u00e4v\u00e4t ne aina, kun ne muuttuvat. Ja <code>save<\/code>purat tallennetut attribuutit ja teet tulosteen haluamallasi tavalla.<\/p>\n<p>K\u00e4sittelemme paljon enemm\u00e4n erilaisia \u200b\u200b\u200b\u200bkomponentteja ja ominaisuuksia t\u00e4ss\u00e4 opetusohjelmasarjassa. Mutta katsotaanpa yht\u00e4 muuta komponenttia t\u00e4ss\u00e4 viestiss\u00e4 n\u00e4hd\u00e4ksemme, mist\u00e4 m\u00e4\u00e4ritteen ominaisuudessa <code>source<\/code>on kyse.<\/p>\n<h2>RichText ja attribuutin ominaisuus<code>source<\/code><\/h2>\n<p>WordPress- <code>RichText<\/code>komponentti antaa sinulle &quot;reunattoman&quot; tekstialueen tekstin muotoilutuella. Saatat mieluummin k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 (ruma?) tavallisen tekstinsy\u00f6t\u00f6n tai tekstialueen sijaan. Mutta muista, ett\u00e4 <code>RichText<\/code>sit\u00e4 on k\u00e4sitelt\u00e4v\u00e4 hieman eri tavalla, koska on olemassa useita rekvisiitta, jotka sinun on oltava tietoisia, ja on eroa siin\u00e4, kuinka saamme arvon <code>save<\/code>toiminnallemme.<\/p>\n<h3><code>RichText<\/code>Komponentin lis\u00e4\u00e4minen<\/h3>\n<p>Yksinkertaisin muoto <code>RichText<\/code>on toteuttaa se samalla tavalla kuin tekstinsy\u00f6tt\u00f6\u00e4 k\u00e4ytett\u00e4ess\u00e4:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { RichText } = wp.blockEditor;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    ...\n    attributes: {\n        myRichText: {\n            type: 'string',\n            default: ''\n        }\n    },\n    edit: (props) =&gt; { \n        const { attributes, setAttributes } = props;\n        return (&lt;div&gt;\n                &lt;RichText \n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt; \n            &lt;\/div&gt;\n        );\n    },\n    ...<\/code><\/pre>\n<p>Puramme <code>RichText<\/code>komponentin <code>wp.blockEditor<\/code>paketista, mutta muuten yll\u00e4 oleva on identtinen tavallisen tekstinsy\u00f6t\u00f6n kanssa.<\/p>\n<h3>K\u00e4sittely <code>save<\/code>kanssa<code>RichText<\/code><\/h3>\n<p>Funktiossa <code>save<\/code>sinun on kuitenkin k\u00e4ytett\u00e4v\u00e4 <code>RichText<\/code>komponenttia uudelleen saadaksesi attribuutin arvon. Soitamme <code>RichText.Content<\/code>ja asetamme rekvisiitin <code>value<\/code>attribuutillemme:<\/p>\n<pre><code>save: (props) =&gt; { \n    const { attributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText.Content \n                value={attributes.myRichText}\n            \/&gt;\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>T\u00e4m\u00e4 tulostaa editoriin kirjoitetun <code>RichText<\/code>suoraan ilman HTML-koodia.<\/p>\n<p>Kun ty\u00f6skentelet kanssasi, <code>RichText<\/code>haluat todenn\u00e4k\u00f6isesti hallita tekstin ymp\u00e4rill\u00e4 olevaa HTML-k\u00e4\u00e4rett\u00e4, esimerkiksi a <code>&lt;p&gt;<\/code>tai a <code>&lt;h2&gt;<\/code>, sek\u00e4 k\u00e4ytt\u00f6liittym\u00e4ss\u00e4 ett\u00e4 editorissa. T\u00e4t\u00e4 varten voimme k\u00e4ytt\u00e4\u00e4 rekvisiittaa nimelt\u00e4 <code>tagName<\/code>.<\/p>\n<p>Komponentti <code>RichText<\/code>mahdollistaa my\u00f6s useita muita rekvisiitta. Voit m\u00e4\u00e4ritt\u00e4\u00e4 paikkamerkkitekstin, joka n\u00e4ytet\u00e4\u00e4n (h\u00e4ivytettyn\u00e4), kun se on tyhj\u00e4 <code>placeholder<\/code>. Komponentin avulla voit my\u00f6s hallita, mit\u00e4 muotoiluvaihtoehtoja kentt\u00e4 sallii (mit\u00e4 painikkeita se n\u00e4ytt\u00e4\u00e4 ty\u00f6kalupalkissa).<\/p>\n<h3><code>RichText<\/code>kanssa<code>tagName<\/code><\/h3>\n<p>Prop:n <code>tagName<\/code>avulla voit ennalta m\u00e4\u00e4ritt\u00e4\u00e4, mihin HTML-tunnisteeseen sen tulos k\u00e4\u00e4rit\u00e4\u00e4n. Kun k\u00e4yt\u00e4t, k\u00e4yt\u00e4 <code>tagName<\/code>samaa <code>tagName<\/code>propaa ja arvoa molemmissa <code>edit<\/code>ja -kohdissa <code>save<\/code>.<\/p>\n<p>Oletetaan, ett\u00e4 haluat laittaa attribuutin arvon <code>&lt;h2&gt;<\/code>, joka pakottaa editorissa mink\u00e4 tahansa sy\u00f6tteen arvoksi h2. Voit <code>edit<\/code>tehd\u00e4:<\/p>\n<pre><code>&lt;RichText \n    tagName=\"h2\"\n    placeholder=\"Write your heading here\"\n    value={attributes.myRichText}\n    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n\/&gt;<\/code><\/pre>\n<p>Ja sis\u00e4\u00e4n <code>save<\/code>:<\/p>\n<pre><code>&lt;RichText.Content \n    tagName=\"h2\"\n    value={attributes.myRichText}\n\/&gt;<\/code><\/pre>\n<p>Yll\u00e4 oleva tulostaa nyt sen, mik\u00e4 on kirjoitettu tunnisteen <code>RichText<\/code>sis\u00e4ll\u00e4 olevalle alueelle .<code>&lt;h2&gt;<\/code><\/p>\n<h3>K\u00e4ytt\u00e4m\u00e4ll\u00e4<code>source<\/code><\/h3>\n<p>Ilmeisesti voit yhdist\u00e4\u00e4 useita richtext-tekstej\u00e4 lohkoa varten, esimerkiksi yhden otsikkoa ja yhden kappaletta varten. Muista vain, ett\u00e4 jokainen tarvitsee oman ominaisuutensa. Esimerkiksi:<\/p>\n<pre><code>attributes: {\n    myRichHeading: {\n        type: 'string'\n    },\n    myRichText: {\n        type: 'string'\n    }\n},\nedit: (props) =&gt; { \n    const { attributes, setAttributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText \n                tagName=\"h2\"\n                placeholder=\"Write your heading here\"\n                value={attributes.myRichHeading}\n                onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n            \/&gt;\n            &lt;RichText\n                tagName=\"p\"\n                placeholder=\"Write your paragraph here\"\n                value={attributes.myRichText}\n                onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n            \/&gt;\n        &lt;\/div&gt;\n    );\n},\nsave: (props) =&gt; { \n    const { attributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText.Content \n                tagName=\"h2\"\n                value={attributes.myRichHeading}\n            \/&gt;\n            &lt;RichText.Content \n                tagName=\"p\"\n                value={attributes.myRichText}\n            \/&gt;\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>Nyt kuitenkin alat kohdata joitain ongelmia. Vaikka voit muotoilla teksti\u00e4 editorissa, mit\u00e4\u00e4n (tai osaa) muotoilusta ei tallenneta. Kun tarkastelet viesti\u00e4 k\u00e4ytt\u00f6liittym\u00e4ss\u00e4, se n\u00e4kyy vain muodossa <code>h2<\/code>ja <code>p<\/code>ilman tekemi\u00e4si muotoiluja (kursivointi, lihavoitu, linkki). Edes lohkosi kommenttilohko ei sis\u00e4ll\u00e4 muotoilua. T\u00e4m\u00e4 on hankala asia <code>RichText<\/code>. T\u00e4m\u00e4n ratkaisemiseksi meid\u00e4n on ty\u00f6skennelt\u00e4v\u00e4 attribuutin ominaisuuden kanssa <code>source<\/code>.<\/p>\n<p>Ominaisuus <code>source<\/code>, jonka avulla WordPress voi poimia ja tulkita sis\u00e4lt\u00f6\u00e4 suoraan viestin sis\u00e4ll\u00f6st\u00e4. Jos m\u00e4\u00e4ritett\u00e4 ei ole <code>source<\/code>asetettu, se tallennetaan ja puretaan HTML-kommenttilohkosta.<\/p>\n<p>Kun ty\u00f6skentelemme kanssa, <code>RichText<\/code>asetamme yleens\u00e4 <code>source<\/code>arvoon <code>html<\/code>, joka k\u00e4ytt\u00e4\u00e4 WordPressin kirjastoa HTML-merkint\u00f6jen j\u00e4sent\u00e4miseen. Ominaisuus <code>source<\/code>toimii yhdess\u00e4 toisen attribuuttiominaisuuden kanssa; <code>selector<\/code>joka m\u00e4\u00e4ritt\u00e4\u00e4, mist\u00e4 HTML-tunnisteesta sen tulee purkaa.<\/p>\n<p>Esimerkkin\u00e4 asetamme kappaleessamme <code>source<\/code>as :n ja asetamme asteen (muuten se on oletuksena lohkon juuri).<code>html``RichText``selector``p<\/code><\/p>\n<pre><code>attributes: {\n    ...\n    myRichText: {\n        type: 'string',\n        source: 'html',\n        selector: 'p'\n    }\n},<\/code><\/pre>\n<p>Nyt toisen <code>RichText<\/code>pit\u00e4isi onnistuneesti tallentaa kaikki tekstimuotoilunsa. Huomaat my\u00f6s, ett\u00e4 kommenttilohko n\u00e4ytt\u00e4\u00e4 nyt vain <code>myRichHeading<\/code>JSON-m\u00e4\u00e4ritteen. Attribuutti <code>myRichText<\/code>on kadonnut kokonaan kommenttilohkosta. T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 <code>source<\/code>WordPress j\u00e4sent\u00e4\u00e4 nyt viestin sis\u00e4ll\u00f6n attribuutin arvon kommenttilohkon sijaan.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151357-61e4ca8ab1967.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-151357-61e4ca8ab1967.png\" alt=\"Luo mukautettu Gutenberg-lohko \u2013 Osa 4: Attribuutit\" ><\/a><\/p>\n<p>Ollakseni t\u00e4ysin rehellinen, en ole ty\u00f6skennellyt niin paljon <code>source<\/code>m\u00e4\u00e4ritteen kanssa ollenkaan ja suosittelen v\u00e4ltt\u00e4m\u00e4\u00e4n sit\u00e4, jos voit. WordPressin dokumentaatio selitt\u00e4\u00e4 hieman enemm\u00e4n <a href=\"https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-attributes\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4hteest\u00e4 ja m\u00e4\u00e4ritteist\u00e4<\/a>, joiden haluat tarkistaa itse.<\/p>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 olemme oppineet attribuuttien perusasiat; kuinka ne m\u00e4\u00e4ritell\u00e4\u00e4n, p\u00e4ivitet\u00e4\u00e4n ja arvot tulostetaan. Seuraavissa vaiheissa tarkastellaan lis\u00e4\u00e4 eri komponentteja ja kuinka lis\u00e4t\u00e4 asetuksia itse lohkon sis\u00e4ll\u00f6n ulkopuolelle; ty\u00f6kalupalkissa ja editorin sivupalkissa (nimelt\u00e4\u00e4n Inspector).<\/p>\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\u00e4ss\u00e4 Gutenberg-lohkooppitunnissa aloittelijoille tarkastellaan attribuuttien m\u00e4\u00e4rittely\u00e4, niiden arvojen hakemista ja p\u00e4ivitt\u00e4mist\u00e4.<\/p>\n","protected":false},"author":1,"featured_media":151358,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[938,938,813,1110,843,813,843,864,864],"tags":[1166],"class_list":["post-234015","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gutenberg-5","category-laajennuksia","category-n-a","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/234015","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=234015"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/234015\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/151358"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=234015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=234015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=234015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}