{"id":77005,"date":"2024-03-12T19:13:26","date_gmt":"2024-03-12T18:13:26","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=77005&#038;preview=true&#038;preview_id=77005"},"modified":"2024-03-18T09:25:17","modified_gmt":"2024-03-18T08:25:17","slug":"dati-di-configurazione-del-plugin-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/","title":{"rendered":"Installare i dati di configurazione di un plugin di WordPress"},"content":{"rendered":"<p>Quando si sviluppa un <a href=\"https:\/\/kinsta.com\/it\/argomenti\/plugin-wordpress\/\">plugin per WordPress<\/a>, un passo fondamentale \u00e8 quello di preinstallare i dati essenziali, per garantire che il plugin funzioni senza problemi fin dall&#8217;inizio. Prendiamo ad esempio un plugin per la gestione degli eventi. Al momento dell&#8217;installazione, \u00e8 estremamente utile che il plugin generi automaticamente una pagina intitolata <strong>Prossimi eventi<\/strong>, che mostra un elenco di eventi futuri.<\/p>\n<p>Questa pagina preconfigurata, incorporata con uno shortcode come <code>[event_list number=\"10\" scope=\"future\" status=\"publish\"]<\/code>, permette agli utenti di sfruttare immediatamente le funzionalit\u00e0 del plugin senza dover leggere la sua documentazione.<\/p>\n<p>L&#8217;installazione dei dati \u00e8 utile non solo quando si installa per la prima volta il plugin, ma anche quando lo si aggiorna successivamente. Ad esempio, se un aggiornamento introduce una funzione di visualizzazione del calendario, il plugin pu\u00f2 creare automaticamente una nuova pagina, <strong>Calendario degli eventi<\/strong>, che mostra questa aggiunta attraverso uno shortcode come <code>[event_calendar status=\"publish\"]<\/code>.<\/p>\n<p>In generale, la portata dell&#8217;installazione dei dati abbraccia diverse esigenze:<\/p>\n<ul>\n<li>Generare nuove pagine con titoli e contenuti specifici.<\/li>\n<li>Aggiungere voci per i tipi di post personalizzati (CPT) creati dal plugin.<\/li>\n<li>Inserire impostazioni predefinite nella tabella <code>wp_options<\/code><\/li>\n<li>Assegnare nuove funzionalit\u00e0 ai ruoli degli utenti<\/li>\n<li>Assegnare metadati agli utenti per le funzionalit\u00e0 nuove o aggiornate fornite dal plugin (ad esempio, gli utenti possono modificare il formato della data dell&#8217;evento e viene aggiunto un valore predefinito per tutti gli utenti)<\/li>\n<li>Creare categorie comunemente utilizzate nel contesto del plugin, come &#8220;conferenze&#8221; o &#8220;sport&#8221;<\/li>\n<\/ul>\n<p>L&#8217;installazione dei dati deve essere un processo incrementale, altrimenti si potrebbero creare voci duplicate.<\/p>\n<p>Ad esempio, se la versione 1.1 di un plugin introduce la pagina dei <strong>prossimi eventi<\/strong> e un utente esegue l&#8217;aggiornamento dalla versione 1.0, dovranno essere installati solo i nuovi dati rilevanti per la versione 1.1. Questo aggiornamento incrementale assicura che quando la versione 1.2 verr\u00e0 rilasciata con la funzione calendario, verr\u00e0 aggiunta solo la nuova pagina <strong>Calendario eventi<\/strong>, evitando la duplicazione della pagina <strong>Prossimi eventi<\/strong>.<\/p>\n<p>Pertanto, al momento dell&#8217;aggiornamento, il plugin deve recuperare la versione precedente installata e installare solo i dati corrispondenti alla nuova versione.<\/p>\n<p>Questo articolo spiega come installare i dati iniziali e continuare ad aggiungerne di nuovi con i successivi aggiornamenti nei nostri plugin WordPress.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Fornire la versione corrente<\/h2>\n<p>Per gestire il processo incrementale, il plugin deve tenere traccia della sua versione corrente, in genere dichiarata nell&#8217;<a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/#header-fields\" target=\"_blank\" rel=\"noopener noreferrer\">intestazione del file principale del plugin<\/a>. Ma ovviamente non possiamo fare riferimento direttamente a questo valore, poich\u00e9 si trova all&#8217;interno di un commento <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-php\/\">PHP<\/a>. Quindi definiamo questo valore in una variabile e lo forniamo a una classe <code>Plugin<\/code> responsabile dell&#8217;inizializzazione e della configurazione:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/*\nPlugin Name: My plugin\nVersion: 1.6\n*\/\n\n\/\/ Same version as in the header\n$pluginVersion = '1.6';\nnew Plugin($pluginVersion)-&gt;setup();\n<\/code><\/pre>\n<p>La classe <code>Plugin<\/code>, sfruttando la <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#constructor-property-promotion\">Constructor Property Promotion di PHP 8.0<\/a>, memorizza questa versione, in modo da poterla consultare in seguito:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  public function __construct(\n    protected string $pluginVersion,\n  ) {}\n\n  public function setup(): void\n  {\n    \/\/ Initialization logic here...\n  }\n\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>Notiamo che la logica per inizializzare e configurare il plugin viene aggiunta al metodo <code>setup<\/code> e non al constructor. Questo perch\u00e9 il constructor deve evitare di produrre effetti collaterali; in caso contrario, potremmo generare dei bug quando estendiamo o componiamo la classe <code>Plugin<\/code>.<\/p>\n<p>Vediamo come potrebbe accadere. Supponiamo di aggiungere una classe <code>BetterPlugin<\/code> che compone le funzionalit\u00e0 della classe <code>Plugin<\/code>:<\/p>\n<pre><code class=\"language-php\">class BetterPlugin {\n\n  public function printSomething(): string\n  {\n    $pluginVersion = '1.0';\n    $plugin = new Plugin($pluginVersion);\n    return '&lt;div class=\"wrapper\"&gt;' . $plugin-&gt;printSomething() . '&lt;\/div&gt;';\n  }\n}\n<\/code><\/pre>\n<p>Ogni volta che si esegue <code>new Plugin()<\/code> all&#8217;interno di <code>printSomething<\/code>, viene creata una nuova istanza di <code>Plugin<\/code>. Se la logica di configurazione fosse aggiunta al constructor, verrebbe eseguita ogni volta che si crea un nuovo oggetto <code>Plugin<\/code>. Nel nostro caso, vogliamo creare la pagina dei <strong>prossimi eventi<\/strong> solo una volta, non pi\u00f9 volte. Aggiungendo la logica al metodo <code>setup<\/code>, possiamo evitare questo problema.<\/p>\n<h2>Tracciare la versione precedente<\/h2>\n<p>WordPress non fornisce un modo pratico per recuperare la versione del plugin che viene sostituito. Pertanto, dobbiamo memorizzare questo valore nella tabella <code>wp_options<\/code> del <a href=\"https:\/\/kinsta.com\/database\/\">database<\/a>.<\/p>\n<p>Memorizziamo la versione alla voce <code>\"myplugin_version\"<\/code>, dove <code>myplugin_<\/code> \u00e8 il nome del plugin (ad esempio <code>eventsmanager_version<\/code>). \u00c8 importante anteporre sempre a tutte le nostre impostazioni la voce <code>myplugin_<\/code>, per evitare potenziali conflitti, poich\u00e9 non possiamo essere sicuri che un altro plugin non aggiunga un&#8217;opzione <code>version<\/code>.<\/p>\n<p>Quando il plugin viene caricato a ogni richiesta, <code>Plugin<\/code> conosce gi\u00e0 la versione corrente (dalla propriet\u00e0 <code>$pluginVersion<\/code> precedente) e recupera l&#8217;ultima versione memorizzata dal database. Questo confronto determina lo stato del plugin:<\/p>\n<ul>\n<li><strong>Nuova installazione:<\/strong> rileva se nel database manca una voce relativa alla versione del plugin, indicando la prima installazione (ad esempio, <code>$storedPluginVersion<\/code> \u00e8 <code>null<\/code>)<\/li>\n<li><strong>Aggiornamento:<\/strong> viene identificato quando la versione corrente supera quella memorizzata nel database, segnalando la necessit\u00e0 di un aggiornamento.<\/li>\n<li>Altrimenti, non c&#8217;\u00e8 alcun cambiamento<\/li>\n<\/ul>\n<p>Ogni volta che c&#8217;\u00e8 un cambiamento, chiamiamo <code>prepareAndInstallPluginSetupData<\/code> per installare i dati appropriati, sia per una nuova installazione (nel qual caso deve installare tutti i dati per tutte le versioni) sia per un aggiornamento (installa i dati solo per tutte le nuove versioni). La variabile nullable <code>$previousVersion<\/code> indica di quale situazione si tratta (<code>$previousVersion<\/code> \u00e8 <code>null<\/code> =&gt; nuova installazione).<\/p>\n<p>Dopo aver richiamato questo metodo, dobbiamo anche memorizzare la versione corrente del plugin nel database, facendo diventare la nuova versione &#8220;ultima memorizzata&#8221;. Questo deve essere fatto dopo aver chiamato <code>prepareAndInstallPluginSetupData<\/code> in modo che se questo metodo produce un errore (ad esempio lanciando un <code>RuntimeException<\/code>) e i dati non vengono installati, la versione precedente \u00e8 ancora memorizzata nel database e si tenter\u00e0 una nuova installazione dei dati alla prossima richiesta.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  \/\/ ...\n\n  public function setup(): void\n  {\n    if (!is_admin()) {\n      return;\n    }\n\n    $this-&gt;managePluginDataVersioning();\n  }\n\n  \/**\n   * If the plugin has just been newly-installed + activated\n   * or updated, install the appropriate data.\n   *\/\n  protected function managePluginDataVersioning(): void\n  {\n    $myPluginVersionOptionName = 'myplugin_version';\n    $storedPluginVersion = get_option($myPluginVersionOptionName, null);\n\n    \/\/ Check if the main plugin has been activated or updated\n    $isPluginJustFirstTimeActivated = $storedPluginVersion === null;\n    $isPluginJustUpdated = !$isPluginJustFirstTimeActivated && $storedPluginVersion !== $this-&gt;pluginVersion;\n\n    \/\/ If there were no changes, nothing to do\n    if (!$isPluginJustFirstTimeActivated && !$isPluginJustUpdated) {\n      return;\n    }\n\n    \\add_action(\n      'init',\n      function () use ($myPluginVersionOptionName, $storedPluginVersion): void {\n        $this-&gt;prepareAndInstallPluginSetupData($storedPluginVersion);\n\n        \/\/ Update on the DB\n        update_option($myPluginVersionOptionName, $this-&gt;pluginVersion);\n      }\n    );\n  }\n\n  protected function prepareAndInstallPluginSetupData(?string $previousVersion): void\n  {\n    \/\/ Installation logic...\n  }\n}\n<\/code><\/pre>\n<p>Notate che <code>prepareAndInstallPluginSetupData<\/code> (e il successivo aggiornamento del database) viene eseguito sull&#8217;<a href=\"https:\/\/kinsta.com\/it\/blog\/hook-wordpress\/\">action hook <code>init<\/code><\/a>. Questo per assicurarsi che tutti i dati del CMS siano pronti per essere recuperati e manipolati.<\/p>\n<p>In particolare, <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#description\" target=\"_blank\" rel=\"noopener noreferrer\">non \u00e8 possibile accedere alle<\/a> <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-una-tassonomia\/\">tassonomie<\/a> (tag e categorie) <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#description\" target=\"_blank\" rel=\"noopener noreferrer\">prima dell&#8217;hook <code>init<\/code><\/a>. Se il processo di installazione del plugin richiede la creazione di una voce CPT e l&#8217;assegnazione di una categoria personalizzata, questo processo pu\u00f2 essere eseguito solo a partire dall&#8217;hook <code>init<\/code>.<\/p>\n<p>Accedere all&#8217;ultima versione memorizzata dal DB a ogni richiesta non \u00e8 l&#8217;ideale dal punto di <a href=\"https:\/\/kinsta.com\/it\/blog\/ottimizzazione-del-database-di-wordpress\/\">vista delle prestazioni<\/a>. Per migliorare questo aspetto, \u00e8 possibile combinare tutte le opzioni necessarie al plugin in un array, memorizzarle in un&#8217;unica voce e quindi accedervi con un&#8217;unica chiamata al DB.<\/p>\n<p>Ad esempio, se il plugin avesse bisogno di memorizzare anche l&#8217;opzione <code>myplugin_date_format<\/code> per visualizzare la data dell&#8217;evento, potremmo creare una singola voce <code>myplugin_options<\/code> con le propriet\u00e0 <code>version<\/code> e <code>date_format<\/code>.<\/p>\n<p>Per accedere all&#8217;ultima versione memorizzata, il codice PHP deve essere adattato in questo modo:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  \/\/ ...\n\n  protected function managePluginDataVersioning(): void\n  {\n    $myPluginOptionsOptionName = 'myplugin_options';\n    $myPluginOptions = get_option($myPluginOptionsOptionName, []);\n    $storedPluginVersion = $myPluginOptions['version'] ?? null;\n\n    \/\/ ...\n\n    \\add_action(\n      'init',\n      function () use ($myPluginOptionsOptionName, $myPluginOptions): void {\n        \/\/ ...\n\n        \/\/ Update on the DB\n        $myPluginOptions['version'] = $this-&gt;pluginVersion;\n        update_option($myPluginOptionsOptionName, $myPluginOptions);\n      }\n    );\n  }\n}\n<\/code><\/pre>\n<h2>Evitare le richieste simultanee che installano dati duplicati<\/h2>\n<p>Esiste la possibilit\u00e0 che il processo di installazione venga attivato pi\u00f9 di una volta se due o pi\u00f9 utenti accedono al <a href=\"https:\/\/kinsta.com\/it\/blog\/amministrazione-wordpress\/\">wp-admin<\/a> esattamente nello stesso momento. Per evitare che gli stessi dati vengano installati due o pi\u00f9 volte, utilizziamo un <a href=\"https:\/\/developer.wordpress.org\/apis\/transients\/\" target=\"_blank\" rel=\"noopener noreferrer\">transitorio<\/a> come flag per consentire solo la prima richiesta di installazione dei dati:<\/p>\n<ul>\n<li>Controlliamo se il transitorio <code>myplugin_installing_plugin_setup_data<\/code> esiste (ancora una volta, questo nome deve essere preceduto da <code>myplugin_<\/code>); in caso affermativo, non facciamo nulla (poich\u00e9 qualche altro processo sta installando i dati)<\/li>\n<li>Altrimenti, memorizziamo il transitorio nel database per un tempo massimo ragionevole per l&#8217;installazione dei dati (ad esempio, 30 secondi)<\/li>\n<li>Installiamo i dati<\/li>\n<li>Eliminiamo il transitorio<\/li>\n<\/ul>\n<p>Ecco il codice:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  \/\/ ...\n\n  \/**\n   * Use a transient to make sure that only one instance\n   * will install the data. Otherwise, two requests\n   * happening simultaneously might execute the logic\n   *\/\n  protected function prepareAndInstallPluginSetupData(?string $previousVersion): void\n  {\n    $transientName = 'myplugin_installing_plugin_setup_data';\n    $transient = \\get_transient($transientName);\n    if ($transient !== false) {\n      \/\/ Another instance is executing this code right now\n      return;\n    }\n\n    \\set_transient($transientName, true, 30);\n    $this-&gt;installPluginSetupData($previousVersion);\n    \\delete_transient($transientName);\n  }\n\n  protected function installPluginSetupData(?string $previousVersion): void\n  {\n    \/\/ Do something...\n  }\n}\n<\/code><\/pre>\n<h2>Installare i dati per tutte le versioni<\/h2>\n<p>Come abbiamo gi\u00e0 detto, se aggiorniamo il plugin, dobbiamo installare solo i dati per le nuove versioni, non per tutte. Ci\u00f2 significa che dobbiamo gestire quali dati installare versione per versione.<\/p>\n<p>Nel codice sottostante, l&#8217;array <code>$versionCallbacks<\/code> indica la funzione da eseguire per ogni versione e la funzione che esegue la logica per installare i dati. Eseguiamo un&#8217;iterazione dell&#8217;elenco di tutte le versioni, confrontiamo ciascuna di esse con la versione precedente utilizzando <code>version_compare<\/code> e, se \u00e8 maggiore, eseguiamo la funzione corrispondente per installare i dati corrispondenti.<\/p>\n<p>Notate che se <code>$previousVersion<\/code> \u00e8 <code>null<\/code> (cio\u00e8 \u00e8 una nuova installazione), tutte le funzioni vengono eseguite.<\/p>\n<pre><code class=\"language-php\">class Plugin {\n  \/**\n   * Provide the installation in stages, version by version, to\n   * be able to execute it both when installing\/activating the plugin,\n   * or updating it to a new version with setup data.\n   *\n   * The plugin's setup data will be installed if:\n   *\n   * - $previousVersion = null =&gt; Activating the plugin for first time\n   * - $previousVersion &lt; someVersion =&gt; Updating to a new version that has data to install\n   *\/\n  protected function installPluginSetupData(?string $previousVersion): void\n  {\n    $versionCallbacks = [\n      '1.1' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot1(...),\n      '1.2' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot2(...),\n      \/\/ ... Add more versions\n    ];\n    foreach ($versionCallbacks as $version =&gt; $callback) {\n      \/**\n       * If the previous version is provided, check if the corresponding update\n       * has already been performed, then skip\n       *\/\n      if ($previousVersion !== null && version_compare($previousVersion, $version, '&gt;=')) {\n        continue;\n      }\n      $callback();\n    }\n  }\n\n  protected function installPluginSetupDataForVersion1Dot1(): void\n  {\n    \/\/ Do something...\n  }\n\n  protected function installPluginSetupDataForVersion1Dot2(): void\n  {\n    \/\/ Do something...\n  }\n}\n<\/code><\/pre>\n<h2>Installazione dei dati per ogni versione specifica<\/h2>\n<p>Infine, dobbiamo installare i dati effettivi (creare una pagina, una voce CPT, aggiungere un&#8217;opzione, ecc.) per ogni versione.<\/p>\n<p>In questo codice, aggiungiamo la pagina <strong>Prossimi eventi<\/strong> per il plugin Gestione eventi, per <code>v1.1<\/code>:<\/p>\n<pre><code class=\"language-php\">class Plugin {\n  \n  \/\/ ...\n\n  protected function installPluginSetupDataForVersion1Dot1(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Upcoming Events', 'myplugin'),\n      'post_content' =&gt; '[event_list number=\"10\" scope=\"future\"]',\n    ]);\n  }\n\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>Poi, creiamo la pagina <strong>Calendario eventi<\/strong> per <code>v1.2<\/code> (in questo caso, utilizzando i <a href=\"https:\/\/kinsta.com\/it\/blog\/blocchi-gutenberg\/\">blocchi di Gutenberg<\/a> sulla pagina, aggiungendo un blocco personalizzato chiamato <code>event-calendar<\/code>):<\/p>\n<pre><code class=\"language-php\">class Plugin {\n  \n  \/\/ ...\n\n  protected function installPluginSetupDataForVersion1Dot2(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Events Calendar', 'myplugin'),\n      'post_content' =&gt; serialize_blocks([\n        [\n          'blockName' =&gt; 'myplugin\/event-calendar',\n          'attrs' =&gt; [\n            'status' =&gt; 'publish',\n          ],\n          'innerContent' =&gt; [],\n        ],\n      ]),\n    ]);\n  }\n}\n<\/code><\/pre>\n<h2>Tutto il codice insieme<\/h2>\n<p>Abbiamo finito! L&#8217;<a href=\"https:\/\/github.com\/GatoGraphQL\/GatoGraphQL\/blob\/9af936db31ac95456502fdd805a4b5658340e3ea\/layers\/GatoGraphQLForWP\/plugins\/gatographql\/src\/Plugin.php#L255\" target=\"_blank\" rel=\"noopener noreferrer\">intero codice PHP della classe <code>Plugin<\/code><\/a>, che contiene la logica per tracciare la versione del plugin e installare i dati appropriati, \u00e8 il seguente:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  public function __construct(\n    protected string $pluginVersion,\n  ) {\n  }\n\n  public function setup(): void\n  {\n    if (!is_admin()) {\n      return;\n    }\n\n    $this-&gt;managePluginDataVersioning();\n  }\n\n  \/**\n   * If the plugin has just been newly-installed + activated\n   * or updated, install the appropriate data.\n   *\/\n  protected function managePluginDataVersioning(): void\n  {\n    $myPluginVersionOptionName = 'myplugin_version';\n    $storedPluginVersion = get_option($myPluginVersionOptionName, null);\n\n    \/\/ Check if the main plugin has been activated or updated\n    $isPluginJustFirstTimeActivated = $storedPluginVersion === null;\n    $isPluginJustUpdated = !$isPluginJustFirstTimeActivated && $storedPluginVersion !== $this-&gt;pluginVersion;\n\n    \/\/ If there were no changes, nothing to do\n    if (!$isPluginJustFirstTimeActivated && !$isPluginJustUpdated) {\n      return;\n    }\n\n    \\add_action(\n      'init',\n      function () use ($myPluginVersionOptionName, $storedPluginVersion): void {\n        $this-&gt;prepareAndInstallPluginSetupData($storedPluginVersion);\n\n        \/\/ Update on the DB\n        update_option($myPluginVersionOptionName, $this-&gt;pluginVersion);\n      }\n    );\n  }\n\n  \/**\n   * Use a transient to make sure that only one instance\n   * will install the data. Otherwise, two requests\n   * happening simultaneously might both execute\n   * this logic\n   *\/\n  protected function prepareAndInstallPluginSetupData(?string $previousVersion): void\n  {\n    $transientName = 'myplugin_installing_plugin_setup_data';\n    $transient = \\get_transient($transientName);\n    if ($transient !== false) {\n      \/\/ Another instance is executing this code right now\n      return;\n    }\n\n    \\set_transient($transientName, true, 30);\n    $this-&gt;installPluginSetupData($previousVersion);\n    \\delete_transient($transientName);\n  }\n\n  \/**\n   * Provide the installation in stages, version by version, to\n   * be able to execute it both when installing\/activating the plugin,\n   * or updating it to a new version with setup data.\n   *\n   * The plugin's setup data will be installed if:\n   *\n   * - $previousVersion = null =&gt; Activating the plugin for first time\n   * - $previousVersion &lt; someVersion =&gt; Updating to a new version that has data to install\n   *\/\n  protected function installPluginSetupData(?string $previousVersion): void\n  {\n    $versionCallbacks = [\n      '1.1' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot1(...),\n      '1.2' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot2(...),\n      \/\/ ... Add more versions\n    ];\n    foreach ($versionCallbacks as $version =&gt; $callback) {\n      \/**\n       * If the previous version is provided, check if the corresponding update\n       * has already been performed, then skip\n       *\/\n      if ($previousVersion !== null && version_compare($previousVersion, $version, '&gt;=')) {\n        continue;\n      }\n      $callback();\n    }\n  }\n\n  protected function installPluginSetupDataForVersion1Dot1(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Upcoming Events', 'myplugin'),\n      'post_content' =&gt; '[event_list number=\"10\" scope=\"future\" status=\"publish\"]',\n    ]);\n  }\n\n  protected function installPluginSetupDataForVersion1Dot2(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Events Calendar', 'myplugin'),\n      'post_content' =&gt; serialize_blocks([\n        [\n          'blockName' =&gt; 'myplugin\/event-calendar',\n          'attrs' =&gt; [\n            'status' =&gt; 'publish',\n          ],\n          'innerContent' =&gt; [],\n        ],\n      ]),\n    ]);\n  }\n}\n<\/code><\/pre>\n<h2>Riepilogo<\/h2>\n<p>I plugin di WordPress hanno spesso bisogno di installare dei dati al momento dell&#8217;installazione. Inoltre, man mano che le nuove versioni del plugin offrono nuove funzionalit\u00e0, \u00e8 possibile che il plugin debba installare dei dati al momento dell&#8217;aggiornamento.<\/p>\n<p>In questo articolo abbiamo imparato come tenere traccia delle versioni e installare i dati appropriati per i nostri plugin.<\/p>\n<p><em>Avete un plugin di WordPress che pu\u00f2 trarre vantaggio dall&#8217;installazione di dati? Fatecelo sapere nei commenti.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si sviluppa un plugin per WordPress, un passo fondamentale \u00e8 quello di preinstallare i dati essenziali, per garantire che il plugin funzioni senza problemi fin &#8230;<\/p>\n","protected":false},"author":196,"featured_media":77006,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26187,25900],"class_list":["post-77005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-funzione-php","topic-plugin-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Installazione dei dati di configurazione di un plugin WordPress - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Installare i dati di configurazione di un plugin di WordPress\" \/>\n<meta property=\"og:description\" content=\"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-12T18:13:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-18T08:25:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Leonardo Losoviz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@losoviz\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Leonardo Losoviz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\"},\"author\":{\"name\":\"Leonardo Losoviz\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\"},\"headline\":\"Installare i dati di configurazione di un plugin di WordPress\",\"datePublished\":\"2024-03-12T18:13:26+00:00\",\"dateModified\":\"2024-03-18T08:25:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\"},\"wordCount\":1373,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\",\"name\":\"Installazione dei dati di configurazione di un plugin WordPress - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"datePublished\":\"2024-03-12T18:13:26+00:00\",\"dateModified\":\"2024-03-18T08:25:17+00:00\",\"description\":\"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Plugin WordPress\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/plugin-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Installare i dati di configurazione di un plugin di WordPress\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\",\"name\":\"Leonardo Losoviz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g\",\"caption\":\"Leonardo Losoviz\"},\"description\":\"Leo writes about innovative web development trends, mostly concerning PHP, WordPress and GraphQL. You can find him at leoloso.com and twitter.com\/losoviz.\",\"sameAs\":[\"https:\/\/leoloso.com\",\"https:\/\/x.com\/losoviz\",\"https:\/\/www.youtube.com\/@GatoGraphQL\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/leonardolosoviz\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Installazione dei dati di configurazione di un plugin WordPress - Kinsta\u00ae","description":"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/","og_locale":"it_IT","og_type":"article","og_title":"Installare i dati di configurazione di un plugin di WordPress","og_description":"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.","og_url":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2024-03-12T18:13:26+00:00","article_modified_time":"2024-03-18T08:25:17+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","type":"image\/jpeg"}],"author":"Leonardo Losoviz","twitter_card":"summary_large_image","twitter_description":"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","twitter_creator":"@losoviz","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Leonardo Losoviz","Tempo di lettura stimato":"11 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/"},"author":{"name":"Leonardo Losoviz","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238"},"headline":"Installare i dati di configurazione di un plugin di WordPress","datePublished":"2024-03-12T18:13:26+00:00","dateModified":"2024-03-18T08:25:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/"},"wordCount":1373,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/","url":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/","name":"Installazione dei dati di configurazione di un plugin WordPress - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","datePublished":"2024-03-12T18:13:26+00:00","dateModified":"2024-03-18T08:25:17+00:00","description":"Questa guida spiega come preinstallare i dati iniziali, e continuare ad aggiungerne di nuovi con i successivi aggiornamenti, nei nostri plugin WordPress.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/dati-di-configurazione-del-plugin-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Plugin WordPress","item":"https:\/\/kinsta.com\/it\/argomenti\/plugin-wordpress\/"},{"@type":"ListItem","position":3,"name":"Installare i dati di configurazione di un plugin di WordPress"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238","name":"Leonardo Losoviz","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g","caption":"Leonardo Losoviz"},"description":"Leo writes about innovative web development trends, mostly concerning PHP, WordPress and GraphQL. You can find him at leoloso.com and twitter.com\/losoviz.","sameAs":["https:\/\/leoloso.com","https:\/\/x.com\/losoviz","https:\/\/www.youtube.com\/@GatoGraphQL"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/leonardolosoviz\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/77005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/196"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=77005"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/77005\/revisions"}],"predecessor-version":[{"id":77068,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/77005\/revisions\/77068"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/translations\/jp"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/77005\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/77006"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=77005"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=77005"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=77005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}