{"id":233645,"date":"2023-02-19T20:30:00","date_gmt":"2023-02-19T17:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233645"},"modified":"2022-11-11T00:49:14","modified_gmt":"2022-11-10T21:49:14","slug":"kuinka-kaeyttaeae-ja-jaesentaeae-gutenberg-lohkoja-php-llae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kuinka-kaeyttaeae-ja-jaesentaeae-gutenberg-lohkoja-php-llae\/","title":{"rendered":"Kuinka k\u00e4ytt\u00e4\u00e4 ja j\u00e4sent\u00e4\u00e4 Gutenberg-lohkoja PHP:ll\u00e4"},"content":{"rendered":"\n<p>T\u00e4ss\u00e4 viestiss\u00e4 tarkastellaan kuinka j\u00e4sent\u00e4\u00e4 viestin Gutenberg-lohkoja ja poimia tiettyj\u00e4 lohkoja luodaksesi jotain muuta. Tarkastellaan WordPress PHP -toimintoja valittujen lohkojen j\u00e4sent\u00e4miseen, purkamiseen ja hahmontamiseen.<\/p>\n<p>Yksi WordPressin uuden Gutenberg-editorin etu on j\u00e4sennellympi data postaussis\u00e4ll\u00f6lle. Vanhoina aikoina kaikki tallennettiin HTML-muodossa, eik\u00e4 tiettyj\u00e4 sis\u00e4ll\u00f6n osia ollut mahdollista purkaa ilman eritt\u00e4in monimutkaisia \u200b\u200bs\u00e4\u00e4nn\u00f6llisi\u00e4 lausekkeita. Mutta Gutenbergin kanssa jokainen sis\u00e4lt\u00f6, olipa kyseess\u00e4 kappale, otsikko, kuva, video, painike tai sarake, jonka sis\u00e4ll\u00e4 on muita lohkoja, tallennetaan tiedoilla, jotka kertovat meille, mit\u00e4 t\u00e4m\u00e4 sis\u00e4lt\u00f6 on.<\/p>\n<p>Sis\u00e4\u00e4nrakennettujen WordPress-toimintojen avulla on eritt\u00e4in helppoa noutaa kaikki viestin sis\u00e4ll\u00f6n lohkot taulukossa kaikkine tiedoineen. T\u00e4m\u00e4 avaa runsaasti hy\u00f6dyllisi\u00e4 ominaisuuksia teeman kehitt\u00e4jille. Muutama idea mainitakseni:<\/p>\n<ul>\n<li>Luo dynaamisesti sis\u00e4llysluettelo hakemalla kaikki otsikot (opastus alla).<\/li>\n<li>Hae kaikki kaikissa viesteiss\u00e4 k\u00e4ytetyt videot, kuvat tai lainaukset ker\u00e4t\u00e4ksesi ja listataksesi ne kaikki toiselle sivulle.<\/li>\n<li>Pura viestin ensimm\u00e4inen kappale ja k\u00e4yt\u00e4 sit\u00e4 otteena arkistossa (opastus alla).<\/li>\n<li>Saat yleiskuvan tiettyjen lohkojen k\u00e4yt\u00f6st\u00e4 ja niiden sijainnista. Oletetaan esimerkiksi, ett\u00e4 sinulla on mukautettu mainoslohko ja sinun on tiedett\u00e4v\u00e4, kuinka usein sit\u00e4 k\u00e4ytet\u00e4\u00e4n viesteiss\u00e4si ja kuinka pitk\u00e4lle sis\u00e4ll\u00f6ss\u00e4 ne n\u00e4kyv\u00e4t.<\/li>\n<li>Render\u00f6i viestin lohkot, mutta sulje pois tietyt lohkotyypit.<\/li>\n<li>Tarkista, alkaako viestin sis\u00e4lt\u00f6 videolla, ja k\u00e4yt\u00e4 kyseist\u00e4 videota arkistossa esitellyn kuvan sijaan.<\/li>\n<li>Jos k\u00e4yt\u00e4t mukautettua lohkoa, joka sis\u00e4lt\u00e4\u00e4 tuotteiden tekniset tiedot, voit helposti luoda sivun, joka n\u00e4ytt\u00e4\u00e4 ja vertaa teknisi\u00e4 tietoja eri tuotejulkaisuissa.<\/li>\n<li>Ker\u00e4\u00e4 dynaamisesti kaikki viestiss\u00e4 k\u00e4ytetyt yksitt\u00e4iset kuvat ja luo niist\u00e4 galleria lopussa tai muualla.<\/li>\n<\/ul>\n<p>Hypp\u00e4\u00e4k\u00e4\u00e4mme suoraan asiaan!<\/p>\n<h2>J\u00e4senn\u00e4 viestin lohkot<\/h2>\n<p>Lohkojen j\u00e4sent\u00e4miseen k\u00e4yt\u00e4mme WordPress-toimintoa <code>[parse_blocks](https:\/\/developer.wordpress.org\/reference\/functions\/parse_blocks\/)()<\/code>. Parametriksi sinun on annettava viestin sis\u00e4ll\u00f6n merkkijono. Jos olet silmukassa tai sinulla on p\u00e4\u00e4sy post-objektiin, anna vain <code>$post-&gt;post_content<\/code>funktion parametri.<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\n$blocks = parse_blocks($post-&gt;post_content);<\/code><\/pre>\n<p>Paluu l\u00e4hteest\u00e4 <code>parse_blocks()<\/code>on taulukko, jossa jokainen taulukon elementti on lohko. Jokaisesta lohkoelementist\u00e4 sinulla on tietoja, kuten lohkon tyyppi (avain &#8217; <code>blockName<\/code>&#8217;), lohkon attribuutit (avain &#8217; <code>attrs<\/code>&#8217;), sis\u00e4lohkot sis\u00e4kk\u00e4isille lohkoille, kuten sarakkeet (avain &#8217; <code>innerBlocks<\/code>&#8217;), ja kaksi elementti\u00e4 varsinaiselle lohkon sis\u00e4ll\u00f6lle (avaimet &#8217; <code>innerHTML<\/code>&#8217; ja &#8217; <code>innerContent<\/code>&#8217;). Elementti <code>innerHTML<\/code>on HTML-sis\u00e4ll\u00f6n merkkijono, kun taas <code>innerContent<\/code>se on joukko HTML-merkkijonoja.<\/p>\n<p>Ja siin\u00e4 kaikki! Selaa palautetun taulukon l\u00e4pi <code>parse_blocks()<\/code>tehd\u00e4ksesi asiasi. Katsomme lis\u00e4\u00e4 koodiesimerkkej\u00e4 t\u00e4st\u00e4 alempana t\u00e4ss\u00e4 viestiss\u00e4.<\/p>\n<h2>Huomautus klassisista (ei-Gutenbergin) viesteist\u00e4<\/h2>\n<p>Saatat ty\u00f6skennell\u00e4 vanhemmalla WordPress-sivustolla, joka on luonut viestej\u00e4 ennen p\u00e4ivitt\u00e4mist\u00e4 Gutenbergiin (tai k\u00e4ytt\u00e4nyt Disable Gutenberg-laajennusta). T\u00e4ss\u00e4 tapauksessa n\u00e4ill\u00e4 viesteill\u00e4 ei ole j\u00e4sennelty\u00e4 viestisis\u00e4lt\u00f6\u00e4, vaan koko viestin sis\u00e4lt\u00f6 on &quot;Classic editor&quot; -lohkossa.<\/p>\n<p>Funktiosta palautettu taulukko palauttaa <code>parse_blocks()<\/code>t\u00e4llaisissa viesteiss\u00e4 yhden lohkotaulukon elementin, jonka <code>blockName<\/code>arvo on <code>null<\/code>. Viestin koko HTML-sis\u00e4lt\u00f6 on t\u00e4m\u00e4n elementin <code>innerHTML<\/code>merkkijonon sis\u00e4ll\u00e4.<\/p>\n<p>Voimme turvallisesti olettaa, ett\u00e4 jos viestin tuotolla <code>parse_blocks()<\/code>on yksi elementti ja se <code>blockName<\/code>on <code>null<\/code>, kyseess\u00e4 on &quot;pre-Gutenberg&quot; -viesti. Muuten <code>blockName<\/code>on aina asutettu. T\u00e4m\u00e4 on hyv\u00e4 tarkistus pit\u00e4\u00e4 mieless\u00e4, kun kirjoitat koodia viestien lohkojen j\u00e4sent\u00e4miseksi ja haluat k\u00e4sitell\u00e4 vanhempaa WordPress-sis\u00e4lt\u00f6\u00e4.<\/p>\n<h2>Render\u00f6i lohko<\/h2>\n<p>WordPress tarjoaa my\u00f6s toiminnon tietyn lohkon render\u00f6imiseksi <code>[render_block](https:\/\/developer.wordpress.org\/reference\/functions\/render_block\/)()<\/code>. Parametriksi sinun on annettava lohkolle taulukko, aivan kuten yksi <code>parse_blocks()<\/code>ylh\u00e4\u00e4lt\u00e4 palautetuista. Funktio palauttaa renderoidun HTML-koodin merkkijonon, jonka voit yksinkertaisesti toistaa suoraan.<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\n$blocks = parse_blocks($post-&gt;post_content);\nforeach ($blocks as $block) {\n    echo render_block($block);\n}<\/code><\/pre>\n<p>Yll\u00e4 oleva koodi render\u00f6i kaikki viestin lohkot, aivan kuten tavallisesti hahmonnettaessa viestin sis\u00e4lt\u00f6\u00e4. Hauskin osa tulee, kun alamme lis\u00e4t\u00e4 koodia tiettyjen meit\u00e4 kiinnostavien lohkojen poissulkemiseksi tai sis\u00e4llytt\u00e4miseksi.<\/p>\n<p>Esimerkiksi alla oleva koodi tulostaa vain viestin kappalelohkot:<\/p>\n<pre><code>foreach ($blocks as $block) {\n    if ($block['blockName'] == 'core\/paragraph') {\n        echo render_block($block);\n    }\n}<\/code><\/pre>\n<p>Ja t\u00e4m\u00e4 hahmontaa kaikki lohkot, mutta sulkee pois kaikki lyhytkoodilohkot:<\/p>\n<pre><code>foreach ($blocks as $block) {\n    if ($block['blockName'] != 'core\/shortcode') {\n        echo render_block($block);\n    }\n}<\/code><\/pre>\n<h2>Est\u00e4 nimet<\/h2>\n<p>Kun j\u00e4sent\u00e4t viestin lohkoja, sinun on todenn\u00e4k\u00f6isesti tarkistettava lohkon tyyppi. Ne ovat melko yksinkertaisia \u200b\u200barvata. Esimerkiksi kappalelohko on, hyvin arvasit sen, <code>paragraph<\/code>. Muista kuitenkin, ett\u00e4 kaikkiin WordPressin Gutenberg-lohkoihin on liitetty nimiavaruus. WordPress-ydinlohkoissa (oletus) niiden kaikkien etuliitteen\u00e4 on &quot; <code>core\/<\/code>&quot;. Poikkeuksena ovat upotuslohkot, joiden etuliitteen\u00e4 on &quot; <code>core-embed\/<\/code>&quot;. Joten esimerkiksi kappalelohkolla on lohkon nimi <code>core\/paragraph<\/code>.<\/p>\n<p>Villien arvailujen v\u00e4ltt\u00e4miseksi t\u00e4ss\u00e4 on yleiskatsaus WordPressin tarjoamista oletuslohkoista (t\u00e4t\u00e4 kirjoitettaessa):<\/p>\n<h3>Yleiset lohkot<\/h3>\n<ul>\n<li>Kohta:<code>core\/paragraph<\/code><\/li>\n<li>Kuva:<code>core\/image<\/code><\/li>\n<li>Otsikko:<code>core\/heading<\/code><\/li>\n<li>Galleria:<code>core\/gallery<\/code><\/li>\n<li>Lista:<code>core\/list<\/code><\/li>\n<li>Lainata:<code>core\/quote<\/code><\/li>\n<li>Audio:<code>core\/audio<\/code><\/li>\n<li>Peite:<code>core\/cover<\/code><\/li>\n<li>Tiedosto:<code>core\/file<\/code><\/li>\n<li>Video:<code>core\/video<\/code><\/li>\n<\/ul>\n<h3>Muotoilu<\/h3>\n<ul>\n<li>Esimuotoiltu:<code>core\/preformatted<\/code><\/li>\n<li>Koodi:<code>core\/code<\/code><\/li>\n<li>Klassinen: <code>core\/freeform<\/code><br \/>\n(mutta muiden kuin Gutenberg-viestien kohdalla se on <code>null<\/code>, katso huomautus ei-Gutenberg-viesteist\u00e4)<\/li>\n<li>Muokattu HTML:<code>core\/html<\/code><\/li>\n<li>Pullquote:<code>core\/pullquote<\/code><\/li>\n<li>P\u00f6yt\u00e4:<code>core\/table<\/code><\/li>\n<li>Jae:<code>core\/verse<\/code><\/li>\n<\/ul>\n<h3>Layout<\/h3>\n<ul>\n<li>Painike:<code>core\/button<\/code><\/li>\n<li>Sarakkeet:<code>core\/columns<\/code><\/li>\n<li>Lis\u00e4\u00e4:<code>core\/more<\/code><\/li>\n<li>Sivunvaihto:<code>core\/nextpage<\/code><\/li>\n<li>Erotin:<code>core\/separator<\/code><\/li>\n<li>V\u00e4likappale:<code>core\/spacer<\/code><\/li>\n<li>Media ja teksti:<code>core\/media-text<\/code><\/li>\n<\/ul>\n<h3>Widgetit<\/h3>\n<ul>\n<li>Lyhyt koodi:<code>core\/shortcode<\/code><\/li>\n<li>Arkistot:<code>core\/archives<\/code><\/li>\n<li>Luokat:<code>core\/categories<\/code><\/li>\n<li>Viimeisimm\u00e4t kommentit:<code>core\/latest-omments<\/code><\/li>\n<li>Uusimmat viestit:<code>core\/latest-posts<\/code><\/li>\n<\/ul>\n<h3>Upota<\/h3>\n<ul>\n<li>\n<p>Upottaa:<code>core\/embed<\/code><\/p>\n<\/li>\n<li>\n<p>Viserrys:<code>core-embed\/twitter<\/code><\/p>\n<\/li>\n<li>\n<p>YouTube:<code>core-embed\/youtube<\/code><\/p>\n<\/li>\n<li>\n<p>Facebook:<code>core-embed\/facebook<\/code><\/p>\n<\/li>\n<li>\n<p>Instagram:<code>core-embed\/instagram<\/code><\/p>\n<\/li>\n<li>\n<p>WordPress:<code>core-embed\/wordpress<\/code><\/p>\n<\/li>\n<li>\n<p>SoundCloud:<code>core-embed\/soundcloud<\/code><\/p>\n<\/li>\n<li>\n<p>Spotify:<code>core-embed\/spotify<\/code><\/p>\n<\/li>\n<li>\n<p>Flickr:<code>core-embed\/flickr<\/code><\/p>\n<\/li>\n<li>\n<p>Vimeo:<code>core-embed\/vimeo<\/code><\/p>\n<\/li>\n<li>\n<p>Animoto:<code>core-embed\/animoto<\/code><\/p>\n<\/li>\n<li>\n<p>Pilvist\u00e4:<code>core-embed\/cloudup<\/code><\/p>\n<\/li>\n<li>\n<p>Crowdsignal:<code>core-embed\/crowdsignal<\/code><\/p>\n<\/li>\n<li>\n<p>P\u00e4ivitt\u00e4inen liike:<code>core-embed\/dailymotion<\/code><\/p>\n<\/li>\n<li>\n<p>Hulu:<code>core-embed\/hulu<\/code><\/p>\n<\/li>\n<li>\n<p>Kuva:<code>core-embed\/imgur<\/code><\/p>\n<\/li>\n<li>\n<p>Ongelma:<code>core-embed\/issuu<\/code><\/p>\n<\/li>\n<li>\n<p>Kickstarter:<code>core-embed\/kickstarter<\/code><\/p>\n<\/li>\n<li>\n<p>Meetup.com:<code>core-embed\/meetup-com<\/code><\/p>\n<\/li>\n<li>\n<p>Mixcloud:<code>core-embed\/mixcloud<\/code><\/p>\n<\/li>\n<li>\n<p>Reddit:<code>core-embed\/reddit<\/code><\/p>\n<\/li>\n<li>\n<p>ReverbNation:<code>core-embed\/reverbnation<\/code><\/p>\n<\/li>\n<li>\n<p>Screencast:<code>core-embed\/screencast<\/code><\/p>\n<\/li>\n<li>\n<p>Scribd:<code>core-embed\/scribd<\/code><\/p>\n<\/li>\n<li>\n<p>Slideshare:<code>core-embed\/slideshare<\/code><\/p>\n<\/li>\n<li>\n<p>SmugMug:<code>core-embed\/smugmug<\/code><\/p>\n<\/li>\n<li>\n<p>Kaiutindekki:<code>core-embed\/speaker<\/code><\/p>\n<\/li>\n<li>\n<p>TED:<code>core-embed\/ted<\/code><\/p>\n<\/li>\n<li>\n<p>Tumblr:<code>core-embed\/tumblr<\/code><\/p>\n<\/li>\n<li>\n<p>VideoPress:<code>core-embed\/videopress<\/code><\/p>\n<\/li>\n<li>\n<p>wordpress.tv:<code>core-embed\/wordpress-tv<\/code><\/p>\n<\/li>\n<li>\n<p>Amazon Kindle:<code>core-embed\/amazon-kindle<\/code><\/p>\n<\/li>\n<\/ul>\n<h2>Esimerkki koodista: Hae viestin ensimm\u00e4inen kappale katkelmana<\/h2>\n<p>Hyvin kirjoitetun postauksen tulisi alkaa kappaleella, joka esittelee viestin aiheen ja houkuttelee ihmisi\u00e4 jatkamaan lukemista. N\u00e4m\u00e4 ovat t\u00e4ydellisi\u00e4 k\u00e4ytett\u00e4v\u00e4ksi otteina sen sijaan, ett\u00e4 luottaisit WordPressin automaattiseen otetoimintoon!<\/p>\n<p>T\u00e4m\u00e4 on toiminto, jonka voit lis\u00e4t\u00e4 teemaasi ja <code>functions.php<\/code>joka palauttaa viestin ensimm\u00e4isen kappaleen. Jos viesti\u00e4 ei ole annettu, se viittaa globaaliin viestiobjektiin. Se sis\u00e4lt\u00e4\u00e4 my\u00f6s ei-Gutenberg-viestit palauttamalla niist\u00e4 todellisen WordPress-otteen.<\/p>\n<pre><code>function awp_get_excerpt($post=false) {\n    if (!$post) { \n        global $post;\n    }\n    if (!$post) { return ''; }\n    $excerpt = '';\n    $blocks = parse_blocks($post-&gt;post_content);\n    if (count($blocks) == 1 &amp;&amp; $blocks[0]['blockName'] == null) {  \/\/ Non-Gutenberg posts\n        $excerpt = get_the_excerpt($post-&gt;ID);\n    } else {\n        foreach ($blocks as $block) {\n            if ($block['blockName'] == 'core\/paragraph') {\n                $excerpt = strip_tags($block['innerHTML']);\n                break;\n            }\n        }\n    }\n    return \"&lt;div class='excerpt'&gt;$excerpt&lt;\/div&gt;\";\n}<\/code><\/pre>\n<p>Toiminnon <code>parse_blocks()<\/code>kutsun j\u00e4lkeen tarkistamme, onko viestiss\u00e4 virheellisi\u00e4 lohkotietoja (viesti luotiin ennen Gutenbergi\u00e4) ja palautamme viestiotteen, jos n\u00e4in on. Muussa tapauksessa k\u00e4ymme l\u00e4pi viestin lohkot, etsimme ensimm\u00e4isen kappaleen lohkon ja palautamme sen <code>innerHTML<\/code>. Aivan lopussa palautamme merkkijonon, jonka <code>&lt;div&gt;<\/code>ymp\u00e4rill\u00e4 (t\u00e4m\u00e4 on valinnainen) a.<\/p>\n<p>K\u00e4ytt\u00e4\u00e4ksesi t\u00e4t\u00e4 toimintoa sinun tarvitsee vain soittaa:<\/p>\n<pre><code>echo awp_get_excerpt();<\/code><\/pre>\n<p>Olettaen, ett\u00e4 funktiokutsu sijoitetaan jonnekin, jossa on globaali <code>$post<\/code>objekti, esimerkiksi silmukan sis\u00e4ll\u00e4. Jos haluat m\u00e4\u00e4ritt\u00e4\u00e4 postin, anna post-objekti parametrina funktiokutsulle:<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_get_excerpt($post);<\/code><\/pre>\n<h2>Esimerkki: Luo sis\u00e4llysluettelo viestin otsikoista<\/h2>\n<p>Voit luoda sis\u00e4llysluettelon automaattisesti ja dynaamisesti viestin otsikkolohkojen perusteella. Prosessi on riitt\u00e4v\u00e4n yksinkertainen; j\u00e4sent\u00e4\u00e4 viestin lohkot ja etsi\u00e4 kaikki tyypin lohkot <code>core\/heading<\/code>. Mutta voimme vied\u00e4 sen askeleen pidemm\u00e4lle ja sis\u00e4llytt\u00e4\u00e4 tasot; esim. asettamalla <code>h3<\/code>alaotsikko alle <code>h2<\/code>ja niin edelleen.<\/p>\n<p>Otsikkolohko sis\u00e4lt\u00e4\u00e4 tietoja sen tasosta attribuuttitaulukon elementiss\u00e4 (avain &#8217; <code>attrs<\/code>&#8217;). Taulukon sis\u00e4ll\u00e4 <code>attrs<\/code>se olisi taulukkoelementti, jonka avain on &#8217; <code>level<\/code>&#8217; ja tasoa ilmaiseva kokonaisluku. A: lla <code>h3<\/code>olisi &#8217; <code>level<\/code>&#8217; arvo <code>3<\/code>, a :lla <code>h4<\/code>olisi &#8217; <code>level<\/code>&#8217; <code>4<\/code>ja niin edelleen.<\/p>\n<p>Huomaa kuitenkin, ett\u00e4 <code>attrs<\/code>otsikon lohkot voivat olla tyhji\u00e4! T\u00e4m\u00e4 tapahtuu, kun kirjoittaja ei ole muuttanut otsikkotyyppi\u00e4 pois oletusasetuksista lohkon asetuksissa. T\u00e4m\u00e4n kiert\u00e4miseksi meid\u00e4n on teht\u00e4v\u00e4 joitain oletuksia. Oletusotsikot ovat <code>h2<\/code>(ellet ole muuttanut t\u00e4t\u00e4 teemassasi). Joten voimme olettaa, ett\u00e4 jos otsikkolohkolla ei ole taso-attribuuttia, se on <code>h2<\/code>. Muuten saamme tasotiedot attribuuteista.<\/p>\n<p>Jos todella vastaat haasteeseen, kehotan sinua parantamaan alla olevaa koodia. Asianmukaisen j\u00e4sennellyn <code>ol<\/code>luettelon luomisessa on se, ett\u00e4 emme voi hallita sit\u00e4, miten kirjoittaja j\u00e4sent\u00e4\u00e4 otsikkonsa. He voivat hyvinkin tulla hulluksi ja aloittaa <code>h4<\/code>otsikolla ja hyp\u00e4t\u00e4 oikealle <code>h2<\/code>otsikkoon heti sen j\u00e4lkeen. Ja yht\u00e4kki\u00e4 ne sekoittuvat <code>h1<\/code>keskelle. Ratkaisuni sis\u00e4lt\u00e4\u00e4 siksi tasaisen <code>ol<\/code>listan luomisen ja tasotietojen tarjoamisen luettelokohteen luokissa. Sitten jollain \u00e4lykk\u00e4\u00e4ll\u00e4 CSS:ll\u00e4 voit sisent\u00e4\u00e4 luettelon kohteet vastaavasti vasemmalla t\u00e4ytteell\u00e4.<\/p>\n<h3>Koodi<\/h3>\n<p>T\u00e4ss\u00e4 on sis\u00e4llysluettelotoiminto:<\/p>\n<pre><code>function awp_table_of_contents($post=false) {\n    if (!$post) {\n        global $post;\n    }\n    if (!$post) { return ''; }\n    $headings = [];\n    $blocks = parse_blocks($post-&gt;post_content);\n    if (count($blocks) == 1 &amp;&amp; $blocks[0]['blockName'] == null) {  \/\/ Non-Gutenberg posts\n        return '';\n    } else {\n        foreach ($blocks as $block) {\n            if ($block['blockName'] == 'core\/heading') {\n                $level = (isset($block['attrs']['level']))? $block['attrs']['level']: 2;  \/\/ h2 as default\n                $headings[] = ['title' =&gt; wp_strip_all_tags($block['innerHTML']), 'level' =&gt; $level];\n            }\n        }\n    }\n\u00a0\n    if (empty($headings)) {  \/\/ No headings found in post\n        return '';\n    }\n\u00a0\n    $toc = '&lt;ol class=\"table-of-contents\"&gt;';\n    foreach ($headings as $heading) {\n        $toc .= '&lt;li class=\"heading-level-'. $heading['level']. '\"&gt;'. $heading['title']. '&lt;\/li&gt;';\n    }\n    $toc .= '&lt;\/ol&gt;';\n    return $toc;\n}<\/code><\/pre>\n<p>Toiminto alkaa viestien k\u00e4sittelyll\u00e4 ja sen lohkojen j\u00e4sent\u00e4misell\u00e4. Linjalla <code>#9<\/code>otamme vastaan \u200b\u200bmuita kuin Gutenberg-virkoja. Funktio jatkaa silmukkaa kaikkien lohkojen l\u00e4pi ja aina kun se l\u00f6yt\u00e4\u00e4 otsikkolohkon, se lis\u00e4t\u00e4\u00e4n <code>$headings<\/code>taulukkoomme. K\u00e4yt\u00e4mme <code>[wp_strip_all_tags](https:\/\/developer.wordpress.org\/reference\/functions\/wp_strip_all_tags\/)()<\/code>HTML-tunnisteiden poistamiseen otsikoista. Lis\u00e4\u00e4mme my\u00f6s tasotiedot taulukkoomme, jossa oletusarvo on, <code>2<\/code>jos attribuutit on tyhj\u00e4.<\/p>\n<p>Lohkosilmukan j\u00e4lkeen <code>$headings<\/code>taulukon tulee sis\u00e4lt\u00e4\u00e4 kaikki viestien otsikot j\u00e4rjestyksess\u00e4. Voimme sitten yksinkertaisesti luoda HTML-merkkijonon ja tulostaa sen sis\u00e4ll\u00f6n. Kuten mainittiin, luon jokaiselle elementille luokan nimen, joka sis\u00e4lt\u00e4\u00e4 tiedot otsikon tasosta, jotta voimme luoda illuusion j\u00e4sennellyst\u00e4 luettelosta CSS:n avulla.<\/p>\n<p>Kuten yll\u00e4 olevaa otefunktiota, voimme kutsua t\u00e4t\u00e4 funktiota, kun olemme silmukan sis\u00e4ll\u00e4, seuraavasti:<\/p>\n<pre><code>echo awp_table_of_contents();<\/code><\/pre>\n<p>Tai jos olemme silmukan ulkopuolella tai haluamme m\u00e4\u00e4ritt\u00e4\u00e4 viestin;<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_table_of_contents($post);<\/code><\/pre>\n<p>T\u00e4m\u00e4 luo luettelon, joka n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152586-61e4e13930788.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-152586-61e4e13930788.png\" alt=\"Kuinka k\u00e4ytt\u00e4\u00e4 ja j\u00e4sent\u00e4\u00e4 Gutenberg-lohkoja PHP:ll\u00e4\" ><\/a><\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s<\/h2>\n<p>Kuten olemme n\u00e4hneet Gutenbergin mahdollistaman j\u00e4sennellyn rikkaan viestisis\u00e4ll\u00f6n avulla, voimme helposti l\u00f6yt\u00e4\u00e4 ja poimia tiettyj\u00e4 osia viestien sis\u00e4ll\u00f6st\u00e4. Palaa artikkelin alussa mainitsemaani esimerkkiluetteloon. Teemankehitt\u00e4j\u00e4n toiminnalle ei ole rajoituksia. Se riippuu vain siit\u00e4, mit\u00e4 teemasi tai WordPress-sivustosi tarvitsee (tai mik\u00e4 olisi vain siisti\u00e4).<\/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>Yksityiskohtainen katsaus viestin lohkojen j\u00e4sent\u00e4miseen k\u00e4ytt\u00e4m\u00e4ll\u00e4 WordPress PHP -toimintoja tiettyjen lohkojen j\u00e4sent\u00e4miseen, suodattamiseen ja render\u00f6imiseen.<\/p>\n","protected":false},"author":1,"featured_media":152587,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[895,719,938,938,719,895,813,1110,843,813,843,864,864],"tags":[1166],"class_list":{"0":"post-233645","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koodi","8":"category-kehittaejae","9":"category-gutenberg-5","13":"category-laajennuksia","14":"category-n-a","15":"category-opetusohjelmia","18":"category-wordpress-5","20":"tag-affiai-fi"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233645","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=233645"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233645\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/152587"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}