{"id":233696,"date":"2023-02-19T17:33:00","date_gmt":"2023-02-19T14:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233696"},"modified":"2022-11-11T08:55:32","modified_gmt":"2022-11-11T05:55:32","slug":"crea-un-blocco-gutenberg-personalizzato-parte-9-blocchi-dinamici-e-rendering-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-un-blocco-gutenberg-personalizzato-parte-9-blocchi-dinamici-e-rendering-php\/","title":{"rendered":"Crea un blocco Gutenberg personalizzato &#8211; Parte 9: Blocchi dinamici e rendering PHP"},"content":{"rendered":"\n<p>Finora abbiamo reso l&#8217;output del blocco in Javascript. Tuttavia, con contenuti dinamici come post recenti o visualizzazione di un post, \u00e8 necessario eseguire il rendering dell&#8217;output del blocco in PHP. In questo post impareremo come e perch\u00e9.<\/p>\n<h2>Perch\u00e9 dobbiamo gestire i blocchi dinamici in modo diverso?<\/h2>\n<p>Alcuni esempi sono ovvi; un blocco che mostra gli ultimi post in una categoria \u00e8 dinamico perch\u00e9 i post cambieranno nel tempo. Non scegli i post nel blocco; invece probabilmente avrai le impostazioni per scegliere la categoria, quali informazioni mostrare per ogni post, il numero di post, il numero di colonne e cos\u00ec via. Ogni volta che WordPress carica un post con questo blocco, \u00e8 necessario interrogare WordPress in quel momento per i post pi\u00f9 recenti. La visualizzazione dello stesso post il mese successivo potrebbe produrre risultati diversi anche se il post con il blocco stesso non \u00e8 stato aggiornato.<\/p>\n<p>Ma la necessit\u00e0 di blocchi dinamici a volte non \u00e8 cos\u00ec ovvia. Potresti immaginare un blocco di post in primo piano in cui scegli un post specifico per visualizzarlo, non \u00e8 necessariamente dinamico. Ma potrebbe essere \u2013 e dovrebbe essere. Ricorda che il post selezionato pu\u00f2 aggiornare il titolo, l&#8217;estratto o l&#8217;immagine in primo piano in qualsiasi momento e ci\u00f2 dovrebbe riflettersi nei blocchi che presentano questo post.<\/p>\n<p>Per creare un blocco non dinamico per mostrare un singolo post, dovrai salvare l&#8217;ID del post, il suo URL, l&#8217;URL dell&#8217;immagine in primo piano, la stringa dell&#8217;estratto o qualsiasi cosa ti serva per visualizzare l&#8217;anteprima del post, negli attributi del blocco. E qui sta il problema. Se aggiorni l&#8217;immagine in primo piano del post selezionato, il post con il blocco del post in evidenza non aggiorner\u00e0 automaticamente i suoi attributi. Rimarr\u00e0 salvato con l&#8217;URL della vecchia immagine in primo piano. Solo quando modifichi il post con il blocco e ti assicuri che salvi nuovamente gli attributi con le informazioni aggiornate, il blocco mostrer\u00e0 le informazioni aggiornate corrette.<\/p>\n<p>Quindi, ogni volta che trattiamo contenuti dinamici \u2013 post, categorie o qualsiasi cosa che potrebbe cambiare nel tempo \u2013 abbiamo a che fare con blocchi dinamici. E per i blocchi dinamici dobbiamo usare PHP, codice lato server, per eseguire il rendering del nostro blocco per garantire che recuperi informazioni aggiornate ogni volta che esegue il rendering.<\/p>\n<h2>La natura modificata dei blocchi dinamici nell&#8217;editor<\/h2>\n<p>Quando inizi a sviluppare blocchi dinamici, la natura del tuo blocco all&#8217;interno dell&#8217;editor cambier\u00e0. Anche la funzione del tuo blocco <code>edit<\/code>deve spesso essere dinamica. Ad esempio, per un blocco di post in primo piano dovrai recuperare i post tra cui scegliere, o per un blocco di notizie pi\u00f9 recenti dovrai recuperare un elenco di categorie tra cui l&#8217;utente pu\u00f2 scegliere.<\/p>\n<p>\u00c8 completamente possibile richiedere informazioni da WordPress dall&#8217;interno dell&#8217;editor eseguendo richieste AJAX, utilizzando pacchetti e componenti o eseguendole manualmente con l&#8217; <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API REST di WordPress<\/a>. Indipendentemente dal metodo utilizzato per il blocco, \u00e8 necessario gestire il flusso di input asincrono: il lasso di tempo in attesa di una risposta.<\/p>\n<p>Esistono pi\u00f9 metodi e modelli per creare un blocco dinamico per Gutenberg. Pi\u00f9 comunemente utilizzerai un modello React chiamato <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">componenti di ordine superiore<\/a> in cui WordPress fornisce molte funzioni e componenti per.<\/p>\n<p>Vedremo come recuperare i post e come recuperare le categorie nel nostro blocco nella prossima parte del tutorial. Per ora dobbiamo imparare come rendere PHP il nostro blocco.<\/p>\n<h2>Preparare il nostro blocco per il rendering PHP<\/h2>\n<p>La parte principale che dobbiamo fare in Javascript \u00e8 rendere la <code>save<\/code>funzione del blocco return <code>null<\/code>. Potresti mantenere l&#8217;output originale, ma una volta detto a WordPress di utilizzare PHP per il rendering del blocco, questo verr\u00e0 ignorato. Per chiarire a noi stessi e agli altri che l&#8217;output del blocco non \u00e8 gestito in Javascript, cambieremo la <code>save<\/code>funzione.<\/p>\n<pre><code>registerBlockType('awp\/firstblock', {\n    title: __('My first block', 'awhitepixel'), \n    category: 'common',\n    ...\n    edit: FirstBlockEdit,\n    save:() =&gt; { return null }\n});<\/code><\/pre>\n<p>Non dimenticare che la modifica della funzione di salvataggio comporter\u00e0 la rottura di tutti i blocchi esistenti. Aggiungi nuovamente il blocco. Il blocco dovrebbe funzionare come prima; con le impostazioni e aggiornando gli attributi. Ora semplicemente non produrr\u00e0 nulla nel frontend. Il blocco dei commenti sar\u00e0 l\u00ec, memorizzando tutti gli attributi in JSON, ma non verr\u00e0 visualizzato alcun HTML visibile.<\/p>\n<p>Tuttavia; se qualcuno dei tuoi attributi sta usando la <code>source<\/code>propriet\u00e0, devi cambiarlo. Questo non \u00e8 supportato con i blocchi renderizzati con PHP perch\u00e9 vengono analizzati direttamente dall&#8217;output del salvataggio, su cui ora torniamo <code>null<\/code>. Usiamo source sul secondo <code>RichText<\/code>nel nostro blocco \u2013 per il paragrafo. A questo punto l&#8217;editor non salver\u00e0 affatto ci\u00f2 che hai inserito <code>RichText<\/code>.<\/p>\n<p>Quindi, se stai ancora utilizzando <code>source<\/code>l&#8217; <code>myRichText<\/code>attributo, \u00e8 necessario rimuovere le propriet\u00e0 <code>source<\/code>e <code>selector<\/code>per garantire che gli attributi vengano archiviati e non analizzati dalla <code>save<\/code>funzione:<\/p>\n<pre><code>attributes: {\n    ...\n    myRichText: {\n        type: 'string',\n    },\n    ...<\/code><\/pre>\n<p>Dopo questo il nostro blocco \u00e8 pronto per il rendering in PHP. Possiamo lasciare i file Javascript (non dimenticare di compilarlo) e il resto \u00e8 fatto in PHP.<\/p>\n<h2>Rendering di blocchi in PHP<\/h2>\n<p>Per dire a WordPress di eseguire il rendering dell&#8217;output del blocco in PHP, aggiungiamo un nuovo argomento alla funzione <code>register_block_type()<\/code>. Dobbiamo aggiungere la chiave <code>render_callback<\/code>all&#8217;array con un valore della funzione che dovrebbe eseguire.<\/p>\n<pre><code>add_action('init', function() {\n    register_block_type('awp\/firstblock', [\n        'editor_script' =&gt; 'awp-myfirstblock-js',\n        'render_callback' =&gt; 'awp_myfirstblock_render'\n    ]);\n});<\/code><\/pre>\n<h3>La funzione di rendering PHP<\/h3>\n<p>Definiamo la funzione <code>awp_myfirstblock_render<\/code>pi\u00f9 in basso <code>functions.php<\/code>(o ovunque tu abbia inserito il tuo codice PHP). La nostra funzione otterr\u00e0 due parametri; li chiameremo <code>$attr<\/code>e <code>$content<\/code>.<\/p>\n<pre><code>function awp_myfirstblock_render($attr, $content) {\n    \/\/ return the block's output here\n}<\/code><\/pre>\n<p>Il parametro <code>$attr<\/code>sar\u00e0 un array associativo con tutti gli attributi salvati. Il secondo parametro, <code>$content<\/code>, \u00e8 per i blocchi all&#8217;interno del nostro blocco. Questo \u00e8 rilevante solo per i blocchi che supportano blocchi nidificati, ad esempio Columns o Cover.<\/p>\n<p>La funzione non dovrebbe mai <code>echo<\/code>uscire. Tutto l&#8217;output deve essere restituito, quindi \u00e8 necessario creare una stringa e restituirla alla fine.<\/p>\n<p>Qualcosa di importante da ricordare sugli attributi \u00e8 che solo gli attributi salvati appariranno nel primo parametro della funzione. Se un attributo non \u00e8 mai stato effettivamente modificato e salvato, ad esempio basandosi solo sul suo <code>default<\/code>, l&#8217;attributo non sar\u00e0 affatto incluso per la nostra funzione PHP.<\/p>\n<p>Devi gestire questo problema controllando sempre <code>if (isset($attr['...']))<\/code>o nel modo migliore: definendo gli attributi nella nostra <code>register_block_type()<\/code>chiamata. Possiamo fornire un&#8217;altra chiave, <code>attributes<\/code>e impostarne il valore su un array con tutti gli attributi che desideriamo estrarre dal nostro blocco. La struttura dovrebbe essere identica a quella che hai definito in Javascript, ma invece di un oggetto Javascript ne hai bisogno in un array PHP. Pu\u00f2 essere un po&#8217; complicato ridefinire gli stessi attributi, ma con un editor di codice intelligente dovrebbe essere abbastanza veloce copiarlo, incollarlo e modificarlo su pi\u00f9 righe in PHP.<\/p>\n<h3>Aggiunta degli attributi per la nostra funzione di rendering<\/h3>\n<p>Aggiungiamo il nuovo <code>attributes<\/code>elemento <code>register_block_type()<\/code>e incolliamo esattamente gli stessi attributi che abbiamo definito nel nostro file Javascript:<\/p>\n<pre><code>add_action('init', function() {\n    register_block_type('awp\/firstblock', [\n        'editor_script' =&gt; 'awp-myfirstblock-js',\n        'render_callback' =&gt; 'awp_myfirstblock_render',\n        'attributes' =&gt; [\n            'myRichHeading' =&gt; [\n                'type' =&gt; 'string'\n            ],\n            'myRichText' =&gt; [\n                'type' =&gt; 'string'\n            ],\n            'textAlignment' =&gt; [\n                'type' =&gt; 'string',\n            ],\n            'toggle' =&gt; [\n                'type' =&gt; 'boolean',\n                'default' =&gt; true\n            ],\n            'favoriteAnimal' =&gt; [\n                'type' =&gt; 'string',\n                'default' =&gt; 'dogs'\n            ],\n            'favoriteColor' ==&gt; [\n                'type' =&gt; 'string',\n                'default' =&gt; '#DDDDDD'\n            ],\n            'activateLasers' =&gt; [\n                'type' =&gt; 'boolean',\n                'default' =&gt; false\n            ],\n        ]\n    ]);\n});\n\u00a0\nfunction awp_myfirstblock_render($attr, $content) {\n    return '&lt;div&gt;'.$attr['favoriteColor'].'&lt;\/div&gt;';\n}<\/code><\/pre>\n<p>Tieni presente che se definisci un <code>default<\/code>per tutti gli attributi, il <code>$attr<\/code>parametro della tua funzione dovrebbe sempre contenere tutti gli attributi. Ad esempio, l&#8217;attributo <code>textAlignment<\/code>sopra esister\u00e0 solo <code>$attr<\/code>se \u00e8 stato modificato e dovrai controllare <code>isset($attr['textAlignment'])<\/code>.<\/p>\n<p>Sfortunatamente, al momento, ci sono due cose di cui <strong>non ti occuperai con PHP block render<\/strong>. Uno \u00e8 l&#8217; <code>className<\/code>oggetto di scena, quindi devi creare tu stesso la classe di confezionamento (se lo desideri). L&#8217;altro \u00e8 la <code>support<\/code>propriet\u00e0 per l&#8217;allineamento dei blocchi. Al momento WordPress non supporta questa propriet\u00e0 nei blocchi dinamici. Non otterremo il valore dell&#8217;allineamento del blocco scelto a meno che non lo cambiamo in un attributo e lo gestiamo manualmente in Javascript.<\/p>\n<p>Per quanto riguarda l&#8217;output HTML della funzione, dipende completamente da te!<\/p>\n<h2>Richiesta di rendering PHP dall&#8217;interno dell&#8217;editor<\/h2>\n<p>E&#8217; possibile richiedere il rendering PHP del nostro blocco all&#8217;interno dell&#8217;editor. Questo \u00e8 utile se vuoi essere in grado di visualizzare in anteprima l&#8217;output del blocco nell&#8217;editor. Possiamo farlo con un componente chiamato <code>ServerSideRender<\/code>dal <code>wp.editor<\/code>pacchetto.<\/p>\n<p>Come supporto <code>ServerSideRender<\/code>, devi definire tutti gli attributi che desideri trasmettere. Come minimo devi fornire il nome del blocco al prop <code>block<\/code>, in modo che WordPress sappia quale metodo di rendering cercare. Questo \u00e8 disponibile per te nella <code>props.name<\/code>funzione <code>edit<\/code>. Devi anche fornire tutti gli attributi di cui hai bisogno nel prop <code>attributes<\/code>. Se lo desideri, puoi anche aggiungere variabili personalizzate al di fuori degli attributi qui. Tieni presente che funzioner\u00e0 solo per l&#8217;editor interno e non per il frontend.<\/p>\n<p>Non \u00e8 possibile utilizzare <code>ServerSideRender<\/code>nella funzione del blocco <code>save<\/code>. La tua <code>save<\/code>funzione deve comunque tornare <code>null<\/code>.<\/p>\n<p>Implementiamolo <code>ServerSideRender<\/code>nel nostro blocco per vederlo nella pratica.<\/p>\n<h3>Utilizzo di ServerSideRender per la modalit\u00e0 di anteprima\/modifica del blocco<\/h3>\n<p>Se hai seguito il passaggio precedente in cui abbiamo creato un interruttore della modalit\u00e0 di anteprima\/modifica per il nostro blocco, ora possiamo utilizzare <code>ServerSideRender<\/code>per eseguire il rendering dell&#8217;anteprima del blocco da PHP quando passiamo alla modalit\u00e0 di anteprima.<\/p>\n<p>Per prima cosa dobbiamo ricordarci di destrutturare <code>ServerSideRender<\/code>in alto:<\/p>\n<pre><code>const { ServerSideRender } = wp.editor;<\/code><\/pre>\n<p>Se ricordi dal passaggio precedente abbiamo utilizzato i componenti <code>Disabled<\/code>e\/o <code>Placeholder<\/code>per mantenere l&#8217;anteprima. Il problema con l&#8217;utilizzo <code>Placeholder<\/code>\u00e8 che otteniamo uno stile indesiderato applicato al nostro output. Sostituiamo <code>Placeholder<\/code>con <code>ServerSideRender<\/code>. Puoi scegliere di mantenere il <code>Disabled<\/code>componente, per assicurarti che nessuno dei suoi contenuti sia cliccabile o trascinabile.<\/p>\n<p>Al codice per il rendering del blocco quando l&#8217;attributo <code>editMode<\/code>\u00e8 false, facciamo:<\/p>\n<pre><code>...\n{!this.state.editMode &amp;&amp; \n    &lt;ServerSideRender\n        block={this.props.name}\n        attributes={{ \n            myRichHeading: attributes.myRichHeading, \n            myRichText: attributes.myRichText, \n            textAlignment: attributes.textAlignment, \n            toggle: attributes.toggle, \n            favoriteAnimal: attributes.favoriteAnimal, \n            favoriteColor: attributes.favoriteColor,\n            activateLasers: attributes.activateLasers\n        }}\n    \/&gt;\n}\n...<\/code><\/pre>\n<p>Ora il nostro pulsante personalizzato nella barra degli strumenti render\u00e0 l&#8217;output da PHP quando passiamo alla modalit\u00e0 di anteprima. L&#8217;output dovrebbe essere identico quando si visualizza il post nel frontend. Questa \u00e8 una buona abitudine per garantire che l&#8217;output sia identico sia nell&#8217;editor che nel frontend.<\/p>\n<h2>Esempio: blocco dinamico che mostra un post selezionato<\/h2>\n<p>L&#8217;output nella tua funzione di rendering PHP pu\u00f2 essere qualsiasi cosa e hai pieno accesso a tutte le funzioni di WordPress. Si supponga un blocco in cui un ID post verr\u00e0 salvato in un attributo. Nella <code>render_callback<\/code>funzione PHP puoi interrogare il post dall&#8217;ID e produrre le sue informazioni. Dovrebbe essere abbastanza autoesplicativo come farlo, ma ecco un rapido esempio.<\/p>\n<p><strong>NB<\/strong>: In questo esempio aggiungeremo semplicemente un input di testo all&#8217;editor per inserire manualmente un ID post. Questa non \u00e8 una soluzione molto intuitiva e facile da usare per selezionare un post, ma questo \u00e8 ci\u00f2 che impareremo nel passaggio successivo. Il focus qui \u00e8 sulla parte PHP del rendering del post selezionato.<\/p>\n<p>Aggiungiamo un attributo <code>selectedPostId<\/code>di tipo numero:<\/p>\n<pre><code>attributes: {\n    selectedPostId: {\n        type: 'number'\n    }\n}<\/code><\/pre>\n<p>E da qualche parte all&#8217;interno della funzione del nostro blocco <code>edit<\/code>aggiungiamo un <code>TextControl<\/code>componente. Pu\u00f2 essere dove vuoi: all&#8217;interno del blocco o nell&#8217;Inspector.<\/p>\n<pre><code>&lt;TextControl \n    label={__(\"Type in post ID\", 'awhitepixel')}\n    type=\"number\"\n    value={attributes.selectedPostId}\n    onChange={(newval) =&gt; setAttributes({ selectedPostId: parseInt(newval) })}\n\/&gt;<\/code><\/pre>\n<p>Nota che sto prestando particolare attenzione per assicurarmi che l&#8217;input salvi correttamente l&#8217;attributo come numero convertendolo in intero con <code>parseInt()<\/code>. Anche se impostiamo il tipo prop <code>type<\/code>su <code>number<\/code>per eseguire il rendering di un input numerico, il valore modificato viene comunque interpretato come una stringa. WordPress non salver\u00e0 il tuo attributo se \u00e8 nel formato sbagliato.<\/p>\n<p>Non dimenticare di aggiungere il nuovo attributo al tuo <code>ServerSideRender<\/code>componente se ne hai uno:<\/p>\n<pre><code>&lt;ServerSideRender\n    block={this.props.name}\n    attributes={{ \n        selectedPostId: attributes.selectedPostId,\n        ...<\/code><\/pre>\n<h3>La parte PHP<\/h3>\n<p>Questo avrebbe dovuto occuparsi della parte Javascript. Passiamo a PHP. Per prima cosa dobbiamo aggiungere il nuovo attributo <code>selectedPostId<\/code>all&#8217;array <code>attributes<\/code>in <code>register_block_type()<\/code>:<\/p>\n<pre><code>register_block_type('awp\/firstblock', [\n    'editor_script' =&gt; 'awp-myfirstblock-js',\n    'render_callback' =&gt; 'awp_myfirstblock_render',\n    'attributes' =&gt; [\n        'selectedPostId' =&gt; [\n            'type' =&gt; 'number',\n            'default' =&gt; 0\n        ],\n        ...\n    ]\n]);<\/code><\/pre>\n<p>Nella <code>render_callback<\/code>funzione ora possiamo accedere all&#8217;ID del post con <code>$attr['selectedPostId']<\/code>. Possiamo con ci\u00f2 eseguire un semplice <code>get_post()<\/code>e generare i dati del post; il suo link e titolo:<\/p>\n<pre><code>function awp_myfirstblock_render($attr, $content) {\n    $str = '';\n    if ($attr['selectedPostId'] &gt; 0) {\n        $post = get_post($attr['selectedPostId']);\n        if (!$post) {\n            return $str;\n        }\n        $str = '&lt;div class=\"awp-myfirstblock\"&gt;';\n        $str .= '&lt;a href=\"'. get_the_permalink($post). '\"&gt;';\n        $str .= '&lt;h3&gt;'. get_the_title($post). '&lt;\/h3&gt;';\n        $str .= '&lt;\/a&gt;';\n        $str .= '&lt;\/div&gt;';\n    }\n    return $str;\n}<\/code><\/pre>\n<p>Questo \u00e8 un esempio molto semplice inteso come trampolino di lancio per scrivere codice pi\u00f9 avanzato e personalizzato.<\/p>\n<p>Ora che sappiamo come gestire il rendering dei blocchi dinamici, il passo successivo \u00e8 imparare a rendere pi\u00f9 intuitiva anche la parte dell&#8217;editor. Nel passaggio successivo ci concentreremo su come interrogare i post dall&#8217;editor dei blocchi e fornire all&#8217;utente un modo migliore per selezionare un post.<\/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>Con il contenuto del blocco dinamico come i post recenti o la visualizzazione di un post, \u00e8 necessario eseguire il rendering dell&#8217;output del blocco in PHP. In questo post impareremo come e perch\u00e9.<\/p>\n","protected":false},"author":1,"featured_media":152680,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,939,939,1110,804,804,844,844,865,865],"tags":[1168],"class_list":["post-233696","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-gutenberg-6","category-n-a","category-php-6","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233696","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=233696"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233696\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152680"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}