{"id":233734,"date":"2023-02-19T20:20:00","date_gmt":"2023-02-19T17:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233734"},"modified":"2022-11-11T12:06:47","modified_gmt":"2022-11-11T09:06:47","slug":"come-accedere-e-analizzare-i-blocchi-di-gutenberg-con-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/come-accedere-e-analizzare-i-blocchi-di-gutenberg-con-php\/","title":{"rendered":"Come accedere e analizzare i blocchi di Gutenberg con PHP"},"content":{"rendered":"\n<p>In questo post vedremo come analizzare i blocchi Gutenberg di un post ed estrarre blocchi specifici per creare qualcos&#8217;altro. Esamineremo le funzioni PHP di WordPress per l&#8217;analisi, l&#8217;estrazione e il rendering dei blocchi scelti.<\/p>\n<p>Uno dei vantaggi del nuovo editor Gutenberg in WordPress sono dati pi\u00f9 strutturati per i contenuti dei post. In passato tutto era archiviato come HTML e non c&#8217;era modo di estrarre contenuti specifici senza alcune espressioni regolari molto complesse. Ma con Gutenberg ogni contenuto, sia esso un paragrafo, un&#8217;intestazione, un&#8217;immagine, un video, un pulsante o una colonna che contiene altri blocchi al suo interno, viene archiviato con informazioni che ci dicono qual \u00e8 questo contenuto.<\/p>\n<p>Con le funzioni integrate di WordPress \u00e8 molto facile recuperare tutti i blocchi nel contenuto di un post in un array con tutte le loro informazioni. Questo apre un sacco di funzioni utili per gli sviluppatori di temi. Solo per citare alcune idee:<\/p>\n<ul>\n<li>Genera dinamicamente un sommario recuperando tutte le intestazioni (tutorial di seguito).<\/li>\n<li>Recupera tutti i video, le immagini o le citazioni utilizzati in tutti i post per raccoglierli ed elencarli tutti in un&#8217;altra pagina.<\/li>\n<li>Estrai il primo paragrafo di un post e usalo come estratto negli archivi (tutorial sotto).<\/li>\n<li>Ottieni una panoramica dell&#8217;uso di blocchi specifici e della loro posizione. Ad esempio, supponiamo che tu abbia un Blocco annunci personalizzato e devi sapere con quale frequenza viene utilizzato nei tuoi post e fino a che punto appaiono nel contenuto.<\/li>\n<li>Visualizza i blocchi di un post ma escludi tipi di blocchi specifici.<\/li>\n<li>Controlla se il contenuto di un post inizia con un video e usa quel video invece dell&#8217;immagine in primo piano negli archivi.<\/li>\n<li>Se utilizzi un blocco personalizzato che contiene le specifiche tecniche sui prodotti, puoi facilmente creare una pagina che visualizza e confronta le specifiche tecniche tra i post dei prodotti.<\/li>\n<li>Raccogli dinamicamente tutte le singole immagini utilizzate in un post e genera una galleria di esse alla fine o altrove.<\/li>\n<\/ul>\n<p>Diamoci dentro!<\/p>\n<h2>Analizza i blocchi di un post<\/h2>\n<p>Per analizzare i blocchi utilizziamo la funzione WordPress <code>[parse_blocks](https:\/\/developer.wordpress.org\/reference\/functions\/parse_blocks\/)()<\/code>. Come parametro devi fornire una stringa del contenuto di un post. Se sei all&#8217;interno di un loop o hai accesso a un oggetto post, fornisci semplicemente <code>$post-&gt;post_content<\/code>come parametro alla funzione.<\/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>Il ritorno da <code>parse_blocks()<\/code>\u00e8 un array in cui ogni elemento dell&#8217;array \u00e8 un blocco. Per ogni elemento del blocco hai informazioni come il tipo di blocco (tasto &#8216; <code>blockName<\/code>&#8216;), gli attributi del blocco (tasto &#8216; <code>attrs<\/code>&#8216;), i blocchi interni per i blocchi nidificati come Colonne (tasto &#8216; <code>innerBlocks<\/code>&#8216;) e due elementi per il contenuto effettivo del blocco (chiavi &#8216; <code>innerHTML<\/code>&#8216; e &#8216; <code>innerContent<\/code>&#8216;). L&#8217;elemento <code>innerHTML<\/code>\u00e8 una stringa di contenuto HTML, mentre <code>innerContent<\/code>\u00e8 un array di stringhe HTML.<\/p>\n<p>E questo \u00e8 tutto! Passa attraverso l&#8217;array restituito da <code>parse_blocks()<\/code>per fare le tue cose. Vedremo altri esempi di codice di questo pi\u00f9 in basso in questo post.<\/p>\n<h2>Una nota sui post classici (non Gutenberg).<\/h2>\n<p>Potresti lavorare su un vecchio sito WordPress che ha creato post prima di eseguire l&#8217;aggiornamento a Gutenberg (o utilizzato un plugin Disable Gutenberg). In questo caso questi post non avranno un contenuto strutturato, ma l&#8217;intero contenuto del post \u00e8 all&#8217;interno di un blocco &quot;Editor classico&quot;.<\/p>\n<p>L&#8217;array restituito dalla funzione <code>parse_blocks()<\/code>su questo tipo di post restituir\u00e0 un elemento dell&#8217;array di blocchi con <code>blockName<\/code>set to <code>null<\/code>. Il contenuto HTML completo del post \u00e8 all&#8217;interno della <code>innerHTML<\/code>stringa di questo elemento.<\/p>\n<p>Possiamo tranquillamente presumere che se il ritorno di un post <code>parse_blocks()<\/code>ha un elemento ed <code>blockName<\/code>\u00e8 <code>null<\/code>, abbiamo a che fare con un post &quot;pre-Gutenberg&quot;. Altrimenti <code>blockName<\/code>sar\u00e0 sempre popolato. Questo \u00e8 un buon controllo da tenere a mente quando si scrive il codice per analizzare i blocchi dei post e si desidera gestire i contenuti WordPress meno recenti.<\/p>\n<h2>Rendi un blocco<\/h2>\n<p>WordPress offre anche una funzione per eseguire il rendering di un blocco specifico con <code>[render_block](https:\/\/developer.wordpress.org\/reference\/functions\/render_block\/)()<\/code>. Come parametro \u00e8 necessario fornire un array per un blocco, proprio come uno di quelli restituiti <code>parse_blocks()<\/code>dall&#8217;alto. La funzione restituisce una stringa di HTML renderizzato che puoi semplicemente richiamare direttamente.<\/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>Il codice sopra visualizzer\u00e0 tutti i blocchi del post, proprio come farebbe normalmente durante il rendering del contenuto del post. La parte divertente arriva quando iniziamo ad aggiungere codice per escludere o includere blocchi specifici che ci interessano.<\/p>\n<p>Ad esempio, il codice seguente stamper\u00e0 solo i blocchi di paragrafo del post:<\/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>E questo render\u00e0 tutti i blocchi, ma escluder\u00e0 tutti i blocchi shortcode:<\/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>Blocca i nomi<\/h2>\n<p>Quando analizzi i blocchi di un post, molto probabilmente dovrai controllare il tipo di blocco. Sono abbastanza semplici da indovinare. Ad esempio, un blocco di paragrafo \u00e8, hai indovinato, <code>paragraph<\/code>. Tuttavia, tieni presente che tutti i blocchi Gutenberg in WordPress sono preceduti da uno spazio dei nomi. Per i blocchi principali di WordPress (predefiniti), sono tutti preceduti da &quot; <code>core\/<\/code>&quot;. L&#8217;eccezione sono i blocchi Embed che sono preceduti da &#8221; <code>core-embed\/<\/code>&#8220;. Quindi, ad esempio, un blocco di paragrafo avr\u00e0 il nome del blocco <code>core\/paragraph<\/code>.<\/p>\n<p>Per evitare ipotesi selvagge, ecco una panoramica dei blocchi predefiniti forniti da WordPress (al momento della stesura di questo):<\/p>\n<h3>Blocchi comuni<\/h3>\n<ul>\n<li>Paragrafo:<code>core\/paragraph<\/code><\/li>\n<li>Immagine:<code>core\/image<\/code><\/li>\n<li>Intestazione:<code>core\/heading<\/code><\/li>\n<li>Galleria:<code>core\/gallery<\/code><\/li>\n<li>Elenco:<code>core\/list<\/code><\/li>\n<li>Citazione:<code>core\/quote<\/code><\/li>\n<li>Audio:<code>core\/audio<\/code><\/li>\n<li>Coperchio:<code>core\/cover<\/code><\/li>\n<li>File:<code>core\/file<\/code><\/li>\n<li>Video:<code>core\/video<\/code><\/li>\n<\/ul>\n<h3>Formattazione<\/h3>\n<ul>\n<li>Preformattato:<code>core\/preformatted<\/code><\/li>\n<li>Codice:<code>core\/code<\/code><\/li>\n<li>Classico: <code>core\/freeform<\/code><br \/>\n(ma per i post non Gutenberg sar\u00e0 <code>null<\/code>, vedi la nota sui post non Gutenberg)<\/li>\n<li>HTML personalizzato:<code>core\/html<\/code><\/li>\n<li>Citazione:<code>core\/pullquote<\/code><\/li>\n<li>Tavolo:<code>core\/table<\/code><\/li>\n<li>Versetto:<code>core\/verse<\/code><\/li>\n<\/ul>\n<h3>Disposizione<\/h3>\n<ul>\n<li>Pulsante:<code>core\/button<\/code><\/li>\n<li>Colonne:<code>core\/columns<\/code><\/li>\n<li>Di pi\u00f9:<code>core\/more<\/code><\/li>\n<li>Interruzione di pagina:<code>core\/nextpage<\/code><\/li>\n<li>Separatore:<code>core\/separator<\/code><\/li>\n<li>Distanziatore:<code>core\/spacer<\/code><\/li>\n<li>Media e testo:<code>core\/media-text<\/code><\/li>\n<\/ul>\n<h3>Widget<\/h3>\n<ul>\n<li>Codice corto:<code>core\/shortcode<\/code><\/li>\n<li>Archivi:<code>core\/archives<\/code><\/li>\n<li>Categorie:<code>core\/categories<\/code><\/li>\n<li>Ultimi commenti:<code>core\/latest-omments<\/code><\/li>\n<li>Ultimi post:<code>core\/latest-posts<\/code><\/li>\n<\/ul>\n<h3>Incorpora<\/h3>\n<ul>\n<li>\n<p>Incorporare:<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>Animato:<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>Segnale di massa:<code>core-embed\/crowdsignal<\/code><\/p>\n<\/li>\n<li>\n<p>Movimento quotidiano:<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>Problema:<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>Condivisione diapositive:<code>core-embed\/slideshare<\/code><\/p>\n<\/li>\n<li>\n<p>Tazza compiaciuta:<code>core-embed\/smugmug<\/code><\/p>\n<\/li>\n<li>\n<p>Piattaforma degli altoparlanti:<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>Videostampa:<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>Esempio di codice: recupera il primo paragrafo di un post come estratto<\/h2>\n<p>Un post ben scritto dovrebbe iniziare con un paragrafo che introduca di cosa tratta il post e inviti le persone a continuare a leggere. Questi sono perfetti da usare come estratti invece di fare affidamento sulla funzione di estratto automatico in WordPress!<\/p>\n<p>Questa \u00e8 una funzione che puoi aggiungere al tuo tema <code>functions.php<\/code>che restituir\u00e0 il primo paragrafo di un post. Se non \u00e8 stato fornito alcun post, far\u00e0 riferimento all&#8217;oggetto post globale. Accoglie anche post non Gutenberg restituendo l&#8217;effettivo estratto di WordPress per quelli.<\/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>Dopo la <code>parse_blocks()<\/code>chiamata della funzione controlliamo se il post ha o meno dati di blocco non validi (il post \u00e8 stato creato prima di Gutenberg) e restituiamo un estratto del post in tal caso. Altrimenti andiamo in rassegna i blocchi del post, troviamo il primo blocco di paragrafo e restituiamo il suo <code>innerHTML<\/code>. Alla fine restituiamo una stringa con (questo \u00e8 facoltativo) a <code>&lt;div&gt;<\/code>attorno ad essa.<\/p>\n<p>Per utilizzare questa funzione \u00e8 sufficiente chiamare:<\/p>\n<pre><code>echo awp_get_excerpt();<\/code><\/pre>\n<p>Supponendo che la chiamata di funzione sia collocata da qualche parte c&#8217;\u00e8 un <code>$post<\/code>oggetto globale, ad esempio all&#8217;interno di un ciclo. Se vuoi specificare un post, fornisci l&#8217;oggetto post come parametro per la chiamata di funzione:<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_get_excerpt($post);<\/code><\/pre>\n<h2>Esempio: crea un sommario dalle intestazioni di un post<\/h2>\n<p>Puoi generare automaticamente e dinamicamente un sommario basato sui blocchi di intestazione di un post. Il processo \u00e8 abbastanza semplice; analizza i blocchi del post e trova tutti i blocchi di tipo <code>core\/heading<\/code>. Ma possiamo fare un ulteriore passo avanti e incorporare i livelli; es. mettendo <code>h3<\/code>come sottotitolo sotto <code>h2<\/code>e cos\u00ec via.<\/p>\n<p>Un blocco di intestazione contiene informazioni sul suo livello nell&#8217;elemento dell&#8217;array di attributi (tasto &#8216; <code>attrs<\/code>&#8216;). All&#8217;interno <code>attrs<\/code>dell&#8217;array sarebbe un elemento dell&#8217;array con la chiave &#8216; <code>level<\/code>&#8216; e un numero intero che indica il livello. A <code>h3<\/code>avrebbe &#8216; <code>level<\/code>&#8216; valore di <code>3<\/code>, a <code>h4<\/code>avrebbe &#8216; <code>level<\/code>&#8216; di <code>4<\/code>, e cos\u00ec via.<\/p>\n<p>Tuttavia, tieni presente che <code>attrs<\/code>per i blocchi di intestazione possono essere vuoti! Ci\u00f2 accade quando l&#8217;autore non ha modificato il tipo di intestazione lontano dai valori predefiniti nelle impostazioni del blocco. Per aggirare questo problema, dobbiamo fare alcune ipotesi. Come saranno i titoli predefiniti <code>h2<\/code>(a meno che tu non lo abbia modificato nel tuo tema). Quindi possiamo presumere che se un blocco di intestazione non ha un attributo di livello, \u00e8 un <code>h2<\/code>. Altrimenti otteniamo le informazioni sul livello dagli attributi.<\/p>\n<p>Se sei davvero all&#8217;altezza della sfida, ti invito a migliorare il codice qui sotto. Il problema della generazione di un elenco strutturato adeguato <code>ol<\/code>\u00e8 che non possiamo controllare come l&#8217;autore struttura i propri titoli. Potrebbero benissimo impazzire e iniziare con <code>h4<\/code>un&#8217;intestazione e passare direttamente a <code>h2<\/code>un&#8217;intestazione subito dopo. E all&#8217;improvviso si mescolano a <code>h1<\/code>nel mezzo. La mia soluzione prevede quindi la generazione di un <code>ol<\/code>elenco semplice e la fornitura delle informazioni di livello nelle classi dell&#8217;elemento dell&#8217;elenco. Quindi con alcuni CSS intelligenti puoi indentare gli elementi dell&#8217;elenco di conseguenza con un po&#8217; di riempimento sinistro.<\/p>\n<h3>Il codice<\/h3>\n<p>Ecco la funzione del sommario:<\/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>La funzione inizia con la gestione del post e l&#8217;analisi dei suoi blocchi. In linea <code>#9<\/code>accogliamo posti non Gutenberg. La funzione continua a scorrere tutti i blocchi e ogni volta che trova un blocco di intestazione viene aggiunto al nostro <code>$headings<\/code>array. Usiamo <code>[wp_strip_all_tags](https:\/\/developer.wordpress.org\/reference\/functions\/wp_strip_all_tags\/)()<\/code>per rimuovere i tag HTML dai titoli. Aggiungiamo anche le informazioni sul livello al nostro array, dove il valore predefinito \u00e8 impostato su <code>2<\/code>se gli attributi sono vuoti.<\/p>\n<p>Dopo il ciclo del blocco, l&#8217; <code>$headings<\/code>array dovrebbe contenere tutte le intestazioni del post, in ordine. Possiamo quindi semplicemente generare una stringa HTML e visualizzarne il contenuto. Come accennato, genero un nome di classe su ogni elemento con informazioni sul livello dell&#8217;intestazione in modo da poter creare l&#8217;illusione di un elenco strutturato con CSS.<\/p>\n<p>Come con la funzione excerpt sopra, possiamo chiamare questa funzione quando siamo all&#8217;interno del ciclo in questo modo:<\/p>\n<pre><code>echo awp_table_of_contents();<\/code><\/pre>\n<p>Oppure se siamo fuori dal ciclo o vogliamo specificare un post;<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_table_of_contents($post);<\/code><\/pre>\n<p>Questo generer\u00e0 un elenco simile a questo:<\/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=\"Come accedere e analizzare i blocchi di Gutenberg con PHP\" ><\/a><\/p>\n<h2>Conclusione<\/h2>\n<p>Come abbiamo visto con i contenuti ricchi strutturati dei post resi possibili con Gutenberg, possiamo trovare ed estrarre molto facilmente parti specifiche del contenuto dei post. Fare riferimento all&#8217;elenco di esempi che ho citato all&#8217;inizio del post. Non ci sono limiti a ci\u00f2 che tu come sviluppatore di temi puoi fare. Dipende solo da ci\u00f2 di cui il tuo tema o sito WordPress ha bisogno (o da cosa sarebbe semplicemente fantastico).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uno sguardo dettagliato su come analizzare i blocchi di un post utilizzando le funzioni PHP di WordPress per analizzare, filtrare e renderizzare blocchi specifici.<\/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":[896,896,720,939,939,1110,814,814,720,844,844,865,865],"tags":[1168],"class_list":["post-233734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-gutenberg-6","category-n-a","category-plugin-2","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233734"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233734\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152587"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}