{"id":67571,"date":"2024-03-27T14:55:26","date_gmt":"2024-03-27T17:55:26","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=67571&#038;preview=true&#038;preview_id=67571"},"modified":"2024-03-28T10:55:51","modified_gmt":"2024-03-28T13:55:51","slug":"dados-de-configuracao-plugin-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/","title":{"rendered":"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress"},"content":{"rendered":"<p>Ao desenvolver um <a href=\"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/\">plugin WordPress<\/a>, uma etapa crucial \u00e9 a pr\u00e9-instala\u00e7\u00e3o dos dados essenciais, garantindo que o plugin funcione sem problemas desde o in\u00edcio. Veja, por exemplo, um plugin de gerenciador de eventos. Ap\u00f3s a instala\u00e7\u00e3o, \u00e9 extremamente \u00fatil que o plugin gere automaticamente uma p\u00e1gina intitulada <strong>Pr\u00f3ximos eventos<\/strong>, exibindo uma lista de eventos futuros.<\/p>\n<p>Essa p\u00e1gina pr\u00e9-configurada, incorporada com um shortcode como <code>[event_list number=\"10\" scope=\"future\" status=\"publish\"]<\/code>, permite que os usu\u00e1rios aproveitem imediatamente as capacidades do plugin sem a necessidade de ler toda a sua documenta\u00e7\u00e3o.<\/p>\n<p>A instala\u00e7\u00e3o de dados \u00e9 \u00fatil n\u00e3o apenas quando voc\u00ea instala o plugin pela primeira vez, mas tamb\u00e9m quando o atualiza posteriormente. Por exemplo, se uma atualiza\u00e7\u00e3o introduzir um recurso de visualiza\u00e7\u00e3o de calend\u00e1rio, o plugin poder\u00e1 criar automaticamente uma nova p\u00e1gina, <strong>Calend\u00e1rio de <\/strong><strong>Eventos<\/strong>, mostrando essa adi\u00e7\u00e3o por meio de um shortcode como <code>[event_calendar status=\"publish\"]<\/code>.<\/p>\n<p>Em geral, o escopo da instala\u00e7\u00e3o de dados abrange v\u00e1rias necessidades:<\/p>\n<ul>\n<li>Gerar novas p\u00e1ginas com t\u00edtulos e conte\u00fados espec\u00edficos<\/li>\n<li>Adicionar entradas para tipos de artigos personalizados (CPTs) criados pelo plugin<\/li>\n<li>Inserir configura\u00e7\u00f5es padr\u00e3o na tabela <code>wp_options<\/code><\/li>\n<li>Atribuir novos recursos a fun\u00e7\u00f5es de usu\u00e1rio<\/li>\n<li>Atribuir metadados aos usu\u00e1rios, para recursos novos ou atualizados fornecidos pelo plugin (por exemplo, os usu\u00e1rios poderiam alterar o formato da data do evento, e um valor padr\u00e3o \u00e9 adicionado primeiro para todos os usu\u00e1rios)<\/li>\n<li>Criar categorias comumente usadas no contexto do plugin, como &#8220;confer\u00eancias&#8221; ou &#8220;esportes&#8221;<\/li>\n<\/ul>\n<p>A instala\u00e7\u00e3o de dados deve ser um processo incremental, para evitar criar entradas duplicadas.<\/p>\n<p>Por exemplo, se a vers\u00e3o 1.1 de um plugin introduzir uma p\u00e1gina <strong>Pr\u00f3ximos eventos <\/strong>e um usu\u00e1rio atualizar a partir da vers\u00e3o 1.0, somente os novos dados relevantes para a vers\u00e3o 1.1 dever\u00e3o ser instalados. Essa atualiza\u00e7\u00e3o incremental garante que, quando a vers\u00e3o 1.2 for lan\u00e7ada com o recurso de calend\u00e1rio, somente a nova p\u00e1gina <strong>Calend\u00e1rio de <\/strong><strong>Eventos <\/strong>ser\u00e1 adicionada, evitando qualquer duplica\u00e7\u00e3o da p\u00e1gina <strong>Pr\u00f3ximos eventos<\/strong>.<\/p>\n<p>Portanto, quando atualizado, o plugin deve recuperar a vers\u00e3o anterior que estava instalada e instalar os dados que correspondem somente \u00e0(s) nova(s) vers\u00e3o(\u00f5es).<\/p>\n<p>Este artigo explica como instalar os dados iniciais e continuar adicionando novos dados em atualiza\u00e7\u00f5es posteriores de nossos plugins 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>Fornecendo a vers\u00e3o atual<\/h2>\n<p>Para lidar com o processo incremental, o plugin deve rastrear sua vers\u00e3o atual, normalmente declarada no <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/#header-fields\" target=\"_blank\" rel=\"noopener noreferrer\">cabe\u00e7alho do arquivo principal do plugin<\/a>. Mas, claro, n\u00e3o podemos referenci\u00e1-la diretamente de l\u00e1, pois est\u00e1 dentro de um coment\u00e1rio <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-php\/\">PHP<\/a>. Ent\u00e3o, tamb\u00e9m definimos esse valor em uma vari\u00e1vel e o fornecemos a uma classe <code>Plugin<\/code> respons\u00e1vel pela inicializa\u00e7\u00e3o e configura\u00e7\u00e3o:<\/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>A classe <code>Plugin<\/code>, aproveitando o <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#constructor-property-promotion\">recurso de promo\u00e7\u00e3o de propriedade do Constructor do PHP 8.0<\/a>, armazena essa vers\u00e3o para que possamos referenci\u00e1-la posteriormente:<\/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>Observe como a l\u00f3gica para inicializar e configurar o plugin \u00e9 adicionada ao m\u00e9todo <code>setup<\/code>, e n\u00e3o ao construtor. Isso ocorre porque o construtor deve evitar a produ\u00e7\u00e3o de efeitos colaterais; caso contr\u00e1rio, poder\u00edamos produzir bugs ao estender ou compor a classe <code>Plugin<\/code>.<\/p>\n<p>Vejamos como isso poderia acontecer. Digamos que voc\u00ea adicione uma classe <code>BetterPlugin<\/code> que componha a funcionalidade da 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>Sempre que voc\u00ea executa <code>new Plugin()<\/code> dentro de <code>printSomething<\/code>, uma nova inst\u00e2ncia de <code>Plugin<\/code> \u00e9 criada. Se a l\u00f3gica de configura\u00e7\u00e3o fosse adicionada ao construtor, ela seria executada toda vez que cri\u00e1ssemos um novo objeto <code>Plugin<\/code>. No nosso caso, queremos criar a p\u00e1gina <strong>Pr\u00f3ximos eventos<\/strong> apenas uma vez, n\u00e3o v\u00e1rias. Ao adicionar a l\u00f3gica ao m\u00e9todo <code>setup<\/code>, evitamos esse problema.<\/p>\n<h2>Rastreamento da vers\u00e3o anterior<\/h2>\n<p>O WordPress n\u00e3o oferece uma maneira conveniente de recuperar a vers\u00e3o do plugin que est\u00e1 sendo substitu\u00eddo. Portanto, precisamos armazenar esse valor por n\u00f3s mesmos na tabela <code>wp_options<\/code> do <a href=\"https:\/\/kinsta.com\/database\/\">banco de dados<\/a>.<\/p>\n<p>Armazene a vers\u00e3o na entrada <code>\"myplugin_version\"<\/code>, em que <code>myplugin_<\/code> \u00e9 o nome do plugin (por exemplo, <code>eventsmanager_version<\/code>). \u00c9 importante sempre preceder todas as nossas configura\u00e7\u00f5es com <code>myplugin_<\/code>, para evitar poss\u00edveis conflitos, pois n\u00e3o podemos ter certeza de que outro plugin n\u00e3o adicionar\u00e1 uma op\u00e7\u00e3o <code>version<\/code>.<\/p>\n<p>Ao carregar o plugin em cada solicita\u00e7\u00e3o, <code>Plugin<\/code> j\u00e1 saber\u00e1 qual \u00e9 a vers\u00e3o atual (da propriedade <code>$pluginVersion<\/code> anteriormente) e recuperar\u00e1 a \u00faltima vers\u00e3o armazenada no banco de dados. Essa compara\u00e7\u00e3o determina o status do plugin:<\/p>\n<ul>\n<li><strong>Nova instala\u00e7\u00e3o:<\/strong> detecta se o banco de dados n\u00e3o tem uma entrada de vers\u00e3o para o plugin, indicando a primeira configura\u00e7\u00e3o (ou seja, <code>$storedPluginVersion<\/code> \u00e9 <code>null<\/code>)<\/li>\n<li><strong>Atualiza\u00e7\u00e3o:<\/strong> identificada quando a vers\u00e3o atual excede a vers\u00e3o armazenada no banco de dados, indicando uma solicita\u00e7\u00e3o de atualiza\u00e7\u00e3o.<\/li>\n<li>Caso contr\u00e1rio, n\u00e3o h\u00e1 altera\u00e7\u00e3o<\/li>\n<\/ul>\n<p>Sempre que houver uma altera\u00e7\u00e3o, chamamos <code>prepareAndInstallPluginSetupData<\/code> para instalar os dados apropriados, seja para uma nova instala\u00e7\u00e3o (caso em que deve instalar todos os dados de todas as vers\u00f5es) ou uma atualiza\u00e7\u00e3o (instalar somente os dados para todas as novas vers\u00f5es). A vari\u00e1vel <code>$previousVersion<\/code>, que pode ser anulada, indica em que situa\u00e7\u00e3o voc\u00ea se encontra (<code>$previousVersion<\/code> \u00e9 <code>null<\/code> =&gt; nova instala\u00e7\u00e3o).<\/p>\n<p>Depois de chamar esse m\u00e9todo, tamb\u00e9m devemos armazenar a vers\u00e3o atual do plugin no banco de dados, tornando-se a nova \u00faltima vers\u00e3o armazenada (&#8220;last stored&#8221;). Isso deve ser feito ap\u00f3s a chamada de <code>prepareAndInstallPluginSetupData<\/code>, para que, se esse m\u00e9todo produzir um erro (por exemplo, lan\u00e7ando um <code>RuntimeException<\/code>) e os dados n\u00e3o forem instalados, a vers\u00e3o anterior ainda esteja armazenada no banco de dados e uma nova rodada de instala\u00e7\u00e3o de dados seja tentada na pr\u00f3xima solicita\u00e7\u00e3o.<\/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>Observe que <code>prepareAndInstallPluginSetupData<\/code> (e a subsequente atualiza\u00e7\u00e3o do banco de dados) \u00e9 executada no <a href=\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\">hook de a\u00e7\u00e3o <code>init<\/code><\/a>. Isso serve para garantir que todos os dados do CMS estejam prontos para recupera\u00e7\u00e3o e manipula\u00e7\u00e3o.<\/p>\n<p>Em particular, as <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-taxonomia\/\">taxonomias<\/a> (tags e categorias) <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#description\" target=\"_blank\" rel=\"noopener noreferrer\">n\u00e3o podem ser acessadas antes do hook <code>init<\/code><\/a>. Se o processo de instala\u00e7\u00e3o do plugin precisasse criar uma entrada de CPT e atribuir uma categoria personalizada a ela, esse processo s\u00f3 poderia ser executado ap\u00f3s o hook <code>init<\/code>.<\/p>\n<p>Acessar a \u00faltima vers\u00e3o armazenada do banco de dados em cada solicita\u00e7\u00e3o n\u00e3o \u00e9 ideal do <a href=\"https:\/\/kinsta.com\/pt\/blog\/otimizacao-do-banco-de-dados-wordpress\/\">ponto de vista do desempenho<\/a>. Para melhorar isso, combine todas as op\u00e7\u00f5es necess\u00e1rias ao plugin em um array, armazene-as em uma \u00fanica entrada e acesse todas elas com uma \u00fanica chamada ao banco de dados.<\/p>\n<p>Por exemplo, se o plugin tamb\u00e9m precisasse armazenar uma op\u00e7\u00e3o <code>myplugin_date_format<\/code> para exibir a data do evento, poder\u00edamos criar uma \u00fanica entrada <code>myplugin_options<\/code> com as propriedades <code>version<\/code> e <code>date_format<\/code>.<\/p>\n<p>Para acessar a \u00faltima vers\u00e3o armazenada, o c\u00f3digo PHP deve ser adaptado da seguinte forma:<\/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>Evitando solicita\u00e7\u00f5es simult\u00e2neas que instalam dados duplicados<\/h2>\n<p>Existe a possibilidade de que o processo de instala\u00e7\u00e3o seja acionado mais de uma vez se dois ou mais usu\u00e1rios acessarem o <a href=\"https:\/\/kinsta.com\/pt\/blog\/painel-administrativo-wordpress\/\">wp-admin<\/a> exatamente ao mesmo tempo. Para evitar que os mesmos dados sejam instalados duas ou mais vezes, usamos um <a href=\"https:\/\/developer.wordpress.org\/apis\/transients\/\" target=\"_blank\" rel=\"noopener noreferrer\">transiente<\/a> como sinalizador para permitir que apenas a primeira solicita\u00e7\u00e3o instale os dados:<\/p>\n<ul>\n<li>Verifique se o transiente <code>myplugin_installing_plugin_setup_data<\/code> existe (mais uma vez, esse nome deve ser precedido de <code>myplugin_<\/code>); em caso afirmativo, n\u00e3o fa\u00e7a nada (pois algum outro processo est\u00e1 instalando os dados)<\/li>\n<li>Caso contr\u00e1rio, armazene o transiente no banco de dados por um per\u00edodo m\u00e1ximo razo\u00e1vel de tempo para instalar os dados (por exemplo, 30 segundos)<\/li>\n<li>Instale os dados<\/li>\n<li>Exclua o transiente<\/li>\n<\/ul>\n<p>Aqui est\u00e1 o c\u00f3digo:<\/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>Instalando os dados para todas as vers\u00f5es<\/h2>\n<p>Conforme mencionamos, ao atualizar o plugin, devemos instalar apenas os dados das novas vers\u00f5es, n\u00e3o de todas elas. Isso significa que precisamos gerenciar quais dados instalar, vers\u00e3o por vers\u00e3o.<\/p>\n<p>No c\u00f3digo abaixo, o array <code>$versionCallbacks<\/code> indica a fun\u00e7\u00e3o a ser executada para cada vers\u00e3o, com a fun\u00e7\u00e3o executando a l\u00f3gica para instalar os dados. Iteramos a lista de todas elas, comparamos cada uma com a vers\u00e3o anterior usando <code>version_compare<\/code> e, se for maior, executamos a fun\u00e7\u00e3o correspondente para instalar os dados correspondentes.<\/p>\n<p>Observe que se <code>$previousVersion<\/code> for <code>null<\/code> (ou seja, \u00e9 uma nova instala\u00e7\u00e3o), todas as fun\u00e7\u00f5es ser\u00e3o executadas.<\/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>Instala\u00e7\u00e3o de dados para cada vers\u00e3o espec\u00edfica<\/h2>\n<p>Por fim, devemos instalar os dados reais (criar uma p\u00e1gina, uma entrada CPT, adicionar uma op\u00e7\u00e3o, etc.) para cada vers\u00e3o.<\/p>\n<p>Neste c\u00f3digo, adicionamos a p\u00e1gina <strong>Pr\u00f3ximos eventos <\/strong>ao plugin do gerenciador de eventos, para <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>Em seguida, criamos a p\u00e1gina <strong>Calend\u00e1rio de <\/strong><strong>Eventos <\/strong>para <code>v1.2<\/code> (nesse caso, usando <a href=\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\">blocos do Gutenberg<\/a> na p\u00e1gina, adicionando um bloco personalizado chamado <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>Todo o c\u00f3digo junto<\/h2>\n<p>Terminamos! <a href=\"https:\/\/github.com\/GatoGraphQL\/GatoGraphQL\/blob\/9af936db31ac95456502fdd805a4b5658340e3ea\/layers\/GatoGraphQLForWP\/plugins\/gatographql\/src\/Plugin.php#L255\" target=\"_blank\" rel=\"noopener noreferrer\">Todo o c\u00f3digo PHP da classe <code>Plugin<\/code><\/a>, contendo a l\u00f3gica para rastrear a vers\u00e3o do plugin e instalar os dados apropriados, \u00e9 o seguinte:<\/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>Resumo<\/h2>\n<p>Os plugins WordPress geralmente precisam instalar dados na instala\u00e7\u00e3o. Al\u00e9m disso, como as vers\u00f5es mais recentes do plugin fornecem novos recursos, o plugin tamb\u00e9m pode precisar instalar dados quando \u00e9 atualizado.<\/p>\n<p>Neste artigo, aprendemos como rastrear vers\u00f5es e instalar os dados apropriados para nossos plugins.<\/p>\n<p><em>Voc\u00ea tem um plugin WordPress que pode se beneficiar da instala\u00e7\u00e3o de dados? Conte pra n\u00f3s nos coment\u00e1rios.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao desenvolver um plugin WordPress, uma etapa crucial \u00e9 a pr\u00e9-instala\u00e7\u00e3o dos dados essenciais, garantindo que o plugin funcione sem problemas desde o in\u00edcio. Veja, por &#8230;<\/p>\n","protected":false},"author":196,"featured_media":67572,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[997,1033],"class_list":["post-67571","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-funcoes-php","topic-plugins-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>Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins 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\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress\" \/>\n<meta property=\"og:description\" content=\"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins WordPress.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-27T17:55:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-28T13:55:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins WordPress.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Leonardo Losoviz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\"},\"author\":{\"name\":\"Leonardo Losoviz\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\"},\"headline\":\"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress\",\"datePublished\":\"2024-03-27T17:55:26+00:00\",\"dateModified\":\"2024-03-28T13:55:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\"},\"wordCount\":1572,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\",\"name\":\"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"datePublished\":\"2024-03-27T17:55:26+00:00\",\"dateModified\":\"2024-03-28T13:55:51+00:00\",\"description\":\"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins WordPress.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Plugins WordPress\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\",\"name\":\"Leonardo Losoviz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/leonardolosoviz\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress - Kinsta\u00ae","description":"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins 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\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/","og_locale":"pt_PT","og_type":"article","og_title":"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress","og_description":"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins WordPress.","og_url":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2024-03-27T17:55:26+00:00","article_modified_time":"2024-03-28T13:55:51+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","type":"image\/jpeg"}],"author":"Leonardo Losoviz","twitter_card":"summary_large_image","twitter_description":"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins WordPress.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","twitter_creator":"@losoviz","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Leonardo Losoviz","Tempo estimado de leitura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/"},"author":{"name":"Leonardo Losoviz","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238"},"headline":"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress","datePublished":"2024-03-27T17:55:26+00:00","dateModified":"2024-03-28T13:55:51+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/"},"wordCount":1572,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/","url":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/","name":"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","datePublished":"2024-03-27T17:55:26+00:00","dateModified":"2024-03-28T13:55:51+00:00","description":"Este guia explica como instalar os dados iniciais e continuar adicionando novos dados com atualiza\u00e7\u00f5es posteriores em plugins WordPress.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/dados-de-configuracao-plugin-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Plugins WordPress","item":"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/"},{"@type":"ListItem","position":3,"name":"Instala\u00e7\u00e3o de Dados de Configura\u00e7\u00e3o para um Plugin WordPress"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238","name":"Leonardo Losoviz","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/leonardolosoviz\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/67571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/196"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=67571"}],"version-history":[{"count":9,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/67571\/revisions"}],"predecessor-version":[{"id":67799,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/67571\/revisions\/67799"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/translations\/jp"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/67571\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/67572"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=67571"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=67571"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=67571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}