{"id":233634,"date":"2023-02-19T20:08:00","date_gmt":"2023-02-19T17:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233634"},"modified":"2022-11-11T00:45:16","modified_gmt":"2022-11-10T21:45:16","slug":"hur-man-kommer-aat-och-analyserar-gutenberg-block-med-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-kommer-aat-och-analyserar-gutenberg-block-med-php\/","title":{"rendered":"Hur man kommer \u00e5t och analyserar Gutenberg-block med PHP"},"content":{"rendered":"\n<p>I det h\u00e4r inl\u00e4gget kommer vi att titta p\u00e5 hur man analyserar ett inl\u00e4ggs Gutenberg-block och extraherar specifika block f\u00f6r att g\u00f6ra n\u00e5got annat. Vi ska titta p\u00e5 WordPress PHP-funktioner f\u00f6r att analysera, extrahera och rendera valda block.<\/p>\n<p>En f\u00f6rdel med den nya Gutenberg-redigeraren i WordPress \u00e4r mer strukturerad data f\u00f6r inl\u00e4ggsinneh\u00e5ll. F\u00f6rr i tiden lagrades allt som HTML och det fanns inget s\u00e4tt att extrahera specifika delar av inneh\u00e5ll utan n\u00e5gra mycket komplexa regulj\u00e4ra uttryck. Men med Gutenberg lagras varje del av inneh\u00e5llet, vare sig det \u00e4r ett stycke, rubrik, bild, video, knapp eller en kolumn som har andra block inuti sig, med information som ber\u00e4ttar vad detta inneh\u00e5ll \u00e4r.<\/p>\n<p>Med inbyggda WordPress-funktioner \u00e4r det v\u00e4ldigt enkelt att h\u00e4mta alla block i ett inl\u00e4ggs inneh\u00e5ll i en array med all deras information. Detta \u00f6ppnar upp f\u00f6r massor av anv\u00e4ndbara funktioner f\u00f6r temautvecklare. F\u00f6r att bara n\u00e4mna n\u00e5gra id\u00e9er:<\/p>\n<ul>\n<li>Generera dynamiskt en inneh\u00e5llsf\u00f6rteckning genom att h\u00e4mta alla rubriker (handledning nedan).<\/li>\n<li>H\u00e4mta alla videor, bilder eller citat som anv\u00e4nds i alla inl\u00e4gg f\u00f6r att samla och lista dem alla p\u00e5 en annan sida.<\/li>\n<li>Extrahera ett inl\u00e4ggs f\u00f6rsta stycke och anv\u00e4nd det som utdrag i arkiv (handledning nedan).<\/li>\n<li>F\u00e5 en \u00f6verblick \u00f6ver anv\u00e4ndningen av specifika block och deras position. S\u00e4g till exempel att du har ett anpassat annonsblock och att du beh\u00f6ver veta hur ofta det anv\u00e4nds i dina inl\u00e4gg och hur l\u00e5ngt ner i inneh\u00e5llet de visas.<\/li>\n<li>Rendera ett inl\u00e4ggs block men exkludera specifika blocktyper.<\/li>\n<li>Kontrollera om ett inl\u00e4ggsinneh\u00e5ll b\u00f6rjar med en video och anv\u00e4nd den videon ist\u00e4llet f\u00f6r den utvalda bilden i arkiv.<\/li>\n<li>Om du anv\u00e4nder ett anpassat block som inneh\u00e5ller tekniska specifikationer p\u00e5 produkter kan du enkelt skapa en sida som visar och j\u00e4mf\u00f6r de tekniska specifikationerna \u00f6ver produktinl\u00e4gg.<\/li>\n<li>Samla dynamiskt alla enstaka bilder som anv\u00e4nds i ett inl\u00e4gg och generera ett galleri av dem i slutet eller n\u00e5gon annanstans.<\/li>\n<\/ul>\n<p>L\u00e5t oss bara hoppa direkt in i det!<\/p>\n<h2>Analysera ett inl\u00e4ggs block<\/h2>\n<p>F\u00f6r att analysera block anv\u00e4nder vi WordPress-funktionen <code>[parse_blocks](https:\/\/developer.wordpress.org\/reference\/functions\/parse_blocks\/)()<\/code>. Som parameter m\u00e5ste du tillhandah\u00e5lla en str\u00e4ng av ett inl\u00e4ggs inneh\u00e5ll. Om du \u00e4r inne i en loop eller har tillg\u00e5ng till ett post-objekt, ange bara <code>$post-&gt;post_content<\/code>som parameter till funktionen.<\/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>Returen fr\u00e5n <code>parse_blocks()<\/code>\u00e4r en array d\u00e4r varje arrayelement \u00e4r ett block. F\u00f6r varje blockelement har du information som typ av block (nyckel &#8217; <code>blockName<\/code>&#8217;), blockattribut (nyckel &#8217; <code>attrs<\/code>&#8217;), inre block f\u00f6r kapslade block som kolumner (nyckel &#8217; <code>innerBlocks<\/code>&#8217;), och tv\u00e5 element f\u00f6r sj\u00e4lva blockinneh\u00e5llet (nycklar &#8217; <code>innerHTML<\/code>&#8217; och &#8217; <code>innerContent<\/code>&#8217;). Elementet <code>innerHTML<\/code>\u00e4r en str\u00e4ng av HTML-inneh\u00e5ll, medan det <code>innerContent<\/code>\u00e4r en upps\u00e4ttning HTML-str\u00e4ngar.<\/p>\n<p>Och det \u00e4r allt! G\u00e5 igenom den returnerade arrayen fr\u00e5n <code>parse_blocks()<\/code>f\u00f6r att g\u00f6ra din grej. Vi ska titta p\u00e5 fler kodexempel p\u00e5 detta l\u00e4ngre ner i det h\u00e4r inl\u00e4gget.<\/p>\n<h2>En anteckning om klassiska (icke-Gutenberg) inl\u00e4gg<\/h2>\n<p>Du kanske arbetar p\u00e5 en \u00e4ldre WordPress-webbplats som har skapat inl\u00e4gg innan du uppgraderar till Gutenberg (eller anv\u00e4nde en Disable Gutenberg-plugin). I det h\u00e4r fallet kommer dessa inl\u00e4gg inte att ha strukturerat inl\u00e4ggsinneh\u00e5ll, utan snarare \u00e4r hela inl\u00e4ggets inneh\u00e5ll i ett &quot;Klassisk redigerare&quot;-block.<\/p>\n<p>Arrayen som returneras fr\u00e5n funktionen <code>parse_blocks()<\/code>kommer p\u00e5 denna typ av inl\u00e4gg att returnera ett block array-element med <code>blockName<\/code>satt till <code>null<\/code>. Inl\u00e4ggets fullst\u00e4ndiga HTML-inneh\u00e5ll finns i detta elements <code>innerHTML<\/code>str\u00e4ng.<\/p>\n<p>Vi kan lugnt anta att om ett inl\u00e4ggs avkastning <code>parse_blocks()<\/code>har ett element och dess <code>blockName<\/code>\u00e4r <code>null<\/code>, har vi att g\u00f6ra med ett &quot;pre-Gutenberg&quot;-inl\u00e4gg. Annars <code>blockName<\/code>kommer alltid att fyllas i. Detta \u00e4r en bra kontroll att ha i \u00e5tanke n\u00e4r du skriver kod f\u00f6r att analysera inl\u00e4ggs block och du vill hantera \u00e4ldre WordPress-inneh\u00e5ll.<\/p>\n<h2>G\u00f6r ett block<\/h2>\n<p>WordPress erbjuder ocks\u00e5 en funktion f\u00f6r att rendera ett specifikt block med <code>[render_block](https:\/\/developer.wordpress.org\/reference\/functions\/render_block\/)()<\/code>. Som parameter m\u00e5ste du tillhandah\u00e5lla en array f\u00f6r ett block, precis som en av de som returneras <code>parse_blocks()<\/code>ovanifr\u00e5n. Funktionen returnerar en str\u00e4ng med renderad HTML som du helt enkelt kan eka rakt ut.<\/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>Ovanst\u00e5ende kod kommer att \u00e5terge alla inl\u00e4ggets block, precis som den normalt skulle g\u00f6ra n\u00e4r inl\u00e4ggets inneh\u00e5ll \u00e5terges. Det roliga kommer n\u00e4r vi b\u00f6rjar l\u00e4gga till kod f\u00f6r att utesluta eller inkludera specifika block som vi \u00e4r intresserade av.<\/p>\n<p>Till exempel kommer koden nedan endast att skriva ut postens styckeblock:<\/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>Och detta kommer att rendera alla block, men exkludera alla kortkodsblock:<\/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>Blocknamn<\/h2>\n<p>N\u00e4r du analyserar ett inl\u00e4ggs block kommer du troligen att beh\u00f6va kontrollera blockets typ. De \u00e4r ganska enkla att gissa. Ett styckeblock \u00e4r till exempel, du gissade r\u00e4tt, <code>paragraph<\/code>. Kom dock ih\u00e5g att alla Gutenberg-block i WordPress har ett namnomr\u00e5de som prefix. F\u00f6r WordPress-k\u00e4rnblock (standard) har de alla prefixet &quot; <code>core\/<\/code>&quot;. Undantaget \u00e4r Embed-blocken som har prefixet &quot; <code>core-embed\/<\/code>&quot;. S\u00e5 till exempel ett styckeblock kommer att ha blocknamnet <code>core\/paragraph<\/code>.<\/p>\n<p>F\u00f6r att undvika vilda gissningar h\u00e4r \u00e4r en \u00f6versikt \u00f6ver standardblocken som tillhandah\u00e5lls av WordPress (n\u00e4r detta skrivs):<\/p>\n<h3>Vanliga block<\/h3>\n<ul>\n<li>Paragraf:<code>core\/paragraph<\/code><\/li>\n<li>Bild:<code>core\/image<\/code><\/li>\n<li>Rubrik:<code>core\/heading<\/code><\/li>\n<li>Galleri:<code>core\/gallery<\/code><\/li>\n<li>Lista:<code>core\/list<\/code><\/li>\n<li>Citat:<code>core\/quote<\/code><\/li>\n<li>Audio:<code>core\/audio<\/code><\/li>\n<li>Omslag:<code>core\/cover<\/code><\/li>\n<li>Fil:<code>core\/file<\/code><\/li>\n<li>Video:<code>core\/video<\/code><\/li>\n<\/ul>\n<h3>Formatering<\/h3>\n<ul>\n<li>F\u00f6rformaterad:<code>core\/preformatted<\/code><\/li>\n<li>Koda:<code>core\/code<\/code><\/li>\n<li>Klassisk: <code>core\/freeform<\/code><br \/>\n(men f\u00f6r icke-Gutenberg-inl\u00e4gg kommer det att vara <code>null<\/code>, se anteckning om icke-Gutenberg-inl\u00e4gg)<\/li>\n<li>Anpassad HTML:<code>core\/html<\/code><\/li>\n<li>Dragcitat:<code>core\/pullquote<\/code><\/li>\n<li>Tabell:<code>core\/table<\/code><\/li>\n<li>Vers:<code>core\/verse<\/code><\/li>\n<\/ul>\n<h3>Layout<\/h3>\n<ul>\n<li>Knapp:<code>core\/button<\/code><\/li>\n<li>Kolumner:<code>core\/columns<\/code><\/li>\n<li>Mer:<code>core\/more<\/code><\/li>\n<li>Sidbrytning:<code>core\/nextpage<\/code><\/li>\n<li>Separator:<code>core\/separator<\/code><\/li>\n<li>Spacer:<code>core\/spacer<\/code><\/li>\n<li>Media och text:<code>core\/media-text<\/code><\/li>\n<\/ul>\n<h3>Widgets<\/h3>\n<ul>\n<li>Kortkod:<code>core\/shortcode<\/code><\/li>\n<li>Arkiv:<code>core\/archives<\/code><\/li>\n<li>Kategorier:<code>core\/categories<\/code><\/li>\n<li>Senaste kommentarer:<code>core\/latest-omments<\/code><\/li>\n<li>Senaste inl\u00e4ggen:<code>core\/latest-posts<\/code><\/li>\n<\/ul>\n<h3>B\u00e4dda in<\/h3>\n<ul>\n<li>\n<p>B\u00e4dda in:<code>core\/embed<\/code><\/p>\n<\/li>\n<li>\n<p>Twitter:<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>Cloudup:<code>core-embed\/cloudup<\/code><\/p>\n<\/li>\n<li>\n<p>Publiksignal:<code>core-embed\/crowdsignal<\/code><\/p>\n<\/li>\n<li>\n<p>Dailymotion:<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>Imgur:<code>core-embed\/imgur<\/code><\/p>\n<\/li>\n<li>\n<p>Problem:<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>Bilddelning:<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>H\u00f6gtalarpanel:<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>Kodexempel: H\u00e4mta ett inl\u00e4ggs f\u00f6rsta stycke som utdrag<\/h2>\n<p>Ett v\u00e4lskrivet inl\u00e4gg b\u00f6r b\u00f6rja med ett stycke som introducerar vad inl\u00e4gget handlar om och som lockar folk att forts\u00e4tta l\u00e4sa. Dessa \u00e4r perfekta att anv\u00e4nda som utdrag ist\u00e4llet f\u00f6r att f\u00f6rlita sig p\u00e5 den automatiska utdragsfunktionen i WordPress!<\/p>\n<p>Det h\u00e4r \u00e4r en funktion du kan l\u00e4gga till i ditt tema i <code>functions.php<\/code>som kommer att returnera ett inl\u00e4ggs f\u00f6rsta stycke. Om inget inl\u00e4gg l\u00e4mnades kommer det att h\u00e4nvisa till det globala postobjektet. Det rymmer ocks\u00e5 icke-Gutenberg-inl\u00e4gg genom att returnera sj\u00e4lva WordPress-utdraget f\u00f6r dessa.<\/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>Efter funktionens <code>parse_blocks()<\/code>anrop kontrollerar vi om inl\u00e4gget har ogiltiga blockdata (inl\u00e4gget skapades f\u00f6re Gutenberg) och returnerar inl\u00e4ggsutdrag om s\u00e5 \u00e4r fallet. Annars g\u00e5r vi igenom inl\u00e4ggets block, hittar det f\u00f6rsta styckeblocket och returnerar dess <code>innerHTML<\/code>. I slutet returnerar vi en str\u00e4ng med (detta \u00e4r valfritt) a <code>&lt;div&gt;<\/code>runt den.<\/p>\n<p>F\u00f6r att anv\u00e4nda den h\u00e4r funktionen beh\u00f6ver du bara ringa:<\/p>\n<pre><code>echo awp_get_excerpt();<\/code><\/pre>\n<p>F\u00f6rutsatt att funktionsanropet placeras n\u00e5gonstans d\u00e4r det finns ett globalt <code>$post<\/code>objekt, till exempel inuti en loop. Om du vill specificera ett inl\u00e4gg, ange postobjektet som parameter till funktionsanropet:<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_get_excerpt($post);<\/code><\/pre>\n<h2>Exempel: Skapa en inneh\u00e5llsf\u00f6rteckning fr\u00e5n ett inl\u00e4ggs rubriker<\/h2>\n<p>Du kan automatiskt och dynamiskt generera en inneh\u00e5llsf\u00f6rteckning baserat p\u00e5 ett inl\u00e4ggs rubrikblock. Processen \u00e4r enkel nog; analysera inl\u00e4ggets block och hitta alla block av typen <code>core\/heading<\/code>. Men vi kan ta det ett steg l\u00e4ngre och inf\u00f6rliva niv\u00e5er; t.ex. s\u00e4tta <code>h3<\/code>som underrubrik under <code>h2<\/code>och s\u00e5 vidare.<\/p>\n<p>Ett rubrikblock inneh\u00e5ller information om dess niv\u00e5 i attributmatriselementet (nyckel &#8217; <code>attrs<\/code>&#8217;). Inuti <code>attrs<\/code>arrayen skulle det vara ett arrayelement med nyckeln &#8217; <code>level<\/code>&#8217; och ett heltal som anger niv\u00e5n. A <code>h3<\/code>skulle ha &#8217; <code>level<\/code>&#8217; v\u00e4rde av <code>3<\/code>, a <code>h4<\/code>skulle ha &#8217; <code>level<\/code>&#8217; av <code>4<\/code>och s\u00e5 vidare.<\/p>\n<p>Observera dock att <code>attrs<\/code>rubrikblock kan vara tomma! Detta h\u00e4nder n\u00e4r f\u00f6rfattaren inte har \u00e4ndrat rubriktypen fr\u00e5n standardinst\u00e4llningarna i blockets inst\u00e4llningar. F\u00f6r att kringg\u00e5 detta m\u00e5ste vi g\u00f6ra n\u00e5gra antaganden. Som standard kommer rubriker att vara <code>h2<\/code>(s\u00e5vida du inte har \u00e4ndrat detta i ditt tema). S\u00e5 vi kan anta att om ett rubrikblock inte har ett niv\u00e5attribut s\u00e5 \u00e4r det en <code>h2<\/code>. Annars f\u00e5r vi niv\u00e5informationen fr\u00e5n attributen.<\/p>\n<p>Om du verkligen orkar med utmaningen uppmanar jag dig att f\u00f6rb\u00e4ttra koden nedan. Problemet med att skapa en ordentlig strukturerad <code>ol<\/code>lista \u00e4r att vi inte kan kontrollera hur f\u00f6rfattaren strukturerar sina titlar. De kan mycket v\u00e4l bli galna och b\u00f6rja med en <code>h4<\/code>rubrik och hoppa direkt till en <code>h2<\/code>rubrik direkt efter. Och pl\u00f6tsligt blandar de en <code>h1<\/code>i mitten. Min l\u00f6sning inneb\u00e4r d\u00e4rf\u00f6r att generera en platt <code>ol<\/code>lista och tillhandah\u00e5lla niv\u00e5informationen i listobjektets klasser. Sedan med lite smart CSS kan du dra in listobjekten d\u00e4refter med lite v\u00e4nster stoppning.<\/p>\n<h3>Koden<\/h3>\n<p>H\u00e4r \u00e4r inneh\u00e5llsf\u00f6rteckningsfunktionen:<\/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>Funktionen b\u00f6rjar med att hantera inl\u00e4gget och analysera dess block. Vid k\u00f6 <code>#9<\/code>tar vi emot tj\u00e4nster som inte \u00e4r Gutenberg. Funktionen forts\u00e4tter att g\u00e5 igenom alla block och n\u00e4r den hittar ett rubrikblock l\u00e4ggs den till i v\u00e5r <code>$headings<\/code>array. Vi anv\u00e4nder <code>[wp_strip_all_tags](https:\/\/developer.wordpress.org\/reference\/functions\/wp_strip_all_tags\/)()<\/code>f\u00f6r att ta bort HTML-taggarna fr\u00e5n titlarna. Vi l\u00e4gger ocks\u00e5 till niv\u00e5informationen i v\u00e5r array, d\u00e4r standarden \u00e4r inst\u00e4lld p\u00e5 <code>2<\/code>om attributen \u00e4r tomma.<\/p>\n<p>Efter <code>$headings<\/code>blockloopen b\u00f6r arrayen inneh\u00e5lla alla postens rubriker, i ordning. Vi kan sedan helt enkelt generera en HTML-str\u00e4ng och mata ut dess inneh\u00e5ll. Som n\u00e4mnt genererar jag ett klassnamn p\u00e5 varje element med information om rubrikens niv\u00e5 s\u00e5 att vi kan skapa illusionen av en strukturerad lista med CSS.<\/p>\n<p>Precis som med utdragsfunktionen ovan kan vi kalla den h\u00e4r funktionen n\u00e4r vi \u00e4r inne i slingan s\u00e5 h\u00e4r:<\/p>\n<pre><code>echo awp_table_of_contents();<\/code><\/pre>\n<p>Eller om vi \u00e4r utanf\u00f6r loopen eller vill specificera ett inl\u00e4gg;<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_table_of_contents($post);<\/code><\/pre>\n<p>Detta kommer att generera en lista som ser ut ungef\u00e4r s\u00e5 h\u00e4r:<\/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=\"Hur man kommer \u00e5t och analyserar Gutenberg-block med PHP\" ><\/a><\/p>\n<h2>Slutsats<\/h2>\n<p>Som vi har sett med strukturerat rikt inl\u00e4ggsinneh\u00e5ll som gjorts m\u00f6jligt med Gutenberg, kan vi mycket enkelt hitta och extrahera specifika delar av inl\u00e4ggens inneh\u00e5ll. Se tillbaka till listan med exempel jag n\u00e4mnde i b\u00f6rjan av inl\u00e4gget. Det finns inga gr\u00e4nser f\u00f6r vad du som temautvecklare kan g\u00f6ra. Det beror bara p\u00e5 vad ditt tema eller WordPress-webbplats har behov av (eller vad som helt enkelt bara skulle vara coolt).<\/p>\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>En detaljerad titt p\u00e5 hur man analyserar ett inl\u00e4ggs block med WordPress PHP-funktioner f\u00f6r att analysera, filtrera och rendera specifika block.<\/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":[901,724,942,942,848,901,1110,818,818,848,724,868,868],"tags":[1173],"class_list":["post-233634","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-gutenberg-9","category-handledningar","category-n-a","category-plugins-3","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233634","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=233634"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233634\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/152587"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}