{"id":233582,"date":"2023-02-17T10:22:00","date_gmt":"2023-02-17T07:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233582"},"modified":"2022-11-11T00:28:27","modified_gmt":"2022-11-10T21:28:27","slug":"crea-un-blocco-gutenberg-personalizzato-parte-7-crea-i-tuoi-componenti-personalizzati","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/crea-un-blocco-gutenberg-personalizzato-parte-7-crea-i-tuoi-componenti-personalizzati\/","title":{"rendered":"Crea un blocco Gutenberg personalizzato &#8211; Parte 7: crea i tuoi componenti personalizzati"},"content":{"rendered":"\n<p>Finora in questa serie di tutorial abbiamo scritto tutto il codice all&#8217;interno <code>registerBlockType()<\/code>della <code>edit<\/code>funzione di. \u00c8 del tutto possibile, e spesso consigliato, assegnare invece la modifica a un componente separato. In questo modo possiamo utilizzare funzionalit\u00e0 come lo stato dei componenti e i metodi del ciclo di vita. \u00c8 anche molto pi\u00f9 pulito, leggibile e fornisce codice riutilizzabile!<\/p>\n<p>Se non hai familiarit\u00e0 con la creazione di componenti React o quali sono i metodi di stato e ciclo di vita, ti consiglio di leggere prima <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la guida ufficiale di React su questo argomento<\/a>.<\/p>\n<h2>Definizione di un componente di classe per<code>edit<\/code><\/h2>\n<p>\u00c8 possibile definire un componente come una funzione o una classe. Con un componente di classe puoi utilizzare funzionalit\u00e0 come ad esempio i metodi dello stato e del ciclo di vita. Tuttavia, nelle versioni pi\u00f9 recenti di React (16+) \u00e8 possibile utilizzare gli hook React per simulare lo stato e i metodi del ciclo di vita all&#8217;interno dei componenti della funzione. Ma in questo tutorial ci concentreremo sulla creazione di un componente di classe. Ci\u00f2 che abbiamo creato finora in questa serie, &quot;inline&quot; in <code>registerBlockType()<\/code>for <code>edit<\/code>e <code>save<\/code>, sono componenti di funzioni.<\/p>\n<p>Per definire un componente di classe estendiamo WordPress&#8217; <code>Component<\/code>(nel <code>wp.element<\/code>pacchetto), esattamente come estenderesti un componente di classe a <code>React.Component<\/code>.<\/p>\n<p>Tieni presente che il tuo componente di classe deve includere la funzione <code>render()<\/code>. E a causa di come funziona Javascript, la tua classe deve essere definita prima della tua <code>registerBlockType()<\/code>chiamata (scrivi prima il tuo componente di classe nel file e tienilo <code>registerBlockType()<\/code>dopo di esso. Pi\u00f9 avanti in questo post impareremo come separare i componenti in file separati, esportare e includere loro).<\/p>\n<p>In breve, cos\u00ec:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { Component } = wp.element;\n\u00a0\nclass FirstBlockEdit extends Component {\n    render() {\n        const { attributes, setAttributes } = this.props;\n        return ...\n    }\n}\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    edit: FirstBlockEdit,\n    save: (props) =&gt; { \n        return ...\n    }\n});<\/code><\/pre>\n<p>Gli oggetti di scena da <code>edit<\/code>vengono applicati automaticamente al nostro componente. Non dimenticare che un componente di classe \u00e8 necessario fare riferimento agli oggetti di scena con <code>this.props<\/code>. \u00c8 comune nel core Gutenberg di WordPress utilizzare componenti separati per le <code>edit<\/code>funzioni poich\u00e9 molto spesso contengono molto pi\u00f9 codice. La <code>save<\/code>funzione pu\u00f2 spesso essere lasciata a <code>registerBlockType()<\/code>meno che non contenga anche molto codice.<\/p>\n<p>In questo modo ora puoi scrivere il tuo componente proprio come faresti con React. \u00c8 possibile aggiungere funzioni, costruttori, metodi dello stato e del ciclo di vita.<\/p>\n<p>Questo \u00e8 il codice che siamo finiti nell&#8217;ultimo passaggio, convertito in un componente di classe:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { Component } = wp.element;\nconst { RichText, InspectorControls, BlockControls, AlignmentToolbar } = wp.blockEditor;\nconst { ToggleControl, PanelBody, PanelRow, CheckboxControl, SelectControl, ColorPicker, Toolbar, IconButton } = wp.components;\n\u00a0\nclass FirstBlockEdit extends Component {\n\u00a0\n    render() {\n        const { attributes, setAttributes } = this.props;\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n\u00a0\n        return (&lt;div className={alignmentClass}&gt;\n                &lt;InspectorControls&gt;\n                    &lt;PanelBody\n                        title=\"Most awesome settings ever\"\n                        initialOpen={true}\n                    &gt;\n                        &lt;PanelRow&gt;\n                            &lt;ToggleControl\n                                label=\"Toggle me\"\n                                checked={attributes.toggle}\n                                onChange={(newval) =&gt; setAttributes({ toggle: newval })}\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                        &lt;PanelRow&gt;\n                            &lt;SelectControl\n                                label=\"What's your favorite animal?\"\n                                value={attributes.favoriteAnimal}\n                                options={[\n                                    {label: \"Dogs\", value: 'dogs'},\n                                    {label: \"Cats\", value: 'cats'},\n                                    {label: \"Something else\", value: 'weird_one'},\n                                ]}\n                                onChange={(newval) =&gt; setAttributes({ favoriteAnimal: newval })}\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                        &lt;PanelRow&gt;\n                            &lt;ColorPicker\n                                color={attributes.favoriteColor}\n                                onChangeComplete={(newval) =&gt; setAttributes({ favoriteColor: newval.hex })}\n                                disableAlpha\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                        &lt;PanelRow&gt;\n                            &lt;CheckboxControl\n                                label=\"Activate lasers?\"\n                                checked={attributes.activateLasers}\n                                onChange={(newval) =&gt; setAttributes({ activateLasers: newval })}\n                            \/&gt;\n                        &lt;\/PanelRow&gt;\n                    &lt;\/PanelBody&gt;\n                &lt;\/InspectorControls&gt;\n                &lt;BlockControls&gt;\n                    &lt;AlignmentToolbar\n                        value={attributes.textAlignment}\n                        onChange={(newalign) =&gt; setAttributes({ textAlignment: newalign })}\n                    \/&gt;\n                    &lt;Toolbar&gt;\n                        &lt;IconButton\n                            label=\"My very own custom button\"\n                            icon=\"edit\"\n                            className=\"my-custom-button\"\n                            onClick={() =&gt; console.log('pressed button')}\n                        \/&gt;\n                    &lt;\/Toolbar&gt;\n                &lt;\/BlockControls&gt;\n                &lt;RichText \n                    tagName=\"h2\"\n                    placeholder=\"Write your heading here\"\n                    value={attributes.myRichHeading}\n                    onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n                \/&gt;\n                &lt;RichText\n                    tagName=\"p\"\n                    placeholder=\"Write your paragraph here\"\n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt;\n            &lt;\/div&gt;\n        );\n    }\n}\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    icon: 'smiley',\n    description: 'Learning in progress',\n    keywords: ['example', 'test'],\n    attributes: {\n        myRichHeading: {\n            type: 'string',\n        },\n        myRichText: {\n            type: 'string',\n            source: 'html',\n            selector: 'p'\n        },\n        textAlignment: {\n            type: 'string',\n        },\n        toggle: {\n            type: 'boolean',\n            default: true\n        },\n        favoriteAnimal: {\n            type: 'string',\n            default: 'dogs'\n        },\n        favoriteColor: {\n            type: 'string',\n            default: '#DDDDDD'\n        },\n        activateLasers: {\n            type: 'boolean',\n            default: false\n        },\n    },\n    supports: {\n        align: ['wide', 'full']\n    },\n    edit: FirstBlockEdit,\n    save: (props) =&gt; { \n        const { attributes } = props;\n\u00a0\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n\u00a0\n        return (&lt;div className={alignmentClass}&gt;\n                &lt;RichText.Content \n                    tagName=\"h2\"\n                    value={attributes.myRichHeading}\n                \/&gt;\n                &lt;RichText.Content \n                    tagName=\"p\"\n                    value={attributes.myRichText}\n                \/&gt;\n                {attributes.activateLasers &amp;&amp; \n                    &lt;div className=\"lasers\"&gt;Lasers activated&lt;\/div&gt;\n                }\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p>Se hai destrutturato <code>attributes<\/code>e <code>setAttributes<\/code>dagli oggetti di scena come abbiamo fatto noi, tutto ci\u00f2 che devi cambiare quando ti muovi in \u200b\u200bun componente di classe separato \u00e8 cambiare una riga; <code>#9<\/code>da <code>props<\/code>a <code>this.props<\/code>. Tutto il codice funzioner\u00e0 come prima senza correggere nient&#8217;altro. Questo \u00e8 il bello della destrutturazione. Se non lo destrutturassi e ti riferissi ad esempio <code>props.attributes<\/code>direttamente, avresti bisogno di aggiungere <code>this.<\/code>davanti a tutti i riferimenti individuali a <code>attributes<\/code>e <code>setAttributes<\/code>ovunque.<\/p>\n<p>Iniziamo a fare le cose che ora possiamo fare con un componente di classe!<\/p>\n<h2>Definizione di funzioni e<code>this<\/code><\/h2>\n<p>Certo, s\u00ec, puoi definire le funzioni dall&#8217;interno del <code>edit<\/code>componente della funzione, prima di chiamare <code>return<\/code>. Ma personalmente ho sempre preferito separare la funzionalit\u00e0 dalla logica. Trovo meglio separare le funzioni per la logica e altri scopi al di fuori della funzione responsabile del rendering dell&#8217;output. Alcune persone preferiscono anche chiamare funzioni negli eventi, invece di eseguirle in linea come abbiamo fatto finora (facendo <code>setAttributes()<\/code>ad <code>onChange<\/code>esempio).<\/p>\n<p>A partire da ora il nostro codice ha due cose che potrebbero essere utili per passare alle funzioni; <code>InspectorControls<\/code>e <code>BlockControls<\/code>. Questo accorcer\u00e0 <code>return<\/code>notevolmente il nostro codice e render\u00e0 il nostro codice pi\u00f9 facile da leggere.<\/p>\n<p>Definiamo due funzioni che restituiscono l&#8217;intero <code>InspectorControls<\/code>blocco e l&#8217;intero <code>BlockControls<\/code>blocco. Usando le funzioni freccia (<code>functionName =() =&gt; { ... }<\/code>) abbiamo pieno accesso <code>this<\/code>per ottenere oggetti di scena. Se non hai eseguito l&#8217;ultima parte del passaggio 1, l&#8217;impostazione di Babel con le sintassi pi\u00f9 recenti, otterrai errori di compilazione. Dovresti ricorrere alla creazione di un costruttore e all&#8217;associazione <code>this<\/code>per ogni funzione. Puoi leggere di pi\u00f9 sulla gestione <code>this<\/code>all&#8217;inizio della <a href=\"https:\/\/reactjs.org\/docs\/faq-functions.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pagina delle FAQ di React<\/a>.<\/p>\n<p>Ricorda anche che, poich\u00e9 ora siamo in una classe, devi chiamare tutte le sue funzioni con <code>this.<\/code>davanti.<\/p>\n<pre><code>class FirstBlockEdit extends Component {\n\u00a0\n    getInspectorControls =() =&gt; {\n        const { attributes, setAttributes } = this.props;\n\u00a0\n        return (&lt;InspectorControls&gt;\n                ...\n            &lt;\/InspectorControls&gt;\n        );\n    }\n\u00a0\n    getBlockControls = () =&gt; {\n        const { attributes, setAttributes } = this.props;\n\u00a0\n        return (&lt;BlockControls&gt;\n                ...\n            &lt;\/BlockControls&gt;\n        );\n    }\n\u00a0\n    render() {\n        const { attributes, setAttributes } = this.props;\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n\u00a0\n        return ([\n            this.getInspectorControls(),\n            this.getBlockControls(),\n            &lt;div className={alignmentClass}&gt;\n                &lt;RichText \n                    tagName=\"h2\"\n                    placeholder=\"Write your heading here\"\n                    value={attributes.myRichHeading}\n                    onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n                \/&gt;\n                &lt;RichText\n                    tagName=\"p\"\n                    placeholder=\"Write your paragraph here\"\n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt;\n            &lt;\/div&gt;\n        ]);\n    }\n}<\/code><\/pre>\n<p>Nota che ho escluso il contenuto effettivo di <code>InspectorControls<\/code>e <code>BlockControls<\/code>per mantenere il codice pi\u00f9 breve. Niente nel loro codice deve cambiare.<\/p>\n<p>Stiamo anche utilizzando il fatto che l&#8217; <code>return<\/code>istruzione pu\u00f2 anche restituire un array. Tutto nell&#8217;array verr\u00e0 visualizzato come al solito nell&#8217;ordine in cui si trova. Questo rende facile per noi chiamare le funzioni direttamente all&#8217;interno <code>return<\/code>dell&#8217;istruzione.<\/p>\n<p>Ovviamente puoi anche definire metodi del ciclo di vita, come <code>componentDidMount()<\/code>. Non c&#8217;\u00e8 differenza nel fare questi nei componenti Gutenberg rispetto a React.<\/p>\n<h2>Costruttore e stato di utilizzo<\/h2>\n<p>Proviamo a implementare lo stato nel nostro componente. Tieni presente che lo stato \u00e8 solo qualcosa memorizzato temporaneamente all&#8217;interno del nostro componente di classe e non viene salvato da nessuna parte, ad esempio negli attributi. \u00c8 solo per mantenere il controllo \u2013 beh \u2013 dello stato del tuo componente. Gli usi comuni dello stato sono l&#8217;utilizzo dello stato come flag di stato durante l&#8217;attesa del ritorno di una chiamata asincrona, il mantenimento del punteggio di qualcosa di temporaneo prima di salvarlo in un attributo o l&#8217;implementazione di &quot;modalit\u00e0 di anteprima\/modifica&quot; del blocco.<\/p>\n<p>Ti riferisci allo stato e allo stato di aggiornamento proprio come in React; con <code>this.state<\/code>e <code>setState()<\/code>. Normalmente inizializzeresti lo stato nel costruttore. E per quanto riguarda la definizione di un costruttore \u2013 \u00e8 esattamente come in React \u2013 non dimenticare di passare <code>props<\/code>e fare <code>super(props)<\/code>altrettanto. In breve:<\/p>\n<pre><code>class FirstBlockEdit extends Component {\n    constructor(props) {\n        super(props);\n\u00a0\n        this.state = {\n            example: 1\n        }\n    }\n\u00a0\n    render() {\n        this.setState({ example: 2 });\n        console.log(this.state.example);\n        ...<\/code><\/pre>\n<h3>Commutatore di modifica\/anteprima in modalit\u00e0 blocco<\/h3>\n<p>Usiamo ci\u00f2 che abbiamo imparato nel passaggio precedente in Barre degli strumenti per creare un &quot;selettore di modalit\u00e0&quot; per il nostro blocco. Implementiamo una barra degli strumenti con un pulsante che alterna lo stato tra anteprima e modalit\u00e0 di modifica. In modalit\u00e0 di modifica il blocco ottiene i due componenti RichText come al solito. Ma quando si passa alla modalit\u00e0 di anteprima, abbiamo disabilitato la modifica e il rendering dell&#8217;output del blocco.<\/p>\n<p>Per prima cosa creiamo un costruttore e impostiamo lo stato con una propriet\u00e0 booleana; <code>editMode<\/code>che inizia come <code>true<\/code>. \u00c8 <code>super(props)<\/code>necessario quando si definisce un costruttore in un componente React basato sulla classe.<\/p>\n<pre><code>class FirstBlockEdit extends Component {\n    constructor(props) {\n        super(props);\n        this.state = {\n            editMode: true\n        }\n    }\n    ...<\/code><\/pre>\n<p>Nella nostra funzione per l&#8217;output delle barre degli strumenti cambiamo il pulsante personalizzato che abbiamo creato in precedenza (che solo <code>console.log<\/code>qualcosa quando si fa clic su di esso). Sul suo <code>onClick<\/code>supporto chiamiamo <code>setState()<\/code>e neghiamo il <code>editMode<\/code>valore booleano corrente. Per rendere pi\u00f9 facile la comprensione per l&#8217;utente, passiamo anche all&#8217;icona e all&#8217;etichetta del pulsante. Ad esempio, quando la modalit\u00e0 di anteprima \u00e8 attiva, il pulsante mostra l&#8217;etichetta &#8220;Modifica&quot; e un&#8217;icona a forma di matita che \u00e8 comunemente accettabile come modifica.<\/p>\n<pre><code>getBlockControls = () =&gt; {\n    const { attributes, setAttributes } = this.props;\n    return (&lt;BlockControls&gt;\n            &lt;AlignmentToolbar\n                value={attributes.textAlignment}\n                onChange={(newalign) =&gt; setAttributes({ textAlignment: newalign })}\n            \/&gt;\n            &lt;Toolbar&gt;\n                &lt;IconButton\n                    label={ this.state.editMode? \"Preview\": \"Edit\" }\n                    icon={ this.state.editMode? \"format-image\": \"edit\" }\n                    onClick={() =&gt; this.setState({ editMode: !this.state.editMode })}\n                \/&gt;\n            &lt;\/Toolbar&gt;\n        &lt;\/BlockControls&gt;\n    );\n}<\/code><\/pre>\n<p>E infine all&#8217;interno del metodo di rendering principale per il nostro blocco, possiamo fare quello che vogliamo. Questa parte dipende davvero da te: fai lo stesso che abbiamo fatto con l&#8217;etichetta e l&#8217;icona sul pulsante in alto. Aggiungiamo due blocchi di output, uno if <code>this.state.editMode<\/code>is <code>true<\/code>(che dovrebbero essere i soliti <code>RichText<\/code>componenti modificabili) e un altro se \u00e8 <code>false<\/code>.<\/p>\n<p>Ad esempio sto usando due componenti di WordPress da <code>wp.components<\/code>; <code>Placeholder<\/code>e <code>Disabled<\/code>per la modalit\u00e0 di anteprima. Il <code>Placeholder<\/code>componente mette il tuo blocco in una bella casella grigia che rende davvero chiaro che non \u00e8 modificabile. Tieni presente che viene fornito in allegato con lo stile, quindi se desideri un&#8217;anteprima perfetta, questo potrebbe non essere adatto a te. E avvolgo anche tutto all&#8217;interno di un <code>Disabled<\/code>componente che rende tutto ci\u00f2 che contiene non modificabile, non selezionabile e non trascinabile. Questa \u00e8 la nostra nuova <code>render()<\/code>funzione nel nostro componente:<\/p>\n<pre><code>const { ..., Fragment } = wp.element;\nconst {... Placeholder, Disabled } = wp.components;  \/\/ Don't forget to add these at the top\n\u00a0\n...\nrender() {\n    const { attributes, setAttributes } = this.props;\n    const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n\u00a0\n    return ([\n        this.getInspectorControls(),\n        this.getBlockControls(),\n        &lt;div className={alignmentClass}&gt;\n            {this.state.editMode &amp;&amp; \n                &lt;Fragment&gt;\n                    &lt;RichText \n                        tagName=\"h2\"\n                        placeholder=\"Write your heading here\"\n                        value={attributes.myRichHeading}\n                        onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n                    \/&gt;\n                    &lt;RichText\n                        tagName=\"p\"\n                        placeholder=\"Write your paragraph here\"\n                        value={attributes.myRichText}\n                        onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                    \/&gt;\n                &lt;\/Fragment&gt;\n            }\n            {!this.state.editMode &amp;&amp; \n                &lt;Placeholder isColumnLayout={true}&gt;\n                    &lt;Disabled&gt;\n                        &lt;RichText.Content \n                            tagName=\"h2\"\n                            value={attributes.myRichHeading}\n                        \/&gt;\n                        &lt;RichText.Content\n                            tagName=\"p\"\n                            value={attributes.myRichText}\n                        \/&gt;\n                    &lt;\/Disabled&gt;\n                &lt;\/Placeholder&gt;\n            }\n        &lt;\/div&gt;\n    ]);\n}\n...<\/code><\/pre>\n<p>Sto anche usando un componente <code>Fragment<\/code>( <code>wp.element<\/code>pacchetto) che \u00e8 lo stesso di <code>React.Fragment<\/code>. Se non hai familiarit\u00e0 con esso, avvolgiamo l&#8217;output al suo interno quando non vogliamo aggiungere ulteriori wrapper HTML non necessari. In React tutto deve avere un nodo radice. Quando la modalit\u00e0 di modifica \u00e8 attiva (line <code>#13<\/code>) emettiamo due <code>RichText<\/code>componenti uno dopo l&#8217;altro, quindi abbiamo bisogno di un rootnode attorno a loro.<\/p>\n<p>Quando la modalit\u00e0 di anteprima \u00e8 attiva (line <code>#29<\/code>) emettiamo i valori dei due <code>RichText<\/code>componenti. Come facciamo in <code>save<\/code>, usiamo <code>RichText.Content<\/code>per restituire i loro valori invece del piccolo editor.<\/p>\n<p>Il componente <code>Placeholder<\/code>\u00e8 disponibile in stile flex e di default con la riga in direzione flex. Fornire <code>true<\/code>l&#8217;elica <code>isColumnLayout<\/code>lo cambia in colonna in direzione flessibile (quindi tutto si impila). Ma come accennato in precedenza, potresti voler saltare questo componente e piuttosto generare la tua anteprima esattamente come sarebbe nel frontend.<\/p>\n<p>E con ci\u00f2 abbiamo un interruttore di anteprima\/modifica in modalit\u00e0 blocco. Ovviamente puoi regolare il contenuto della &quot;modalit\u00e0 di modifica&quot; per mostrare ad esempio ingressi di controllo o altro.<\/p>\n<\/p>\n<p>Puoi creare tutti i componenti che desideri, non sei limitato ad averne solo uno per la <code>edit<\/code>funzione! Crea semplicemente pi\u00f9 componenti e includili all&#8217;interno di una <code>return<\/code>dichiarazione. Questa \u00e8 l&#8217;idea di React, in realt\u00e0: costruire pezzi di codice incapsulati, possibilmente ciascuno gestendo il proprio stato e combinandoli per creare interfacce utente complesse.<\/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>In questa parte del nostro tutorial sul blocco di Gutenberg impareremo come spostare la funzione di modifica di registerBlockType in un componente separato basato sulla classe.<\/p>\n","protected":false},"author":1,"featured_media":152941,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,720,835,939,939,1110,804,804,835,720,844,844,865,865],"tags":[1168],"class_list":{"0":"post-233582","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-codice","9":"category-sviluppatore","10":"category-guida-per-principianti","11":"category-gutenberg-6","13":"category-n-a","14":"category-php-6","18":"category-tutorial","20":"category-wordpress-6","22":"tag-affiai-it"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233582","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=233582"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233582\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/152941"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}