{"id":74230,"date":"2024-04-04T18:57:16","date_gmt":"2024-04-04T16:57:16","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=74230&#038;preview=true&#038;preview_id=74230"},"modified":"2024-04-09T10:16:30","modified_gmt":"2024-04-09T08:16:30","slug":"datos-de-instalacion-de-plugins-de-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/","title":{"rendered":"Instalar los datos de configuraci\u00f3n de un plugin de WordPress"},"content":{"rendered":"<p>Al desarrollar un <a href=\"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/\">plugin de WordPress<\/a>, un paso crucial es preinstalar los datos esenciales, para garantizar que el plugin funcione sin problemas desde el principio. Tomemos, por ejemplo, un plugin de gesti\u00f3n de eventos. Una vez instalado, es enormemente beneficioso si el plugin genera autom\u00e1ticamente una p\u00e1gina titulada <strong>Pr\u00f3ximos eventos<\/strong>, mostrando una lista de eventos futuros.<\/p>\n<p>Esta p\u00e1gina preconfigurada, incrustada con un shortcode como <code>[event_list number=\"10\" scope=\"future\" status=\"publish\"]<\/code>, permite a los usuarios aprovechar inmediatamente las capacidades del plugin sin necesidad de leer su documentaci\u00f3n.<\/p>\n<p>La instalaci\u00f3n de datos no s\u00f3lo es \u00fatil cuando se instala el plugin por primera vez, sino tambi\u00e9n cuando se actualiza posteriormente. Por ejemplo, si una actualizaci\u00f3n introduce una funci\u00f3n de vista de calendario, el plugin puede crear autom\u00e1ticamente una nueva p\u00e1gina, <strong>Calendario de eventos<\/strong>, que muestre esta incorporaci\u00f3n mediante un shortcode como <code>[event_calendar status=\"publish\"]<\/code>.<\/p>\n<p>En general, el alcance de la instalaci\u00f3n de los datos abarca varias necesidades:<\/p>\n<ul>\n<li>Generar nuevas p\u00e1ginas con t\u00edtulos y contenidos espec\u00edficos.<\/li>\n<li>A\u00f1adir entradas para tipos de entrada personalizados (CPTs, custom post types) creados por el plugin.<\/li>\n<li>Insertar configuraciones predeterminadas en la tabla <code>wp_options<\/code><\/li>\n<li>Asignar nuevas capacidades a los roles de usuario<\/li>\n<li>Asignar metadatos a los usuarios, para funciones nuevas o actualizadas proporcionadas por el plugin (por ejemplo, los usuarios podr\u00edan cambiar el formato de la fecha del evento, y se a\u00f1ade primero un valor por defecto para todos los usuarios)<\/li>\n<li>Crear categor\u00edas de uso com\u00fan en el contexto del plugin, como \u00abconferencias\u00bb o \u00abdeportes\u00bb<\/li>\n<\/ul>\n<p>La instalaci\u00f3n de datos debe ser un proceso incremental, de lo contrario podr\u00edamos crear entradas duplicadas.<\/p>\n<p>Por ejemplo, si la versi\u00f3n 1.1 de un plugin introduce una p\u00e1gina de <strong>Pr\u00f3ximos Eventos<\/strong> y un usuario actualiza desde la versi\u00f3n 1.0, s\u00f3lo deben instalarse los nuevos datos relevantes para la versi\u00f3n 1.1. Esta actualizaci\u00f3n incremental garantiza que cuando salga la versi\u00f3n 1.2 con la funci\u00f3n de calendario, s\u00f3lo se a\u00f1ada la nueva p\u00e1gina <strong>Calendario de Eventos<\/strong>, evitando cualquier duplicaci\u00f3n de la p\u00e1gina <strong>Pr\u00f3ximos Eventos<\/strong>.<\/p>\n<p>Por lo tanto, cuando se actualiza, el plugin debe recuperar qu\u00e9 versi\u00f3n anterior estaba instalada, e instalar los datos que corresponden s\u00f3lo a la(s) nueva(s) versi\u00f3n(es).<\/p>\n<p>Este art\u00edculo explica c\u00f3mo instalar los datos iniciales, y seguir a\u00f1adiendo nuevos datos con las actualizaciones posteriores, en nuestros plugins de 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>Proporcionando la versi\u00f3n actual<\/h2>\n<p>Para manejar el proceso incremental, el plugin debe hacer un seguimiento de su versi\u00f3n actual, normalmente declarada en la <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/#header-fields\" target=\"_blank\" rel=\"noopener noreferrer\">cabecera del archivo principal del plugin<\/a>. Pero, por supuesto, no podemos referenciarlo directamente desde ah\u00ed, ya que est\u00e1 dentro de un comentario <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-php\/\">PHP<\/a>. As\u00ed que tambi\u00e9n definimos este valor en una variable y se lo proporcionamos a una clase de <code>Plugin<\/code> responsable de la inicializaci\u00f3n y la configuraci\u00f3n:<\/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 clase <code>Plugin<\/code>, aprovechando la <a href=\"https:\/\/kinsta.com\/es\/blog\/php-8\/#constructor-property-promotion\">funci\u00f3n de promoci\u00f3n de propiedades del Constructor de PHP 8.0<\/a>, almacena esta versi\u00f3n, para que podamos hacer referencia a ella m\u00e1s adelante:<\/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>Observa c\u00f3mo la l\u00f3gica para inicializar y configurar el plugin se a\u00f1ade al m\u00e9todo <code>setup<\/code>, no al constructor. Esto se debe a que el constructor debe evitar producir efectos secundarios; de lo contrario, podr\u00edamos producir errores al extender o componer la clase <code>Plugin<\/code>.<\/p>\n<p>Veamos c\u00f3mo podr\u00eda ocurrir. Supongamos que a\u00f1adimos una clase <code>BetterPlugin<\/code> que compone funciones de la clase <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>Cada vez que se ejecuta <code>new Plugin()<\/code> dentro de <code>printSomething<\/code>, se crea una nueva instancia de <code>Plugin<\/code>. Si la l\u00f3gica de configuraci\u00f3n se a\u00f1adiera al constructor, se ejecutar\u00eda cada vez que cre\u00e1ramos un nuevo objeto <code>Plugin<\/code>. En nuestro caso, queremos crear la p\u00e1gina <strong>Pr\u00f3ximos Eventos<\/strong> una sola vez, no varias. A\u00f1adiendo la l\u00f3gica al m\u00e9todo <code>setup<\/code>, podemos evitar este problema.<\/p>\n<h2>Seguimiento de la versi\u00f3n anterior<\/h2>\n<p>WordPress no proporciona una forma sencilla de recuperar la versi\u00f3n del plugin que se va a sustituir. Por lo tanto, debemos almacenar este valor por nosotros mismos en la tabla <code>wp_options<\/code> de la <a href=\"https:\/\/kinsta.com\/database\/\">base de datos<\/a>.<\/p>\n<p>Almacena la versi\u00f3n en la entrada <code>\"myplugin_version\"<\/code>, donde <code>myplugin_<\/code> es el nombre del plugin (por ejemplo <code>eventsmanager_version<\/code>). Es importante anteponer siempre a todos nuestros ajustes <code>myplugin_<\/code>, para evitar posibles conflictos, ya que no podemos estar seguros de que otro plugin no a\u00f1ada una opci\u00f3n <code>version<\/code>.<\/p>\n<p>Al cargar el plugin en cada solicitud, <code>Plugin<\/code> ya sabr\u00e1 cu\u00e1l es la versi\u00f3n actual (de la propiedad <code>$pluginVersion<\/code> anterior), y recuperar\u00e1 la \u00faltima versi\u00f3n almacenada en la base de datos. Esta comparaci\u00f3n determina el estado del plugin:<\/p>\n<ul>\n<li><strong>Nueva instalaci\u00f3n<\/strong>: detecta si la base de datos carece de una entrada de versi\u00f3n para el plugin, lo que indica que es la primera vez que se instala (es decir, <code>$storedPluginVersion<\/code> es <code>null<\/code>)<\/li>\n<li><strong>Actualizaci\u00f3n<\/strong>: se identifica cuando la versi\u00f3n actual supera la versi\u00f3n almacenada en la base de datos, lo que indica una necesidad de actualizaci\u00f3n.<\/li>\n<li>De lo contrario, no hay cambios<\/li>\n<\/ul>\n<p>Siempre que haya un cambio, llamamos a <code>prepareAndInstallPluginSetupData<\/code> para que instale los datos adecuados, ya sea para una nueva instalaci\u00f3n (en cuyo caso debe instalar todos los datos de todas las versiones) o para una actualizaci\u00f3n (instala s\u00f3lo los datos de todas las versiones nuevas). La variable anulable <code>$previousVersion<\/code> indica de qu\u00e9 situaci\u00f3n se trata (<code>$previousVersion<\/code> es <code>null<\/code> =&gt; nueva instalaci\u00f3n).<\/p>\n<p>Despu\u00e9s de llamar a este m\u00e9todo, tambi\u00e9n debemos almacenar la versi\u00f3n actual del plugin en la base de datos, convirti\u00e9ndose en la nueva versi\u00f3n \u00ab\u00faltima almacenada\u00bb. Esto debe hacerse despu\u00e9s de llamar a <code>prepareAndInstallPluginSetupData<\/code> para que, si este m\u00e9todo produce un error (por ejemplo, lanzando un <code>RuntimeException<\/code>) y los datos no se instalan, la versi\u00f3n anterior siga almacenada en la base de datos, y se intente una nueva ronda de instalaci\u00f3n de datos en la siguiente solicitud.<\/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>Observa que <code>prepareAndInstallPluginSetupData<\/code> (y la posterior actualizaci\u00f3n de la BD) se ejecuta en el <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\">hook de acci\u00f3n <code>init<\/code><\/a>. Esto es para asegurarse de que todos los datos del CMS est\u00e1n listos para su recuperaci\u00f3n y manipulaci\u00f3n.<\/p>\n<p>En particular, <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#description\" target=\"_blank\" rel=\"noopener noreferrer\">no se puede acceder<\/a> a <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-una-taxonomia\/\">las taxonom\u00edas<\/a> (etiquetas y categor\u00edas) antes del hook <code>init<\/code> . Si el proceso de instalaci\u00f3n del plugin necesitara crear una entrada CPT y asignarle una categor\u00eda personalizada, este proceso s\u00f3lo podr\u00eda ejecutarse a partir del hook <code>init<\/code>.<\/p>\n<p>Acceder a la \u00faltima versi\u00f3n almacenada desde la BD en cada petici\u00f3n no es lo ideal desde el <a href=\"https:\/\/kinsta.com\/es\/blog\/optimizacion-de-bases-de-datos-wordpress\/\">punto de vista del rendimiento<\/a>. Para mejorar esto, combina todas las opciones que necesita el plugin en un array, almac\u00e9nalas en una \u00fanica entrada y accede a todas ellas con una \u00fanica llamada a la BD.<\/p>\n<p>Por ejemplo, si el plugin tambi\u00e9n necesitara almacenar una opci\u00f3n <code>myplugin_date_format<\/code> para mostrar la fecha del evento, podemos crear una \u00fanica entrada <code>myplugin_options<\/code> con las propiedades <code>version<\/code> y <code>date_format<\/code>.<\/p>\n<p>Para acceder a la \u00faltima versi\u00f3n almacenada, hay que adaptar entonces el c\u00f3digo PHP de la siguiente manera:<\/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>Evitar peticiones concurrentes instalando datos duplicados<\/h2>\n<p>Existe la posibilidad de que el proceso de instalaci\u00f3n se active m\u00e1s de una vez si dos o m\u00e1s usuarios acceden al <a href=\"https:\/\/kinsta.com\/es\/blog\/panel-control-administracion-wordpress\/\">wp-admin<\/a> exactamente al mismo tiempo. Para evitar que los mismos datos se instalen dos o m\u00e1s veces, utilizamos un <a href=\"https:\/\/developer.wordpress.org\/apis\/transients\/\" target=\"_blank\" rel=\"noopener noreferrer\">transient<\/a> como bandera para permitir que s\u00f3lo la primera petici\u00f3n instale los datos:<\/p>\n<ul>\n<li>Comprueba si existe el transitorio <code>myplugin_installing_plugin_setup_data<\/code> (una vez m\u00e1s, este nombre debe ir precedido de <code>myplugin_<\/code>); si es as\u00ed, no hagas nada (ya que alg\u00fan otro proceso est\u00e1 instalando los datos)<\/li>\n<li>En caso contrario, almacena el transitorio en la base de datos durante un tiempo m\u00e1ximo razonable para instalar los datos (por ejemplo, 30 segundos)<\/li>\n<li>Instala los datos<\/li>\n<li>Elimina el transitorio<\/li>\n<\/ul>\n<p>Aqu\u00ed tienes el 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>Instalar los datos para todas las versiones<\/h2>\n<p>Como ya hemos dicho, si actualizamos el plugin, s\u00f3lo debemos instalar los datos de las nuevas versiones, no de todas. Eso significa que tenemos que gestionar qu\u00e9 datos instalar versi\u00f3n por versi\u00f3n.<\/p>\n<p>En el siguiente c\u00f3digo, el array <code>$versionCallbacks<\/code> indica qu\u00e9 funci\u00f3n ejecutar para cada versi\u00f3n con la funci\u00f3n que ejecuta la l\u00f3gica para instalar los datos. Iteramos la lista de todas ellas, comparamos cada una con la versi\u00f3n anterior utilizando <code>version_compare<\/code> y, si es mayor, ejecutamos la funci\u00f3n correspondiente para instalar los datos correspondientes.<\/p>\n<p>Observa que si <code>$previousVersion<\/code> es <code>null<\/code> (es decir, es una nueva instalaci\u00f3n), entonces se ejecutan todas las funciones.<\/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>Instalar los datos para cada versi\u00f3n espec\u00edfica<\/h2>\n<p>Por \u00faltimo, debemos instalar los datos reales (crear una p\u00e1gina, una entrada CPT, a\u00f1adir una opci\u00f3n, etc.) para cada versi\u00f3n.<\/p>\n<p>En este c\u00f3digo, a\u00f1adimos la p\u00e1gina <strong>Pr\u00f3ximos Eventos<\/strong> para el plugin del gestor 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>A continuaci\u00f3n, creamos la p\u00e1gina <strong>Calendario de Eventos<\/strong> para <code>v1.2<\/code> (en este caso, utilizando <a href=\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\">bloques Gutenberg<\/a> en la p\u00e1gina, a\u00f1adiendo un bloque personalizado llamado <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 el c\u00f3digo junto<\/h2>\n<p>\u00a1Ya hemos terminado! Todo el <a href=\"https:\/\/github.com\/GatoGraphQL\/GatoGraphQL\/blob\/9af936db31ac95456502fdd805a4b5658340e3ea\/layers\/GatoGraphQLForWP\/plugins\/gatographql\/src\/Plugin.php#L255\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo PHP de la clase <code>Plugin<\/code><\/a>, que contiene la l\u00f3gica para rastrear la versi\u00f3n del plugin e instalar los datos apropiados, es este:<\/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>Resumen<\/h2>\n<p>Los plugins de WordPress a menudo necesitan instalar datos al instalarse. Adem\u00e1s, a medida que las nuevas versiones del plugin proporcionan nuevas funciones, el plugin tambi\u00e9n puede necesitar instalar datos cuando se actualiza.<\/p>\n<p>En este art\u00edculo, hemos aprendido a realizar un seguimiento de las versiones y a instalar los datos adecuados para nuestros plugins.<\/p>\n<p><em>\u00bfTienes un plugin de WordPress que pueda beneficiarse de la instalaci\u00f3n de datos? H\u00e1znoslo saber en los comentarios.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Al desarrollar un plugin de WordPress, un paso crucial es preinstalar los datos esenciales, para garantizar que el plugin funcione sin problemas desde el principio. Tomemos, &#8230;<\/p>\n","protected":false},"author":196,"featured_media":74231,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1316,1352],"class_list":["post-74230","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-funcion-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>Instalaci\u00f3n de los datos de configuraci\u00f3n de un plugin de WordPress - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de 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\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Instalar los datos de configuraci\u00f3n de un plugin de WordPress\" \/>\n<meta property=\"og:description\" content=\"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de WordPress.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-04T16:57:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-09T08:16:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/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=\"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de WordPress.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin-1024x512.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@losoviz\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Leonardo Losoviz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\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\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\"},\"author\":{\"name\":\"Leonardo Losoviz\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\"},\"headline\":\"Instalar los datos de configuraci\u00f3n de un plugin de WordPress\",\"datePublished\":\"2024-04-04T16:57:16+00:00\",\"dateModified\":\"2024-04-09T08:16:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\"},\"wordCount\":1627,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\",\"name\":\"Instalaci\u00f3n de los datos de configuraci\u00f3n de un plugin de WordPress - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"datePublished\":\"2024-04-04T16:57:16+00:00\",\"dateModified\":\"2024-04-09T08:16:30+00:00\",\"description\":\"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de WordPress.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Plugins de WordPress\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Instalar los datos de configuraci\u00f3n de un plugin de WordPress\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"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\/es\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\",\"name\":\"Leonardo Losoviz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/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\/es\/blog\/author\/leonardolosoviz\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Instalaci\u00f3n de los datos de configuraci\u00f3n de un plugin de WordPress - Kinsta\u00ae","description":"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de 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\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/","og_locale":"es_ES","og_type":"article","og_title":"Instalar los datos de configuraci\u00f3n de un plugin de WordPress","og_description":"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de WordPress.","og_url":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2024-04-04T16:57:16+00:00","article_modified_time":"2024-04-09T08:16:30+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","type":"image\/jpeg"}],"author":"Leonardo Losoviz","twitter_card":"summary_large_image","twitter_description":"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de WordPress.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin-1024x512.jpg","twitter_creator":"@losoviz","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Leonardo Losoviz","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/"},"author":{"name":"Leonardo Losoviz","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238"},"headline":"Instalar los datos de configuraci\u00f3n de un plugin de WordPress","datePublished":"2024-04-04T16:57:16+00:00","dateModified":"2024-04-09T08:16:30+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/"},"wordCount":1627,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/","url":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/","name":"Instalaci\u00f3n de los datos de configuraci\u00f3n de un plugin de WordPress - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","datePublished":"2024-04-04T16:57:16+00:00","dateModified":"2024-04-09T08:16:30+00:00","description":"Esta gu\u00eda explica c\u00f3mo instalar datos iniciales, y seguir a\u00f1adiendo nuevos datos con actualizaciones posteriores, en nuestros plugins de WordPress.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/datos-de-instalacion-de-plugins-de-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Plugins de WordPress","item":"https:\/\/kinsta.com\/es\/secciones\/plugins-wordpress\/"},{"@type":"ListItem","position":3,"name":"Instalar los datos de configuraci\u00f3n de un plugin de WordPress"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","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\/es\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238","name":"Leonardo Losoviz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/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\/es\/blog\/author\/leonardolosoviz\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/74230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/196"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=74230"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/74230\/revisions"}],"predecessor-version":[{"id":74504,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/74230\/revisions\/74504"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/translations\/jp"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/74230\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/74231"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=74230"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=74230"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=74230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}