{"id":233979,"date":"2023-02-26T18:51:00","date_gmt":"2023-02-26T15:51:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233979"},"modified":"2023-02-26T18:51:56","modified_gmt":"2023-02-26T15:51:56","slug":"gutenberg-aggiornamento-conselect-e-withdispatch-in-react-hooks-useselect-e-usedispatch","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/gutenberg-aggiornamento-conselect-e-withdispatch-in-react-hooks-useselect-e-usedispatch\/","title":{"rendered":"Gutenberg: aggiornamento conSelect e withDispatch in React Hooks (useSelect e useDispatch)"},"content":{"rendered":"\n<p>Questo post \u00e8 una rapida introduzione a un modo per mantenere il tuo codice Gutenberg conforme agli standard attuali utilizzando gli hook React. Vedremo come questo \u00e8 vantaggioso, perch\u00e9 dovremmo farlo e come.<\/p>\n<h2>Eh, ganci?<\/h2>\n<p>Presumo che tu abbia gi\u00e0 una certa esperienza di lavoro con blocchi o plug-in Gutenberg un po&#8217; pi\u00f9 complessi che interrogano i post o recuperano e aggiornano i meta dei post. E quindi ho lavorato con <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withSelect)<\/code>e\/o <code>[withDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withDispatch)<\/code>. Si tratta di componenti di ordine superiore in WordPress che ti consentono di accedere ai negozi di WordPress per recuperare o inviare informazioni che sono un po&#8217; al di fuori del &quot;normale&quot; blocco o modifica dei post. Probabilmente sei stato anche costretto a utilizzare <code>compose<\/code>per combinare i tuoi componente con pi\u00f9 componenti di ordine superiore. Se il tuo codice utilizza questi modelli, non preoccuparti: funzionano perfettamente e continueranno a funzionare! Ma con l&#8217;avanzare della tecnologia, possiamo fare di meglio.<\/p>\n<p>All&#8217;inizio del 2019, <a href=\"https:\/\/reactjs.org\/docs\/hooks-intro.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React ha lanciato hook<\/a> (versione 16.8), che ti consentono di utilizzare lo stato senza utilizzare una classe e migliorare altre funzionalit\u00e0 che offrono codice pi\u00f9 leggibile e riutilizzabile. Ad esempio, rimuovendo la necessit\u00e0 di avvolgere il codice in componenti di ordine superiore per accedere ai registri. E <a href=\"https:\/\/make.wordpress.org\/core\/2019\/06\/10\/introducing-usedispatch-and-useselect\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nell&#8217;estate 2019 WordPress \u00e8 seguito<\/a>, lanciando hook personalizzati: <code>[useDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useDispatch)<\/code>e <code>[useSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useSelect)<\/code>.<\/p>\n<p>I vantaggi dei ganci sono molti. L&#8217;esempio pi\u00f9 comune consente di utilizzare lo stato del componente senza dover scrivere una classe Javascript (<code>useState<\/code>). Ma secondo me il vantaggio pi\u00f9 grande \u00e8 la riutilizzabilit\u00e0. Eliminando la necessit\u00e0 di utilizzare modelli come oggetti di scena e componenti di ordine superiore, i componenti possono essere scritti in parti molto pi\u00f9 indipendenti. Un altro vantaggio degli hook \u00e8 che semplifica la lettura e la comprensione del codice!<\/p>\n<p>Passiamo subito ad alcuni esempi e vediamo come implementare <code>useSelect<\/code>e <code>useDispatch<\/code>hook nel nostro codice!<\/p>\n<h2>Implementazione<code>useSelect<\/code><\/h2>\n<p>Iniziamo con <code>withSelect<\/code>e il relativo hook <code>useSelect<\/code>. Questi sono usati per ottenere oggetti di scena derivati \u200b\u200b\u200b\u200bdallo stato da selettori registrati. Esempi comuni sono l&#8217;accesso ai selettori &#8216; <code>core<\/code>&#8216; o &#8216; <code>core\/editor<\/code>&#8216; per eseguire query per i post (<code>getEntityRecords<\/code>), accedere ai meta dei post (<code>getEditedPostAttribute<\/code>) o semplicemente per ottenere il tipo di post corrente o altre informazioni.<\/p>\n<p>A scopo dimostrativo inizier\u00f2 con un semplice esempio. Supponiamo di avere un componente di blocco in cui ho un selettore di post da qualche parte. Per popolare le scelte dei post devo accedere al registro &#8216; <code>core<\/code>&#8216; ed eseguire una <code>GetEntityRecords()<\/code>chiamata.<\/p>\n<h3>Usando alla vecchia maniera<code>withSelect<\/code><\/h3>\n<p>Se voglio interrogare i post in un blocco, dovrei avvolgere il mio componente in <code>withSelect<\/code>. Questo \u00e8 comunemente fatto nella <code>export<\/code>dichiarazione.<\/p>\n<p>Tieni presente che questo esempio di codice non \u00e8 completo come un vero blocco funzionale o plug-in JS, \u00e8 stato eliminato per mostrare solo i concetti fondamentali di <code>withSelect<\/code>. Se stai cercando esempi di codice pratici, ho altri articoli che trattano questo: ad esempio <a href=\"https:\/\/wordpress.mediadoma.com\/it\/crea-un-blocco-gutenberg-personalizzato-parte-10-recupero-di-post-e-componenti-di-ordine-superiore\/\" title=\"come implementare blocchi con un post select\">come implementare blocchi con un post select<\/a> o <a href=\"https:\/\/wordpress.mediadoma.com\/it\/come-aggiungere-post-meta-campi-alla-barra-laterale-del-documento-gutenberg\/\" title=\"come aggiungere post meta all&#039;ispettore\">come aggiungere post meta all&#8217;ispettore<\/a>. Quelli sono scritti con <code>withSelect<\/code>e <code>withDispatch<\/code>, cos\u00ec fanno quelli, e poi torna qui per imparare a trasformarli in hook.<\/p>\n<pre><code>const { withSelect } = wp.data;\n\u00a0\nconst AWP_Example_Plugin = ({ somePosts }) =&gt; {\n    console.log(\"Posts from withSelect = \", somePosts);\n    return(\n        &lt;div&gt;\n            ...\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nexport default withSelect( (select) =&gt; {      \n    return {\n        somePosts: select( 'core' ).getEntityRecords( 'postType', 'page' ),\n    };\n}) (AWP_Example_Plugin );<\/code><\/pre>\n<p>Come puoi vedere in linea <code>#12-16<\/code>avvolgo il mio componente con <code>withSelect<\/code>. All&#8217;interno della funzione withSelect posso accedere al negozio che voglio, e restituisco una query post nel prop &#8221; <code>somePosts<\/code>&#8220;. Questo prop sar\u00e0 quindi disponibile all&#8217;interno del mio <code>AWP_Example_Plugin<\/code>componente (come puoi vedere destrutto <code>somePosts<\/code>dagli oggetti di scena in linea <code>#3<\/code>).<\/p>\n<p>Come accennato in precedenza, questo metodo funziona perfettamente e continuer\u00e0 a farlo. Ma ci sono diversi aspetti negativi di questo. Uno \u00e8 che questo non \u00e8 molto facile da capire. Certo, questo era un esempio molto semplice. A prima vista al componente stesso non sei sicuro da dove <code>somePosts<\/code>provenga l&#8217;elica o cosa sia. Dovresti sapere per cercare l&#8217;istruzione di esportazione e vedere se ci sono dei wrapper. Sembra anche un po&#8217; sconnesso. Fai una buona parte del lavoro importante al di fuori del tuo componente, per qualcosa che desideri effettivamente disponibile all&#8217;interno del tuo componente.<\/p>\n<p>Facciamolo meglio usando i ganci.<\/p>\n<h3>Conversione in<code>useSelect<\/code><\/h3>\n<p>Convertire un <code>withSelect<\/code>in <code>useSelect<\/code>\u00e8 semplicissimo. Il primo passo \u00e8 che possiamo definire la variabile <code>somePosts<\/code>all&#8217;interno del nostro componente, piuttosto che all&#8217;esterno <code>export<\/code>dall&#8217;istruzione. Il secondo passaggio \u00e8 spostare l&#8217;intera funzione che avevamo <code>withSelect<\/code>in <code>useSelect<\/code>. E questo \u00e8 tutto.<\/p>\n<pre><code>const { useSelect } = wp.data;\n\u00a0\nconst AWP_Example_Plugin =() =&gt; {\n    const { somePosts } = useSelect( (select) =&gt; {        \n        return {\n            somePosts: select( 'core' ).getEntityRecords( 'postType', 'page' ),\n        };\n    } );\n    console.log(\"Posts from useSelect = \", somePosts);\n    return(\n        &lt;div&gt;\n            ...\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Il codice sopra fornisce lo stesso identico risultato di quello con <code>withSelect<\/code>. La differenza \u00e8 che ora il codice \u00e8 molto pi\u00f9 comprensibile! Ora possiamo vedere molto facilmente che la variabile <code>somePosts<\/code>sta memorizzando il risultato di una query post, proprio all&#8217;interno del nostro componente.<\/p>\n<p><strong>Nota importante<\/strong>: <code>useSelect<\/code>accetta un secondo parametro; una serie di dipendenze. Le dipendenze sono variabili che assicurano l&#8217;esecuzione solo <code>useSelect<\/code>quando una delle dipendenze (valori di variabili) \u00e8 cambiata. Questo bit \u00e8 pi\u00f9 importante <code>useDispatch<\/code>qui che qui, quindi lo spiegher\u00f2 ulteriormente nella <code>useDispatch<\/code>sezione seguente.<\/p>\n<h2>Implementazione<code>useDispatch<\/code><\/h2>\n<p>Ora diamo un&#8217;occhiata a <code>withDispatch<\/code>e al suo hook corrispondente <code>useDispatch<\/code>. Sono usati per inviare oggetti di scena ai registri. Ad esempio, dicendo a Gutenberg di aggiornare un meta post tramite &#8216; <code>core\/editor<\/code>&#8216;.<\/p>\n<p>Ancora una volta, a scopo dimostrativo, i miei esempi di codice non sono parti di codice funzionali complete: illustrano solo le parti relative a questi modelli. In questo esempio presumo di avere un campo di testo che mostra un meta post e desidero aggiornare il valore meta post in caso di modifica.<\/p>\n<h3>Usando alla vecchia maniera<code>withDispatch<\/code><\/h3>\n<p>Poich\u00e9 <code>withDispatch<\/code>\u00e8 un componente di ordine superiore, avrei bisogno di avvolgere il mio componente all&#8217;interno di questo. Questo \u00e8 comunemente fatto nella <code>export<\/code>dichiarazione. Per creare il campo di testo per il nostro meta lavoro noi<\/p>\n<p>Per esempio:<\/p>\n<pre><code>const { withDispatch } = wp.data;\nconst { __ } = wp.i18n;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\nconst AWP_Example_Plugin = ({ setPostMeta }) =&gt; { \n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'withDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value=\"\"\n                    onChange={ (value) =&gt; setPostMeta( { example_post_meta: value }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default withDispatch( (dispatch) =&gt; {\n    return {\n        setPostMeta( newMeta) {\n            dispatch( 'core\/editor' ).editPost( { meta: newMeta } );\n        }\n    };\n} )( AWP_Example_Plugin );<\/code><\/pre>\n<p>A riga <code>#20-26<\/code>avvolgiamo il componente all&#8217;interno <code>withDispatch<\/code>, in cui restituiamo una funzione &quot; <code>setPostMeta<\/code>&quot; che invia post meta (per aggiornarlo). At line <code>#6<\/code>destrutturiamo il prop in modo da poterlo utilizzare nell&#8217;evento del campo di testo <code>onChange<\/code>at line <code>#13<\/code>. (Si noti che l&#8217;esempio sopra non sarebbe funzionale perch\u00e9 impostiamo il valore del campo di testo su una stringa vuota. Questo \u00e8 solo per dimostrare come utilizzeremmo dispatch).<\/p>\n<p>Ancora una volta possiamo vedere che il codice non \u00e8 cos\u00ec semplice da capire. Dovresti sapere cercare l&#8217;involucro per capire qual <code>setPostMeta<\/code>\u00e8 o da dove viene l&#8217;elica &quot; &quot;. Facciamolo meglio usando i ganci!<\/p>\n<h3>Conversione in<code>useDispatch<\/code><\/h3>\n<p>Cambiare <code>withDispatch<\/code>in <code>useDispatch<\/code>non \u00e8 cos\u00ec semplice come convertirsi <code>withSelect<\/code>in <code>useSelect<\/code>. Comunque \u00e8 ancora abbastanza facile. Ci sono due cose da tenere a mente. Uno \u00e8 che <code>useDispatch<\/code>prende il nome di un negozio come primo parametro. Quindi accediamo al negozio e chiamiamo le sue funzioni disponibili quando lo utilizziamo (ad esempio in un <code>onChange<\/code>evento di un campo di testo). In secondo luogo, l&#8217;array di dipendenze al <code>useDispatch<\/code>secondo parametro di &#8216;s \u00e8 pi\u00f9 importante di <code>useSelect<\/code>. Puoi rischiare che il tuo codice finisca in un ciclo infinito se non gestisci correttamente le dipendenze. Solo quando le variabili di dipendenza vengono modificate, lo script verr\u00e0 eseguito nuovamente <code>useDispatch<\/code>.<\/p>\n<p>Per esempio:<\/p>\n<pre><code>const { useDispatch } = wp.data;\nconst { __ } = wp.i18n;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\nconst AWP_Example_Plugin =() =&gt; {  \n    const tmpMetaValue = \"\";\n    const { editPost } = useDispatch( 'core\/editor', [ tmpMetaValue ] );\n\u00a0\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'useDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ tmpMetaValue }\n                    onChange={ (value) =&gt; editPost( { meta: { example_post_meta: value } }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>In linea <code>#8<\/code>destrutturiamo ci\u00f2 di cui abbiamo bisogno dal negozio&#8217; <code>core\/editor<\/code>&#8216;. Siamo interessati solo alla <code>editPost<\/code>funzione che possiamo utilizzare per aggiornare il meta dei post. Come secondo parametro <code>useDispatch<\/code>forniamo le dipendenze. Come per un esempio di aggiornamento del meta meta, usare il valore del meta post (usando <code>useSelect<\/code>) sarebbe perfetto come dipendenza. In questo esempio l&#8217;ho appena impostato come variabile fittizia. Guarda pi\u00f9 in basso per un esempio pi\u00f9 completo e realistico. E poi alla riga dell&#8217;evento <code>#16<\/code>del campo di testo <code>onChange<\/code>, chiamiamo <code>editPost<\/code>per aggiornare il meta. Nota la differenza in questa riga con l&#8217;utilizzo <code>withDispatch<\/code>sopra! Poich\u00e9 utilizziamo <code>editPost<\/code>direttamente invece di restituire una funzione per aggiornare post meta per noi (<code>setPostMeta<\/code>), dobbiamo fornire un oggetto con<code>meta<\/code>come chiave e quindi un oggetto con il meta meta che vogliamo aggiornare. Abbiamo un po&#8217; diviso il <code>withDispatch<\/code>codice in pezzi.<\/p>\n<p>Tuttavia, l&#8217;utilizzo <code>useDispatch<\/code>rende il codice molto pi\u00f9 leggibile e comprensibile. Niente pi\u00f9 codice aggiunto al di fuori del nostro componente che dobbiamo usare all&#8217;interno.<\/p>\n<h2>Un esempio pi\u00f9 completo ed eliminando la necessit\u00e0 di<code>compose<\/code><\/h2>\n<p>\u00c8 probabile che se stai usando <code>withDispatch<\/code>, avrai bisogno <code>withSelect<\/code>anche di quel componente. Negli esempi per la conversione in <code>useDispatch<\/code>sopra stiamo aggiornando un valore meta post. Ma affinch\u00e9 il campo di testo funzioni correttamente (e mostri anche il valore corrente), dovremmo anche recuperare il meta valore post.<\/p>\n<p>Se devi utilizzare pi\u00f9 componenti di ordine superiore avvolti attorno al tuo componente, molto probabilmente utilizzerai un&#8217;altra funzione di Gutenberg; <code>[compose](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-compose\/)<\/code>. \u00c8 una funzione utile per combinare pi\u00f9 componenti di ordine superiore in un componente di ordine superiore su cui puoi avvolgere il tuo componente.<\/p>\n<p>Diamo un&#8217;occhiata a un esempio pi\u00f9 completo di un componente che recupera un meta valore di post in un campo di testo e si aggiorna quando il suo valore viene modificato. Iniziamo con il modo in cui dovremmo farlo usando <code>withSelect<\/code>e <code>withDispatch<\/code>(e quindi anche <code>compose<\/code>).<\/p>\n<h3>Usando <code>withSelect<\/code>, <code>withDispatch<\/code>e<code>compose<\/code><\/h3>\n<pre><code>const { __ } = wp.i18n;\nconst { compose } = wp.compose;\nconst { withSelect, withDispatch } = wp.data;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\n\u00a0\nconst AWP_Example_Plugin = ({ postMeta, setPostMeta }) =&gt; {\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'withSelect and withDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ postMeta.example_post_meta }\n                    onChange={ (value) =&gt; setPostMeta( { example_post_meta: value }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default compose( [\n    withSelect( (select) =&gt; {     \n        return {\n            postMeta: select( 'core\/editor' ).getEditedPostAttribute( 'meta' ),\n        };\n    } ),\n    withDispatch( (dispatch) =&gt; {\n        return {\n            setPostMeta( newMeta) {\n                dispatch( 'core\/editor' ).editPost( { meta: newMeta } );\n            }\n        };\n    }) ] )( AWP_Example_Plugin );<\/code><\/pre>\n<p>In linea <code>#21-34<\/code>li componiamo <code>withSelect<\/code>e <code>withDispatch<\/code>li avvolgiamo attorno al nostro componente. <code>postMeta<\/code>from <code>withSelect<\/code>e <code>setPostMeta<\/code>from <code>withDispatch<\/code>sono ora disponibili nel nostro componente come oggetti di scena. Li destrutturiamo in linea <code>#7<\/code>e li usiamo in <code>#13<\/code>e <code>#14<\/code>.<\/p>\n<p>Come puoi vedere, il codice necessario al di fuori del nostro componente \u00e8 pi\u00f9 lungo del componente stesso. Non so voi, ma per me sembra un po&#8217; sconnesso. Gli sviluppatori possono iniziare a leggere questo codice dall&#8217;alto, senza vedere la parte inferiore, e iniziare a chiedersi da dove <code>postMeta<\/code>e da dove <code>setPostMeta<\/code>provengono: sembrano essere magicamente disponibili. Per me questo \u00e8 molto poco intuitivo.<\/p>\n<p>Diamo un&#8217;occhiata a come convertire l&#8217;esempio sopra in hook.<\/p>\n<h3>Usando <code>useSelect<\/code>e<code>useDispatch<\/code><\/h3>\n<pre><code>const { __ } = wp.i18n;\nconst { useSelect, useDispatch } = wp.data;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\n\u00a0\nconst AWP_Example_Plugin = () =&gt; {\n    const { postMeta } = useSelect( (select) =&gt; {     \n        return {\n            postMeta: select( 'core\/editor' ).getEditedPostAttribute( 'meta' ),\n        };\n    } );\n    const { editPost } = useDispatch( 'core\/editor', [ postMeta.example_post_meta ] );\n\u00a0\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'useSelect and useDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ postMeta.example_post_meta }\n                    onChange={ (value) =&gt; editPost( { meta: { example_post_meta: value } }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Quanto \u00e8 bello e leggibile?! Possiamo vedere immediatamente nel nostro componente <code>postMeta<\/code>da dove viene recuperato e come accediamo a <code>editPost<\/code>. Il nostro componente \u00e8 diventato anche molto pi\u00f9 facile da riutilizzare.<\/p>\n<p>Nota che in <code>useDispatch<\/code>linea <code>#12<\/code>aggiungiamo il postmeta che stiamo aggiornando come dipendenza (<code>postMeta.example_post_meta<\/code>). Se dovessi mantenere aggiornate pi\u00f9 meta variabili post in questo componente, dovresti aggiungerle ciascuna come dipendenza per assicurarti che la spedizione venga eseguita (salvando effettivamente la meta meta) quando il valore di una di esse cambia.<\/p>\n<p>Spero che questo sia stato informativo e utile per qualcuno l\u00e0 fuori. Non ho ancora familiarit\u00e0 con i ganci, ma vedendo i vantaggi di usarli non torner\u00f2 indietro!<\/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>Un&#8217;introduzione all&#8217;uso degli hook React useSelect e useDispatch. Vedremo come questo \u00e8 vantaggioso, perch\u00e9 dovremmo farlo ed esattamente come.<\/p>\n","protected":false},"author":1,"featured_media":151604,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[939,939,1110,814,814,844,844,865,865],"tags":[1168],"class_list":["post-233979","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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\/233979","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=233979"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233979\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/151604"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}