{"id":75001,"date":"2024-05-14T16:42:54","date_gmt":"2024-05-14T14:42:54","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=75001&#038;preview=true&#038;preview_id=75001"},"modified":"2024-05-24T15:51:56","modified_gmt":"2024-05-24T13:51:56","slug":"crear-extension-chrome","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/","title":{"rendered":"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React"},"content":{"rendered":"<p>Como usuario de <a href=\"https:\/\/kinsta.com\/es\/blog\/microsoft-edge-vs-chrome\/\">Google Chrome<\/a>, probablemente hayas utilizado algunas extensiones en ese navegador. \u00bfTe has preguntado alguna vez c\u00f3mo se construyen o si t\u00fa podr\u00edas construir una?<\/p>\n<p>Este art\u00edculo te gu\u00eda a trav\u00e9s del proceso de creaci\u00f3n de una extensi\u00f3n de Chrome, concretamente una que utiliza React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.<\/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>\u00bfQu\u00e9 es una extensi\u00f3n de Chrome?<\/h2>\n<p>Una extensi\u00f3n de Chrome es un programa que se instala en el navegador Chrome y mejora su funcionalidad. Las extensiones pueden ir desde simples botones con iconos en la barra de herramientas hasta funciones totalmente integradas que interact\u00faan profundamente con tu experiencia de navegaci\u00f3n.<\/p>\n<h2>C\u00f3mo crear una extensi\u00f3n de Chrome<\/h2>\n<p>Crear una extensi\u00f3n de Chrome es similar a desarrollar una <a href=\"https:\/\/kinsta.com\/es\/blog\/arquitectura-aplicaciones-web\/\">aplicaci\u00f3n web<\/a>, pero requiere un archivo con formato JSON llamado <strong>manifest.json<\/strong>. Este archivo act\u00faa como la columna vertebral de la extensi\u00f3n, dictando su configuraci\u00f3n, permisos y funcionalidades que desees incluir.<\/p>\n<p>Para empezar, crea una carpeta que contenga todos los archivos de tu extensi\u00f3n. A continuaci\u00f3n, crea un archivo <strong>manifest.json<\/strong> en la carpeta.<\/p>\n<p>Un archivo <strong>manifest.json<\/strong> b\u00e1sico para una extensi\u00f3n de Chrome incluye propiedades clave que definen la configuraci\u00f3n b\u00e1sica de la extensi\u00f3n. A continuaci\u00f3n se muestra un ejemplo de archivo <strong>manifest.json<\/strong> que incluye los campos necesarios para que funcione:<\/p>\n<pre><code class=\"language-json\">{\n  \"manifest_version\": 3,\n  \"name\": \"My Chrome extension\",\n  \"version\": \"1.0\",\n  \"description\": \"Here is a description for my Chrome extension.\"\n}<\/code><\/pre>\n<p>Puedes cargarlo y probarlo como una extensi\u00f3n desempaquetada en Chrome. Ve a <code>chrome:\/\/extensions<\/code> en tu navegador y activa el <strong>modo Desarrollador<\/strong>, luego haz clic en el bot\u00f3n <strong>Load Unpacked (Cargar Descomprimida)<\/strong>. Se abrir\u00e1 un explorador de archivos y podr\u00e1s seleccionar el directorio que creaste para tu extensi\u00f3n.<\/p>\n<figure style=\"width: 1001px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2024\/04\/load-extension.png\" alt=\"Carga una extensi\u00f3n de Chrome haciendo clic en Load unpacked (Cargar descomprimida) en modo desarrollador\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Carga una extensi\u00f3n de Chrome haciendo clic en Load unpacked (Cargar descomprimida) en modo desarrollador.<\/figcaption><\/figure>\n<p>Cuando hagas clic en el icono de la extensi\u00f3n, no ocurrir\u00e1 nada porque no has creado una interfaz de usuario.<\/p>\n<h3>Crear una interfaz de usuario (popup) para tu extensi\u00f3n de Chrome<\/h3>\n<p>Como en cualquier aplicaci\u00f3n web, la interfaz de usuario (IU) de tu extensi\u00f3n utiliza <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-el-html\/\">HTML<\/a> para estructurar el contenido, <a href=\"https:\/\/kinsta.com\/es\/blog\/buenas-practicas-css\/\">CSS<\/a> para darle estilo y <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-javascript\/\">JavaScript<\/a> para a\u00f1adir interactividad.<\/p>\n<p>Vamos a crear una IU b\u00e1sica utilizando todos estos archivos. Empieza creando un archivo HTML (<strong>popup.html<\/strong>). Este archivo define la estructura de los elementos de tu IU, como el texto, los encabezados, las im\u00e1genes y los botones. A\u00f1ade el siguiente c\u00f3digo:<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n    &lt;head&gt;\n        &lt;meta charset=\"UTF-8\" \/&gt;\n        &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/&gt;\n        &lt;title&gt;Hello World&lt;\/title&gt;\n        &lt;link rel=\"stylesheet\" href=\"popup.css\" \/&gt;\n    &lt;\/head&gt;\n    &lt;body&gt;\n        &lt;h1&gt;Hello World!&lt;\/h1&gt;\n        &lt;p&gt;My first Chrome Extension&lt;\/p&gt;\n        &lt;button&gt; id=\"sayHello\"&gt;Say Hello&lt;\/button&gt;\n        &lt;script&gt; src=\"popup.js\"&gt;&lt;\/script&gt;\n    &lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>El c\u00f3digo anterior crea un encabezado, un p\u00e1rrafo y un bot\u00f3n. Los archivos CSS y JavaScript tambi\u00e9n est\u00e1n enlazados. Ahora, a\u00f1ade algunos estilos en el archivo <strong>popup.css<\/strong>:<\/p>\n<pre><code class=\"language-css\">* {\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n}\n\nbody {\n    font-family: Arial, sans-serif;\n    background-color: aliceblue;\n    padding: 20px;\n}<\/code><\/pre>\n<p>A continuaci\u00f3n, en el archivo <strong>popup.js<\/strong>, a\u00f1ade un escuchador de eventos al bot\u00f3n para que, cuando se haga clic en \u00e9l, se muestre una alerta:<\/p>\n<pre><code class=\"language-js\">const sayHelloBtn = document.getElementById('sayHello');\nsayHelloBtn.addEventListener('click', async () =&gt; {\n    let tab = await chrome.tabs.query({ active: true });\n    chrome.scripting.executeScript({\n        target: { tabId: tab[0].id },\n        function: () =&gt; alert('Hello from the extension!'),\n    });\n});<\/code><\/pre>\n<p>Este c\u00f3digo JavaScript recupera la pesta\u00f1a activa actual y utiliza el <a href=\"https:\/\/developer.chrome.com\/docs\/extensions\/reference\/api\/scripting\" target=\"_blank\" rel=\"noopener noreferrer\">Chrome Scripting API<\/a> para ejecutar un script que muestre una alerta con un mensaje de saludo cuando se haga clic en el bot\u00f3n <strong>Say Hello<\/strong>. Esto introduce interactividad b\u00e1sica a tu extensi\u00f3n de Chrome.<\/p>\n<p>Con estos pasos, has configurado una sencilla interfaz de usuario emergente para tu extensi\u00f3n de Chrome que incluye texto, estilo y funcionalidad b\u00e1sicos.<\/p>\n<p>Por \u00faltimo, tienes que habilitar el archivo emergente en el archivo <strong>manifest.json<\/strong> a\u00f1adiendo algunos permisos:<\/p>\n<pre><code class=\"language-json\">{\n    . . . ,\n    \"action\": {\n        \"default_popup\": \"popup.html\"\n    },\n    \"permissions\": [\n        \"scripting\",\n        \"tabs\"\n    ],\n    \"host_permissions\": [\n        \"http:\/\/*\/*\",\n        \"https:\/\/*\/*\"\n    ]\n}<\/code><\/pre>\n<p>En la configuraci\u00f3n anterior, la clave <code>default_popup<\/code> especifica que <strong>popup.html<\/strong> ser\u00e1 la IU por defecto cuando el usuario interact\u00fae con la extensi\u00f3n. El array <code>permissions<\/code> incluye <code>scripting<\/code> y <code>tabs<\/code>, que son cruciales para que la extensi\u00f3n interact\u00fae con las pesta\u00f1as y utilice las funciones de scripting del navegador.<\/p>\n<p>El array <code>host_permissions<\/code> especifica con qu\u00e9 sitios puede interactuar tu extensi\u00f3n. Los patrones <code>http:\/\/*\/*<\/code> y <code>https:\/\/*\/*<\/code> indican que tu extensi\u00f3n puede interactuar con todos los sitios web a los que se accede a trav\u00e9s de los protocolos HTTP y HTTPS.<\/p>\n<p>Con estos ajustes en tu archivo <strong>manifest.json<\/strong>, tu extensi\u00f3n de Chrome est\u00e1 correctamente configurada para mostrar una ventana emergente y ejecutar scripts.<\/p>\n<h3>Recarga tu extensi\u00f3n de Chrome<\/h3>\n<p>Con estos cambios efectuados en tu carpeta local, necesitas actualizar la carpeta descomprimida cargada en Chrome. Para ello, abre la p\u00e1gina de extensiones de Chrome, busca tu extensi\u00f3n y haz clic en el icono de recargar.<\/p>\n<figure style=\"width: 1001px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2024\/04\/reload-extension.png\" alt=\"Haz clic en el icono de actualizaci\u00f3n para recargar la extensi\u00f3n.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Haz clic en el icono de actualizaci\u00f3n para recargar la extensi\u00f3n.<\/figcaption><\/figure>\n<p>A continuaci\u00f3n, haz clic en el icono de la extensi\u00f3n y aparecer\u00e1 una ventana emergente. Cuando hagas clic en el bot\u00f3n <strong>Say Hello<\/strong>, aparecer\u00e1 una alerta.<\/p>\n<p>Ahora tienes conocimientos b\u00e1sicos sobre c\u00f3mo empezar a crear una extensi\u00f3n de Chrome. Hay m\u00e1s cosas que se pueden hacer. Puedes manipular la interfaz de usuario de tu sitio web, hacer solicitudes a la API, recuperar datos de URL para realizar operaciones espec\u00edficas, y mucho m\u00e1s.<\/p>\n<h2>C\u00f3mo crear una extensi\u00f3n de Chrome con React<\/h2>\n<p>Como hemos mencionado antes, crear una extensi\u00f3n de Chrome es similar a crear una aplicaci\u00f3n web. Puedes utilizar frameworks populares como <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-react-js\/\">React<\/a>.<\/p>\n<p>Para React, el archivo <strong>manifest.json<\/strong> se crea en la carpeta <strong>public<\/strong>. Esta carpeta se utiliza para los activos est\u00e1ticos que no quieres que sean procesados por <a href=\"https:\/\/kinsta.com\/es\/blog\/rollup-vs-webpack-vs-parcel\/\">Webpack<\/a> (o paquetes similares que React puede utilizar en herramientas como <a href=\"https:\/\/create-react-app.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">Create React App<\/a>).<\/p>\n<p>Cuando construyes tu aplicaci\u00f3n React, el proceso de construcci\u00f3n copia todo el contenido de la carpeta <strong>public<\/strong> en la carpeta <strong>dist<\/strong>. A continuaci\u00f3n te explicamos c\u00f3mo crear una extensi\u00f3n de Chrome con React:<\/p>\n<ol start=\"1\">\n<li>Crea una nueva aplicaci\u00f3n React. Puedes utilizar el entorno de desarrollo local Vite ejecutando el siguiente comando en tu terminal:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">npm create vite@latest<\/code><\/pre>\n<p>A continuaci\u00f3n, da un nombre a tu proyecto y selecciona React como framework. Una vez hecho esto, navega hasta la carpeta del proyecto e instala las dependencias:<\/p>\n<pre><code class=\"language-bash\">cd &lt;project-name&gt;\nnpm install<\/code><\/pre>\n<ol start=\"2\">\n<li>En la carpeta <strong>public<\/strong>\u00a0de tu proyecto React, crea un archivo <strong>manifest.json<\/strong>. A\u00f1ade las siguientes configuraciones:<\/li>\n<\/ol>\n<pre><code class=\"language-json\">{\n    \"manifest_version\": 3,\n    \"name\": \"React Chrome extension\",\n    \"description\": \"Chrome extension built with React\",\n    \"version\": \"0.1.0\",\n    \"action\": {\n        \"default_popup\": \"index.html\"\n    },\n    \"permissions\": [\n        \"tabs\"\n    ],\n    \"host_permissions\": [\n        \"http:\/\/*\/*\",\n        \"https:\/\/*\/*\"\n    ]\n}<\/code><\/pre>\n<p>La configuraci\u00f3n para una extensi\u00f3n de Chrome incluye un objeto <code>action<\/code> que establece <strong>index.html<\/strong> como la ventana emergente predeterminada cuando se hace clic en el icono de la extensi\u00f3n. Este es el archivo HTML est\u00e1tico que se genera cuando construyes tu aplicaci\u00f3n React.<\/p>\n<ol start=\"3\">\n<li>Desarrolla la aplicaci\u00f3n React. Si\u00e9ntete libre de hacer peticiones a la API, darles el estilo que desees, utilizar React Hooks, etc.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Cuando hayas terminado de construir la interfaz de usuario de la extensi\u00f3n, ejecuta el comando build en React (<code>npm run build<\/code>). Todos tus activos, incluyendo tu archivo <strong>manifest.json<\/strong>, el <strong>index.html<\/strong> generado por React y otros, se mueven a la carpeta <strong>dist<\/strong> o <strong>build<\/strong>.<\/li>\n<li>Por \u00faltimo, carga tu extensi\u00f3n en Chrome. Navega a <code>chrome:\/\/extensions\/<\/code> y vuelve a cargar tu extensi\u00f3n.<\/li>\n<\/ol>\n<h2>Crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio con la API de Kinsta<\/h2>\n<p>Este es el aspecto que tendr\u00e1 la extensi\u00f3n de Chrome que vas a crear:<\/p>\n<figure style=\"width: 1001px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2024\/04\/kinsta-api-extension.gif\" alt=\"Extensi\u00f3n de Chrome construida con React interactuando con la API de Kinsta.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Extensi\u00f3n de Chrome construida con React interactuando con la API de Kinsta.<\/figcaption><\/figure>\n<p>Al hacer clic, la extensi\u00f3n muestra una lista de sitios con plugins desactualizados en tu cuenta <a href=\"https:\/\/my.kinsta.com\/?lang=es\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>. Puedes ver una lista de los plugins y hacer clic en el bot\u00f3n <strong>Ver en My Kinsta<\/strong> para navegar a la p\u00e1gina <a href=\"https:\/\/kinsta.com\/es\/docs\/alojamiento-wordpress\/plugins-y-temas-wordpress\/\">Temas y Plugins<\/a> del sitio, donde puedes actualizar cada plugin.<\/p>\n<p>Exploremos c\u00f3mo crear la extensi\u00f3n de Chrome.<\/p>\n<h3>Comprender la API de Kinsta<\/h3>\n<p>La <a href=\"https:\/\/kinsta.com\/es\/docs\/api-kinsta\/\">API de Kinsta<\/a> es una potente herramienta que te permite interactuar mediante programaci\u00f3n con los servicios de Kinsta, como los sitios de WordPress alojados. Puede ayudar a automatizar varias tareas relacionadas con la gesti\u00f3n de WordPress, incluyendo la <a href=\"https:\/\/kinsta.com\/es\/blog\/api-wordpress\/\">creaci\u00f3n de sitios<\/a>, la <a href=\"https:\/\/kinsta.com\/es\/blog\/programar-tareas-api-kinsta\/\">recuperaci\u00f3n de informaci\u00f3n del sitio<\/a>, la <a href=\"https:\/\/kinsta.com\/es\/blog\/kinsta-api-key\/#how-to-use-kinsta-api-to-build-a-status-checker\">obtenci\u00f3n del estado de un sitio<\/a>, la <a href=\"https:\/\/kinsta.com\/es\/blog\/registros-del-servidor-api\/\">b\u00fasqueda<\/a> y <a href=\"https:\/\/kinsta.com\/es\/blog\/copias-de-seguridad-wordpress-con-api-kinsta\/\">restauraci\u00f3n de copias de seguridad<\/a>, y mucho m\u00e1s.<\/p>\n<p>Para utilizar la API de Kinsta, debes tener una cuenta con al menos un sitio de WordPress, una <a href=\"https:\/\/sevalla.com\/application-hosting\/\">aplicaci\u00f3n<\/a> o una <a href=\"https:\/\/sevalla.com\/database-hosting\/\">base de datos<\/a> en MyKinsta. Tambi\u00e9n debes generar una clave API para autenticarte y acceder a tu cuenta.<\/p>\n<p>Para generar una clave API:<\/p>\n<ol start=\"1\">\n<li>Ve a tu panel de <a href=\"https:\/\/my.kinsta.com\/?lang=es\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>.<\/li>\n<li>Ve a la p\u00e1gina Claves API (<strong>Tu nombre<\/strong> &gt; <strong>Configuraci\u00f3n de la empresa <\/strong>&gt; <strong>Claves API<\/strong>).<\/li>\n<li>Haz clic en <strong>Crear Clave API<\/strong>.<\/li>\n<li>Elige una fecha de caducidad o establece una fecha de inicio personalizada y un n\u00famero de horas para que caduque la clave.<\/li>\n<li>Dale a la clave un nombre \u00fanico.<\/li>\n<li>Haz clic en <strong>Generar<\/strong>.<\/li>\n<\/ol>\n<p>Despu\u00e9s de crear una clave API, c\u00f3piala y gu\u00e1rdala en un lugar seguro (se recomienda utilizar un <a href=\"https:\/\/kinsta.com\/es\/blog\/administradores-contrasenas\/\">gestor de contrase\u00f1as<\/a>). Puedes generar varias claves API, que aparecer\u00e1n en la p\u00e1gina <strong>Claves API<\/strong>. Si necesitas revocar una clave API, haz clic en el bot\u00f3n <strong>Revocar<\/strong>.<\/p>\n<h2>Gestionar los plugins de tu sitio con la API de Kinsta y React<\/h2>\n<p>Empecemos desarrollando una interfaz de usuario en React, que luego se transformar\u00e1 en una extensi\u00f3n de Chrome. Esta gu\u00eda asume una familiaridad b\u00e1sica con React y la interacci\u00f3n con la API.<\/p>\n<h3>Configurar el entorno<\/h3>\n<p>En primer lugar, en el archivo <strong>App.jsx<\/strong>, define una constante para la URL de la API de Kinsta para evitar redundancias en tu c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">const KinstaAPIUrl = 'https:\/\/api.kinsta.com\/v2';<\/code><\/pre>\n<p>Por seguridad, almacena los datos sensibles como tu clave API y el ID de la empresa Kinsta en un archivo <strong>.env.local<\/strong> para mantenerlos seguros y fuera de tu c\u00f3digo fuente:<\/p>\n<pre><code class=\"language-bash\">VITE_KINSTA_COMPANY_ID=YOUR_COMPANY_ID\nVITE_KINSTA_API_KEY=YOUR_API_KEY<\/code><\/pre>\n<h3>Obtener datos con la API de Kinsta<\/h3>\n<p>En el archivo <strong>App.jsx<\/strong>, tienes que hacer varias peticiones a la API de Kinsta para recuperar informaci\u00f3n sobre los sitios y sus plugins.<\/p>\n<ol start=\"1\">\n<li><strong>Recuperar los sitios de la empresa:<\/strong> Empieza por obtener una lista de los sitios asociados a tu cuenta de empresa Kinsta. Utiliza el ID de la empresa en una solicitud GET, que devuelve un array con los detalles de los sitios.\n<pre><code class=\"language-jsx\">const getListOfCompanySites = async () =&gt; {\n      const query = new URLSearchParams({\n        company: import.meta.env.VITE_KINSTA_COMPANY_ID,\n      }).toString();\n      const resp = await fetch(`${KinstaAPIUrl}\/sites?${query}`, {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${import.meta.env.VITE_KINSTA_API_KEY}`,\n        },\n      });\n      const data = await resp.json();\n      const companySites = data.company.sites;\n      return companySites;\n    }<\/code><\/pre>\n<\/li>\n<li><strong>Obt\u00e9n los datos del entorno de cada sitio:<\/strong> Para cada sitio, recupera los entornos, que incluyen el ID de entorno necesario para posteriores solicitudes. Esto implica mapear cada sitio y hacer una llamada a la API del endpoint <code>\/sites\/${siteId}\/environments<\/code>.\n<pre><code class=\"language-jsx\"> const companySites = await getListOfCompanySites();\n    \/\/ Get all environments for each site\n\n    const sitesEnvironmentData = companySites.map(async (site) =&gt; {\n      const siteId = site.id;\n      const resp = await fetch(`${KinstaAPIUrl}\/sites\/${siteId}\/environments`, {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${import.meta.env.VITE_KINSTA_API_KEY}`,\n        },\n      });\n      const data = await resp.json();\n      const environments = data.site.environments;\n      return {\n        id: siteId,\n        name: site.display_name,\n        environments: environments,\n      };\n    });<\/code><\/pre>\n<\/li>\n<li><strong>Recupera los plugins para cada entorno de sitio:<\/strong> Por \u00faltimo, utiliza el ID del entorno para obtener los plugins de cada sitio. Este paso implica una funci\u00f3n de mapeo y una llamada a la API del endpoint <code>\/sites\/environments\/${environmentId}\/plugins<\/code> para cada entorno.\n<pre><code class=\"language-jsx\">\/\/ Wait for all the promises to resolve\n    const sitesData = await Promise.all(sitesEnvironmentData);\n\n    \/\/ Get all plugins for each environment\n    const sitesWithPlugin = sitesData.map(async (site) =&gt; {\n      const environmentId = site.environments[0].id;\n      const resp = await fetch(\n        `${KinstaAPIUrl}\/sites\/environments\/${environmentId}\/plugins`,\n        {\n          method: 'GET',\n          headers: {\n            Authorization: `Bearer ${import.meta.env.VITE_KINSTA_API_KEY}`,\n          },\n        }\n      );\n      const data = await resp.json();\n      const plugins = data.environment.container_info;\n      return {\n        env_id: environmentId,\n        name: site.name,\n        site_id: site.id,\n        plugins: plugins,\n      };\n    });<\/code><\/pre>\n<p>Ahora puedes reunir todas estas peticiones en una funci\u00f3n que se utiliza para devolver el array final de sitios con detalles b\u00e1sicos sobre cada sitio y sus plugins:<\/p>\n<pre><code class=\"language-jsx\">const getSitesWithPluginData = async () =&gt; {\n  const getListOfCompanySites = async () =&gt; {\n    const query = new URLSearchParams({\n      company: import.meta.env.VITE_KINSTA_COMPANY_ID,\n    }).toString();\n    const resp = await fetch(`${KinstaAPIUrl}\/sites?${query}`, {\n      method: 'GET',\n      headers: {\n        Authorization: `Bearer ${import.meta.env.VITE_KINSTA_API_KEY}`,\n      },\n    });\n    const data = await resp.json();\n    const companySites = data.company.sites;\n    return companySites;\n  }\n\n  const companySites = await getListOfCompanySites();\n\n  \/\/ Get all environments for each site\n  const sitesEnvironmentData = companySites.map(async (site) =&gt; {\n    const siteId = site.id;\n    const resp = await fetch(`${KinstaAPIUrl}\/sites\/${siteId}\/environments`, {\n      method: 'GET',\n      headers: {\n        Authorization: `Bearer ${import.meta.env.VITE_KINSTA_API_KEY}`,\n      },\n    });\n    const data = await resp.json();\n    const environments = data.site.environments;\n    return {\n      id: siteId,\n      name: site.display_name,\n      environments: environments,\n    };\n  });\n\n  \/\/ Wait for all the promises to resolve\n  const sitesData = await Promise.all(sitesEnvironmentData);\n\n  \/\/ Get all plugins for each environment\n  const sitesWithPlugin = sitesData.map(async (site) =&gt; {\n    const environmentId = site.environments[0].id;\n    const resp = await fetch(\n      `${KinstaAPIUrl}\/sites\/environments\/${environmentId}\/plugins`,\n      {\n        method: 'GET',\n        headers: {\n          Authorization: `Bearer ${import.meta.env.VITE_KINSTA_API_KEY}`,\n        },\n      }\n    );\n    const data = await resp.json();\n    const plugins = data.environment.container_info;\n    return {\n      env_id: environmentId,\n      name: site.name,\n      site_id: site.id,\n      plugins: plugins,\n    };\n  });\n\n  \/\/ Wait for all the promises to resolve\n  const sitesWithPluginData = await Promise.all(sitesWithPlugin);\n  return sitesWithPluginData;\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>Visualizar los datos de los sitios<\/h3>\n<p>Crea un estado con el hook <code>useState<\/code> para almacenar sitios con plugin(s) obsoletos. El hook <code>useEffect<\/code> tambi\u00e9n llamar\u00e1 al m\u00e9todo <code>getSitesWithPluginData()<\/code> y extraer\u00e1 los detalles del sitio cuando se monte el componente.<\/p>\n<p>En el hook <code>useEffect<\/code>, crea una funci\u00f3n que haga un bucle a trav\u00e9s de cada sitio para filtrar los sitios con plugins obsoletos y luego almacenarlos en el estado:<\/p>\n<pre><code class=\"language-jsx\">const [sitesWithOutdatedPlugin, setSitesWithOutdatedPlugin] = useState([]);\nconst [isLoading, setIsLoading] = useState(true);\n\nuseEffect(() =&gt; {\n  const checkSitesWithPluginUpdate = async () =&gt; {\n    const sitesWithPluginData = await getSitesWithPluginData();\n    const sitesWithOutdatedPlugin = sitesWithPluginData.map((site) =&gt; {\n      const plugins = site.plugins.wp_plugins.data;\n      const outdatedPlugins = plugins.filter((plugin) =&gt; plugin.update === \"available\");\n      if (outdatedPlugins.length &gt; 0) {\n        const kinstaDashboardPluginPageURL = `https:\/\/my.kinsta.com\/sites\/plugins\/${site.site_id}\/${site.env_id}?idCompany=${import.meta.env.VITE_KINSTA_COMPANY_ID}`;\n        return {\n          name: site.name,\n          plugins: outdatedPlugins,\n          url: kinstaDashboardPluginPageURL,\n        };\n      }\n    });\n\n    setSitesWithOutdatedPlugin(sitesWithOutdatedPlugin);\n\n  checkSitesWithPluginUpdate();\n  setIsLoading(false);\n}, []);<\/code><\/pre>\n<p>En el c\u00f3digo anterior, observa que el estado de carga tambi\u00e9n se crea y se establece en <code>true<\/code> por defecto. Se utilizar\u00e1 para controlar c\u00f3mo se muestran los datos. Cuando se hayan cargado todos los datos, lo establecemos en <code>false<\/code>.<\/p>\n<p>A continuaci\u00f3n se muestra un marcado para mostrar los datos del sitio y los plugins dentro de tu interfaz de usuario.<\/p>\n<pre><code class=\"language-jsx\">import { useEffect, useState } from \"react\"\nimport KinstaLogo from '.\/assets\/kinsta-logo.png'\nimport PluginPage from '.\/components\/PluginsPage'\n\nfunction App() {\n  \/\/ load the data from the API\n  return (\n    &lt;div className=\"container\"&gt;\n        &lt;div&gt;\n          &lt;div&gt; className=\"title-section\"&gt;\n            &lt;img src={KinstaLogo} className=\"logo\" alt=\"\" \/&gt;\n          &lt;\/div&gt;\n          &lt;p&gt; className=\"info-box\"&gt;\n            Get quick information about your site plugins that need update.\n          &lt;\/p&gt;\n          {isLoading ? (\n            &lt;p&gt;Loading...&lt;\/p&gt;\n          ) : (\n            &lt;&gt;\n              &lt;div className=\"content\"&gt;\n                &lt;p&gt;The following sites have plugins that need to be updated.&lt;\/p&gt;\n                {sitesWithOutdatedPlugin.map((site, index) =&gt; {\n                  return (\n                    &lt;PluginPage key={index} {...site} \/&gt;\n                  );\n                })}\n              &lt;\/div&gt;\n            &lt;\/&gt;\n          )}\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n  )\n}\nexport default App<\/code><\/pre>\n<p>El c\u00f3digo incluye una cabecera con un logotipo y un p\u00e1rrafo informativo. El contenido de la interfaz de usuario se muestra condicionalmente en funci\u00f3n del estado de <code>isLoading<\/code>. Si los datos a\u00fan se est\u00e1n cargando, muestra un mensaje de carga. Una vez cargados los datos, presenta los datos sobre los sitios y los plugins que requieren actualizaciones.<\/p>\n<p>Tambi\u00e9n ver\u00e1s un componente: <code>PluginPage<\/code> (<strong>PluginPage.jsx<\/strong>). Este componente est\u00e1 dise\u00f1ado para mostrar sitios individuales y los detalles de sus plugins. Incluye una funci\u00f3n para cambiar la visibilidad de los detalles de los plugins.<\/p>\n<pre><code class=\"language-jsx\">import { useState } from \"react\"\nimport { FaRegEye } from \"react-icons\/fa\";\nimport { FaRegEyeSlash } from \"react-icons\/fa\";\n\nconst PluginUse = (site) =&gt; {\n    const [viewPlugin, setViewPlugin] = useState(false);\n\n    return (\n        &lt;&gt;\n            &lt;div className=\"site-card\"&gt;\n                &lt;div className=\"site-card-details\"&gt;\n                    &lt;p&gt;{site.name}&lt;\/p&gt;\n                    &lt;div className=\"both-btns\"&gt;\n                        &lt;a&gt; href={site.url} target=\"_blank\" rel=\"noreferrer\" className=\"btn\"&gt;\n                            View in MyKinsta\n                        &lt;\/a&gt;\n                        &lt;button onClick={() =&gt; setViewPlugin(!viewPlugin)} className=\"btn\" title=\"View Plugins\"&gt;\n                            {viewPlugin ? &lt;FaRegEyeSlash \/&gt; : &lt;FaRegEye \/&gt;}\n                        &lt;\/button&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n                {viewPlugin && (\n                    &lt;div className=\"plugin-list\"&gt;\n                        {site.plugins.map((plugin, index) =&gt; {\n                            return (\n                                &lt;div key={index} className=\"plugin-card\"&gt;\n                                    &lt;p&gt;{plugin.name}&lt;\/p&gt;\n                                    &lt;div className=\"plugin-version-info\"&gt;\n                                        &lt;p&gt;Current Version: {plugin.version}&lt;\/p&gt;\n                                        &lt;p&gt;Latest Version: {plugin.update_version}&lt;\/p&gt;\n                                    &lt;\/div&gt;\n                                &lt;\/div&gt;\n                            );\n                        })}\n                    &lt;\/div&gt;\n                )}\n            &lt;\/div&gt;\n        &lt;\/&gt;\n    )\n}\nexport default PluginUse<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Para dar estilo a tu aplicaci\u00f3n, copia el <a href=\"https:\/\/github.com\/olawanlejoel\/plugins-chome-extension\/blob\/main\/src\/index.css\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo CSS de nuestro c\u00f3digo fuente<\/a> y p\u00e9galo en tu propio archivo CSS.<\/p>\n<\/aside>\n\n<h3>Configurar el archivo de manifiesto<\/h3>\n<p>Para transformar tu interfaz de usuario y funcionalidad en una extensi\u00f3n de Chrome, necesitas configurar el archivo <strong>manifest.json<\/strong>.<\/p>\n<p>Crea un archivo <strong>manifest.json<\/strong> en la carpeta <strong>public<\/strong>\u00a0y pega el c\u00f3digo que aparece a continuaci\u00f3n:<\/p>\n<pre><code class=\"language-json\">{\n    \"manifest_version\": 3,\n    \"name\": \"Kinsta Plugins Manager - Thanks to Kinsta API\",\n    \"description\": \"This extension allows you to manage your WordPress site's plugin from Kinsta's MyKinsta dashboard via Kinsta API.\",\n    \"version\": \"0.1.0\",\n    \"icons\": {\n        \"48\": \"kinsta-icon.png\"\n    },\n    \"action\": {\n        \"default_popup\": \"index.html\"\n    },\n    \"permissions\": [\n        \"tabs\"\n    ],\n    \"host_permissions\": [\n        \"https:\/\/my.kinsta.com\/*\"\n    ]\n}<\/code><\/pre>\n<p>Aseg\u00farate de a\u00f1adir el archivo del icono a tu carpeta <strong>public<\/strong>.<\/p>\n<p>En este punto, ya puedes ejecutar el comando build (<code>npm run build<\/code>) para que todos tus activos, incluido tu archivo <strong>manifest.json<\/strong>, el<strong> index.html<\/strong> generado por React y otros archivos, se muevan a la carpeta <strong>dist<\/strong> o <strong>build<\/strong>.<\/p>\n<p>A continuaci\u00f3n, ve a <code>chrome:\/\/extensions\/<\/code> y c\u00e1rgalo como una extensi\u00f3n descomprimida en Chrome. Haz clic en el bot\u00f3n <strong>Load Unpacked (Cargar Descomprimida)<\/strong>\u00a0y selecciona el directorio que has creado para tu extensi\u00f3n.<\/p>\n<h3>Restringir la extensi\u00f3n a sitios espec\u00edficos<\/h3>\n<p>Te habr\u00e1s dado cuenta de que esta extensi\u00f3n funciona en cualquier momento. Queremos que s\u00f3lo funcione cuando un usuario navegue al panel de MyKinsta.<\/p>\n<p>Para ello, vamos a ajustar el archivo <strong>App.jsx<\/strong>. Crea un estado para almacenar la pesta\u00f1a activa:<\/p>\n<pre><code class=\"language-jsx\">const [activeTab, setActiveTab] = useState(null);<\/code><\/pre>\n<p>A continuaci\u00f3n, actualiza el Hook <code>useEffect<\/code> para definir e invocar la funci\u00f3n <code>getCurrentTab<\/code>:<\/p>\n<pre><code class=\"language-jsx\">const getCurrentTab = async () =&gt; {\n  const queryOptions = { active: true, currentWindow: true };\n  const [tab] = await chrome.tabs.query(queryOptions);\n  setActiveTab(tab);\n}\ngetCurrentTab();<\/code><\/pre>\n<p>El c\u00f3digo anterior utiliza <code>chrome.tabs.query<\/code> con opciones de consulta espec\u00edficas para garantizar que s\u00f3lo recupera la pesta\u00f1a activa en la ventana actual. Una vez recuperada la pesta\u00f1a, se establece como pesta\u00f1a activa dentro del estado de la extensi\u00f3n.<\/p>\n<p>Por \u00faltimo, implementa una l\u00f3gica de <a href=\"https:\/\/kinsta.com\/es\/blog\/react-renderizado-condicional\/\">representaci\u00f3n condicional<\/a> en la declaraci\u00f3n de retorno de tu componente. Esto garantiza que la interfaz de usuario de gesti\u00f3n del plugin s\u00f3lo aparezca cuando el usuario se encuentre en el panel de control de MyKinsta:<\/p>\n<pre><code class=\"language-jsx\">return (\n  &lt;div className=\"container\"&gt;\n    {activeTab?.url.includes('my.kinsta.com') ? (\n      &lt;div &gt;\n        &lt;div className=\"title-section\"&gt;\n          &lt;img src={KinstaLogo} className=\"logo\" alt=\"\" \/&gt;\n        &lt;\/div&gt;\n        &lt;p className=\"info-box\"&gt;\n          Get quick information about your site plugins that need update.\n        &lt;\/p&gt;\n        {isLoading ? (\n          &lt;p&gt;Loading...&lt;\/p&gt;\n        ) : (\n          &lt;&gt;\n            &lt;div className=\"content\"&gt;\n              &lt;p&gt;The following {sitesWithPluginUpdate} sites have plugins that need to be updated.&lt;\/p&gt;\n              {sitesWithOutdatedPlugin.map((site, index) =&gt; {\n                return (\n                  &lt;PluginPage key={index} {...site} \/&gt;\n                );\n              })}\n            &lt;\/div &gt;\n          &lt;\/&gt;\n        )}\n      &lt;\/div &gt;\n    ) : (\n      &lt;div &gt;\n        &lt;div className=\"title-section\"&gt;\n          &lt;img src={KinstaLogo} className=\"logo\" alt=\"\" \/&gt;\n        &lt;\/div&gt;\n        &lt;p className=\"info-box\"&gt;\n          This extension is only available on Kinsta Dashboard.\n        &lt;\/p&gt;\n      &lt;\/div&gt;\n    )}\n  &lt;\/div&gt;\n)<\/code><\/pre>\n<p>Tras realizar los cambios, reconstruye tu aplicaci\u00f3n y vuelve a cargar la extensi\u00f3n de Chrome. Esto aplicar\u00e1 la nueva l\u00f3gica y las restricciones.<\/p>\n<h2>Resumen<\/h2>\n<p>En este art\u00edculo, has aprendido los fundamentos de la creaci\u00f3n de una extensi\u00f3n de Chrome y c\u00f3mo crear una con React. Tambi\u00e9n has aprendido a crear una extensi\u00f3n que interact\u00faa con la API de Kinsta.<\/p>\n<p>Como usuario de Kinsta, puedes aprovechar el enorme potencial y flexibilidad que aporta la API de Kinsta, ya que te ayuda a desarrollar soluciones personalizadas para gestionar tus sitios, aplicaciones y bases de datos.<\/p>\n<p><em>\u00bfQu\u00e9 endpoint de la API de Kinsta has utilizado mucho y c\u00f3mo lo has usado? \u00a1Comp\u00e1rtelo con nosotros en la secci\u00f3n de comentarios!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como usuario de Google Chrome, probablemente hayas utilizado algunas extensiones en ese navegador. \u00bfTe has preguntado alguna vez c\u00f3mo se construyen o si t\u00fa podr\u00edas construir &#8230;<\/p>\n","protected":false},"author":287,"featured_media":75002,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1270,1289,1321,1297],"class_list":["post-75001","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","topic-google-chrome","topic-react","topic-tutoriales-javascript"],"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>Crea una extensi\u00f3n para Chrome con la API de Kinsta y React - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.\" \/>\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\/crear-extension-chrome\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React\" \/>\n<meta property=\"og:description\" content=\"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/\" \/>\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-05-14T14:42:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-24T13:51:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.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=\"Joel Olawanle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react-1024x512.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@olawanle_joel\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React\",\"datePublished\":\"2024-05-14T14:42:54+00:00\",\"dateModified\":\"2024-05-24T13:51:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/\"},\"wordCount\":2499,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/\",\"name\":\"Crea una extensi\u00f3n para Chrome con la API de Kinsta y React - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"datePublished\":\"2024-05-14T14:42:54+00:00\",\"dateModified\":\"2024-05-24T13:51:56+00:00\",\"description\":\"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google Chrome\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/google-chrome\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React\"}]},{\"@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\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"caption\":\"Joel Olawanle\"},\"description\":\"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.\",\"sameAs\":[\"https:\/\/joelolawanle.com\/\",\"https:\/\/www.linkedin.com\/in\/olawanlejoel\/\",\"https:\/\/x.com\/olawanle_joel\",\"https:\/\/www.youtube.com\/@joelolawanle\"],\"gender\":\"male\",\"knowsAbout\":[\"JavaScript\",\"React\",\"Next.js\"],\"knowsLanguage\":[\"English\"],\"jobTitle\":\"Technical Editor\",\"worksFor\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Crea una extensi\u00f3n para Chrome con la API de Kinsta y React - Kinsta\u00ae","description":"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.","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\/crear-extension-chrome\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React","og_description":"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.","og_url":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2024-05-14T14:42:54+00:00","article_modified_time":"2024-05-24T13:51:56+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","type":"image\/jpeg"}],"author":"Joel Olawanle","twitter_card":"summary_large_image","twitter_description":"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react-1024x512.jpg","twitter_creator":"@olawanle_joel","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Joel Olawanle","Tiempo de lectura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React","datePublished":"2024-05-14T14:42:54+00:00","dateModified":"2024-05-24T13:51:56+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/"},"wordCount":2499,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/","url":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/","name":"Crea una extensi\u00f3n para Chrome con la API de Kinsta y React - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","datePublished":"2024-05-14T14:42:54+00:00","dateModified":"2024-05-24T13:51:56+00:00","description":"Aprende a crear una extensi\u00f3n de Chrome con React y la API de Kinsta para gestionar plugins en sitios de WordPress alojados con Kinsta.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/crear-extension-chrome\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Google Chrome","item":"https:\/\/kinsta.com\/es\/secciones\/google-chrome\/"},{"@type":"ListItem","position":3,"name":"C\u00f3mo crear una extensi\u00f3n de Chrome para gestionar los plugins de tu sitio web con la API de Kinsta y React"}]},{"@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\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","caption":"Joel Olawanle"},"description":"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.","sameAs":["https:\/\/joelolawanle.com\/","https:\/\/www.linkedin.com\/in\/olawanlejoel\/","https:\/\/x.com\/olawanle_joel","https:\/\/www.youtube.com\/@joelolawanle"],"gender":"male","knowsAbout":["JavaScript","React","Next.js"],"knowsLanguage":["English"],"jobTitle":"Technical Editor","worksFor":"Kinsta","url":"https:\/\/kinsta.com\/es\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/75001","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\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=75001"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/75001\/revisions"}],"predecessor-version":[{"id":75239,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/75001\/revisions\/75239"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/translations\/es"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/75001\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/75002"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=75001"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=75001"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=75001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}