{"id":68294,"date":"2024-05-14T11:44:33","date_gmt":"2024-05-14T14:44:33","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=68294&#038;preview=true&#038;preview_id=68294"},"modified":"2024-05-29T09:46:28","modified_gmt":"2024-05-29T12:46:28","slug":"criar-extensao-chrome","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/","title":{"rendered":"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React"},"content":{"rendered":"<p>Como usu\u00e1rio do <a href=\"https:\/\/kinsta.com\/pt\/blog\/microsoft-edge-vs-chrome\/\">Google Chrome<\/a>, voc\u00ea provavelmente j\u00e1 usou algumas extens\u00f5es nesse navegador. Voc\u00ea j\u00e1 se perguntou como elas s\u00e3o criadas, ou se voc\u00ea poderia criar uma?<\/p>\n<p>Este artigo orienta voc\u00ea no processo de cria\u00e7\u00e3o de uma extens\u00e3o do Chrome, especificamente uma que usa o React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na 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>O que \u00e9 uma extens\u00e3o do Chrome?<\/h2>\n<p>Uma extens\u00e3o do Chrome \u00e9 um programa instalado no navegador Chrome que aprimora sua funcionalidade. As extens\u00f5es podem variar de simples bot\u00f5es de \u00edcones na barra de ferramentas a recursos totalmente integrados que interagem profundamente com sua experi\u00eancia de navega\u00e7\u00e3o.<\/p>\n<h2>Como criar uma extens\u00e3o do Chrome<\/h2>\n<p>A cria\u00e7\u00e3o de uma extens\u00e3o do Chrome \u00e9 semelhante ao desenvolvimento de um <a href=\"https:\/\/kinsta.com\/pt\/blog\/arquitetura-aplicativos-web\/\">aplicativo web<\/a>, mas requer um arquivo formatado em JSON chamado <strong>manifest.json<\/strong>. Esse arquivo funciona como a espinha dorsal da extens\u00e3o, determinando suas configura\u00e7\u00f5es, as permiss\u00f5es e as funcionalidades que voc\u00ea deseja incluir.<\/p>\n<p>Para come\u00e7ar, crie uma pasta que conter\u00e1 todos os arquivos da extens\u00e3o. Em seguida, crie um arquivo <strong>manifest.json<\/strong> na pasta.<\/p>\n<p>Um arquivo <strong>manifest.json<\/strong> b\u00e1sico para uma extens\u00e3o do Chrome inclui as principais propriedades que definem as configura\u00e7\u00f5es b\u00e1sicas da extens\u00e3o. Abaixo est\u00e1 um exemplo de um arquivo <strong>manifest.json<\/strong> que inclui os campos necess\u00e1rios para funcionar:<\/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>Voc\u00ea pode carregar e testar isso como uma extens\u00e3o descompactada do Chrome. Navegue at\u00e9 <code>chrome:\/\/extensions<\/code> em seu navegador, alterne para o <strong>Developer mode <\/strong>e clique no bot\u00e3o <strong>Load Unpacked<\/strong> (Carregar descompactado). Isso abrir\u00e1 um navegador de arquivos, e voc\u00ea poder\u00e1 selecionar o diret\u00f3rio que criou para a sua extens\u00e3o.<\/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=\"Carregue uma extens\u00e3o do Chrome clicando em Load unpacked no modo de desenvolvedor.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Carregue uma extens\u00e3o do Chrome clicando em Load unpacked no modo de desenvolvedor.<\/figcaption><\/figure>\n<p>Quando voc\u00ea clicar no \u00edcone da extens\u00e3o, nada acontecer\u00e1, porque voc\u00ea n\u00e3o criou uma interface de usu\u00e1rio.<\/p>\n<h3>Crie uma interface de usu\u00e1rio (pop-up) para sua extens\u00e3o do Chrome<\/h3>\n<p>Como em todo aplicativo web, a interface do usu\u00e1rio (IU) da sua extens\u00e3o usa <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-html\/\">HTML<\/a> para estruturar o conte\u00fado, <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-praticas-css\/\">CSS<\/a> para estiliz\u00e1-lo e <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-javascript\/\">JavaScript<\/a> para adicionar interatividade.<\/p>\n<p>Vamos criar uma IU b\u00e1sica usando todos esses arquivos. Comece criando um arquivo HTML (<strong>popup.html<\/strong>). Esse arquivo define a estrutura dos elementos da sua interface do usu\u00e1rio, como texto, cabe\u00e7alhos, imagens e bot\u00f5es. Adicione o seguinte 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>O c\u00f3digo acima cria um t\u00edtulo, um par\u00e1grafo e um bot\u00e3o. Os arquivos CSS e JavaScript tamb\u00e9m est\u00e3o vinculados. Agora, adicione alguns estilos no arquivo <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>Em seguida, no arquivo <strong>popup.js<\/strong>, adicione um ouvinte de eventos ao bot\u00e3o para que, quando ele for clicado, seja exibido um 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>Esse c\u00f3digo JavaScript recupera a aba ativa atual e usa a <a href=\"https:\/\/developer.chrome.com\/docs\/extensions\/reference\/api\/scripting\" target=\"_blank\" rel=\"noopener noreferrer\">API de scripts do Chrome<\/a> para executar um script que exibe um alerta com uma mensagem de sauda\u00e7\u00e3o quando o bot\u00e3o <strong>Say Hello<\/strong> \u00e9 clicado. Isso introduz uma interatividade b\u00e1sica em sua extens\u00e3o do Chrome.<\/p>\n<p>Com essas etapas, voc\u00ea configurou uma interface de usu\u00e1rio pop-up simples para sua extens\u00e3o do Chrome que inclui texto, estilo e funcionalidade b\u00e1sicos.<\/p>\n<p>Por fim, voc\u00ea precisa ativar o arquivo pop-up no arquivo <strong>manifest.json<\/strong> adicionando algumas permiss\u00f5es:<\/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>Na configura\u00e7\u00e3o acima, a chave <code>default_popup<\/code> especifica que <strong>popup.html<\/strong> ser\u00e1 a interface do usu\u00e1rio (UI) padr\u00e3o quando o usu\u00e1rio interagir com a extens\u00e3o. O array <code>permissions<\/code> inclui <code>scripting<\/code> e <code>tabs<\/code>, essenciais para que a extens\u00e3o interaja com as abas e use os recursos de script do navegador.<\/p>\n<p>O array <code>host_permissions<\/code> especifica com quais sites sua extens\u00e3o pode interagir. Os padr\u00f5es <code>http:\/\/*\/*<\/code> e <code>https:\/\/*\/*<\/code> indicam que a sua extens\u00e3o pode interagir com todos os sites acessados pelos protocolos HTTP e HTTPS.<\/p>\n<p>Com essas configura\u00e7\u00f5es em seu arquivo <strong>manifest.json<\/strong>, sua extens\u00e3o do Chrome est\u00e1 configurada corretamente para exibir um pop-up e executar scripts.<\/p>\n<h3>Recarregue sua extens\u00e3o do Chrome<\/h3>\n<p>Com essas altera\u00e7\u00f5es efetuadas em sua pasta local, voc\u00ea precisa atualizar a pasta descompactada carregada no Chrome. Para fazer isso, abra a p\u00e1gina de extens\u00f5es do Chrome, localize sua extens\u00e3o e clique no \u00edcone de recarregar.<\/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=\"Clique no \u00edcone de atualiza\u00e7\u00e3o para recarregar a extens\u00e3o.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Clique no \u00edcone de atualiza\u00e7\u00e3o para recarregar a extens\u00e3o.<\/figcaption><\/figure>\n<p>Em seguida, voc\u00ea pode clicar no \u00edcone da extens\u00e3o, e uma janela pop-up ser\u00e1 exibida. Quando voc\u00ea clicar no bot\u00e3o <strong>Say Hello<\/strong>, um alerta ser\u00e1 exibido.<\/p>\n<p>Agora voc\u00ea tem um conhecimento b\u00e1sico de como come\u00e7ar a criar uma extens\u00e3o do Chrome. E d\u00e1 pra fazer muito mais. Voc\u00ea pode manipular a interface do usu\u00e1rio do seu site, fazer solicita\u00e7\u00f5es de API, recuperar dados de URLs para executar opera\u00e7\u00f5es espec\u00edficas, e muito mais.<\/p>\n<h2>Como criar uma extens\u00e3o do Chrome com o React<\/h2>\n<p>Como mencionamos anteriormente, a cria\u00e7\u00e3o de uma extens\u00e3o do Chrome \u00e9 semelhante \u00e0 cria\u00e7\u00e3o de um aplicativo web. Voc\u00ea pode usar frameworks web populares como o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-react-js\/\">React<\/a>.<\/p>\n<p>Para o React, o arquivo <strong>manifest.json<\/strong> \u00e9 criado na pasta <strong>public<\/strong>. Essa pasta \u00e9 usada para ativos est\u00e1ticos que voc\u00ea n\u00e3o deseja que sejam processados pelo <a href=\"https:\/\/kinsta.com\/pt\/blog\/empacotadores-javascript\/\">Webpack<\/a> (ou pacotes semelhantes que o React pode usar internamente em ferramentas como <a href=\"https:\/\/create-react-app.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">Create React App<\/a>).<\/p>\n<p>Quando voc\u00ea cria seu aplicativo React, o processo de build copia todo o conte\u00fado da pasta <strong>public<\/strong>\u00a0para a pasta <strong>dist<\/strong>. Eis como voc\u00ea pode criar uma extens\u00e3o do Chrome com o React:<\/p>\n<ol start=\"1\">\n<li>Crie um novo aplicativo React. Voc\u00ea pode usar o ambiente de desenvolvimento local Vite executando o seguinte comando em seu terminal:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">npm create vite@latest<\/code><\/pre>\n<p>Em seguida, d\u00ea um nome ao seu projeto e selecione React como framework. Feito isso, navegue at\u00e9 a pasta do projeto e instale as depend\u00eancias:<\/p>\n<pre><code class=\"language-bash\">cd &lt;project-name&gt;\nnpm install<\/code><\/pre>\n<ol start=\"2\">\n<li>Na pasta <strong>public<\/strong>\u00a0do seu projeto React, crie um arquivo <strong>manifest.json<\/strong>. Adicione as seguintes configura\u00e7\u00f5es:<\/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>A configura\u00e7\u00e3o de uma extens\u00e3o do Chrome inclui um objeto <code>action<\/code> que define <strong>index.html<\/strong> como o pop-up padr\u00e3o quando voc\u00ea clica no \u00edcone da extens\u00e3o. Esse \u00e9 o arquivo HTML est\u00e1tico gerado quando voc\u00ea cria seu aplicativo React.<\/p>\n<ol start=\"3\">\n<li>Desenvolva o aplicativo React. Sinta-se \u00e0 vontade para fazer solicita\u00e7\u00f5es de API, estiliz\u00e1-las como desejar, usar hooks do React, e mais.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Quando voc\u00ea terminar de criar a interface do usu\u00e1rio da extens\u00e3o, execute o comando de build no React (<code>npm run build<\/code>). Todos os seus ativos, inclusive o arquivo <strong>manifest.json<\/strong>, o <strong>index.html<\/strong> gerado pelo React, e outros, s\u00e3o movidos para a pasta <strong>dist<\/strong> ou <strong>build<\/strong>.<\/li>\n<li>Por fim, carregue sua extens\u00e3o no Chrome. Navegue at\u00e9 <code>chrome:\/\/extensions\/<\/code> e recarregue sua extens\u00e3o.<\/li>\n<\/ol>\n<h2>Criando uma extens\u00e3o do Chrome para gerenciar os plugins do seu site com a API da Kinsta<\/h2>\n<p>Esta \u00e9 a apar\u00eancia da extens\u00e3o do Chrome que voc\u00ea criar\u00e1:<\/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=\"Extens\u00e3o do Chrome criada com React interagindo com a API da Kinsta.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Extens\u00e3o do Chrome criada com React interagindo com a API da Kinsta.<\/figcaption><\/figure>\n<p>Quando clicada, a extens\u00e3o exibe uma lista de sites com plugins desatualizados em sua conta <a href=\"https:\/\/my.kinsta.com\/?lang=pt\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>. Voc\u00ea pode ver uma lista dos plugins e clicar no bot\u00e3o <strong>View in MyKinsta<\/strong> para navegar at\u00e9 a p\u00e1gina <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/wordpress-plugins-temas\/\">Themes &#038; Plugins<\/a> do site, onde poder\u00e1 atualizar cada plugin.<\/p>\n<p>Vamos explorar como voc\u00ea pode criar a extens\u00e3o do Chrome.<\/p>\n<h3>Entendendo a API da Kinsta<\/h3>\n<p>A <a href=\"https:\/\/kinsta.com\/pt\/docs\/kinsta-api\/\">API da Kinsta<\/a> \u00e9 uma ferramenta poderosa que permite que voc\u00ea interaja de forma program\u00e1tica com os servi\u00e7os da Kinsta, como sites WordPress hospedados. Pode ajud\u00e1-lo a automatizar v\u00e1rias tarefas relacionadas ao gerenciamento de WordPress, incluindo <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-api\/\">cria\u00e7\u00e3o de sites<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/agendar-tarefas-api-kinsta\/\">recupera\u00e7\u00e3o de informa\u00e7\u00f5es do site<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/chave-api-kinsta\/#how-to-use-kinsta-api-to-build-a-status-checker\">obter o status de um site<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/registros-do-servidor-api\/\">navega\u00e7\u00e3o<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/backups-wordpress-api\/\">restaura\u00e7\u00e3o de backups<\/a>, e muito mais.<\/p>\n<p>Para usar a API da Kinsta, voc\u00ea deve ter uma conta com pelo menos um site, <a href=\"https:\/\/sevalla.com\/application-hosting\/\">aplicativo<\/a> ou <a href=\"https:\/\/sevalla.com\/database-hosting\/\">banco de dados<\/a> WordPress no MyKinsta. Voc\u00ea tamb\u00e9m deve gerar uma chave de API para autenticar e acessar sua conta.<\/p>\n<p>Para gerar uma chave de API:<\/p>\n<ol start=\"1\">\n<li>V\u00e1 para o painel <a href=\"https:\/\/my.kinsta.com\/?lang=pt\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>.<\/li>\n<li>Navegue at\u00e9 a p\u00e1gina Chaves API (<strong>Seu nome<\/strong> &gt; <strong>Configura\u00e7\u00f5es da empresa <\/strong>&gt; <strong>Chaves API<\/strong>).<\/li>\n<li>Clique em <strong>Criar chave de API<\/strong>.<\/li>\n<li>Escolha uma expira\u00e7\u00e3o ou defina uma data de in\u00edcio personalizada e o n\u00famero de horas para a chave expirar.<\/li>\n<li>D\u00ea \u00e0 chave um nome exclusivo.<\/li>\n<li>Clique em <strong>Gerar<\/strong>.<\/li>\n<\/ol>\n<p>Depois de criar uma chave de API, copie-a e armazene-a em um local seguro (recomenda-se usar um <a href=\"https:\/\/kinsta.com\/pt\/blog\/gerenciadores-de-senhas\/\">gerenciador de senhas<\/a>). Voc\u00ea pode gerar v\u00e1rias chaves API, que ser\u00e3o listadas na p\u00e1gina <strong>Chaves API<\/strong>. Se voc\u00ea precisar revogar uma chave de API, clique no bot\u00e3o <strong>Revogar<\/strong>.<\/p>\n<h2>Gerencie os plugins do seu site com a API da Kinsta e o React<\/h2>\n<p>Vamos come\u00e7ar desenvolvendo uma interface de usu\u00e1rio em React, que ser\u00e1 transformada em uma extens\u00e3o do Chrome. Este guia pressup\u00f5e familiaridade b\u00e1sica com o React e a intera\u00e7\u00e3o com a API.<\/p>\n<h3>Configurando o ambiente<\/h3>\n<p>Primeiramente, no arquivo <strong>App.jsx<\/strong>, defina uma constante para a URL da API da Kinsta para evitar redund\u00e2ncia em seu c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">const KinstaAPIUrl = 'https:\/\/api.kinsta.com\/v2';<\/code><\/pre>\n<p>Por seguran\u00e7a, armazene dados confidenciais, como a chave de API e o ID da empresa na Kinsta, em um arquivo <strong>.env.local<\/strong> para mant\u00ea-los seguros e fora do seu c\u00f3digo-fonte:<\/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>Obtenha dados com a API da Kinsta<\/h3>\n<p>No arquivo <strong>App.jsx<\/strong>, voc\u00ea precisa fazer v\u00e1rias solicita\u00e7\u00f5es \u00e0 API da Kinsta para recuperar informa\u00e7\u00f5es sobre sites e seus plugins.<\/p>\n<ol start=\"1\">\n<li><strong>Recupere sites da empresa:<\/strong> Comece obtendo uma lista de sites associados \u00e0 conta da sua empresa na Kinsta. Use o ID da empresa em uma solicita\u00e7\u00e3o GET, que retorna um array de detalhes do site.\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>Obtenha os dados de ambiente para cada site:<\/strong> Para cada site, recupere os ambientes, que incluem o ID do ambiente necess\u00e1rio para outras solicita\u00e7\u00f5es. Isso envolve o mapeamento de cada site e a realiza\u00e7\u00e3o de uma chamada de API para o 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>Recupere os plugins para cada ambiente de site:<\/strong> Por fim, use o ID do ambiente para buscar plugins para cada site. Essa etapa envolve uma fun\u00e7\u00e3o de mapeamento e uma chamada de API para o endpoint <code>\/sites\/environments\/${environmentId}\/plugins<\/code> de cada ambiente.\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>Agora voc\u00ea pode reunir todas essas solicita\u00e7\u00f5es em uma fun\u00e7\u00e3o usada para retornar o array final de sites com detalhes b\u00e1sicos sobre cada site e seus 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>Exibindo dados do site<\/h3>\n<p>Crie um estado com o hook <code>useState<\/code> para armazenar sites com plugins desatualizados. O hook <code>useEffect<\/code> tamb\u00e9m chamar\u00e1 o m\u00e9todo <code>getSitesWithPluginData()<\/code> e extrair\u00e1 os detalhes do site quando o componente for montado.<\/p>\n<p>No hook <code>useEffect<\/code>, crie uma fun\u00e7\u00e3o que far\u00e1 um loop em cada site para filtrar os sites com plugins desatualizados e, em seguida, armazen\u00e1-los no 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>No c\u00f3digo acima, voc\u00ea percebe que o estado de carregamento tamb\u00e9m \u00e9 criado e definido como <code>true<\/code> por padr\u00e3o. Este ser\u00e1 usado para controlar como os dados s\u00e3o exibidos. Quando todos os dados s\u00e3o carregados, definimos como <code>false<\/code>.<\/p>\n<p>Abaixo voc\u00ea encontra uma marca\u00e7\u00e3o para renderizar os dados do site e os plugins na interface do usu\u00e1rio.<\/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>O c\u00f3digo inclui um cabe\u00e7alho com uma logo e um par\u00e1grafo informativo. O conte\u00fado da interface do usu\u00e1rio \u00e9 renderizado condicionalmente com base no estado de <code>isLoading<\/code>. Se os dados ainda estiverem sendo carregados, ser\u00e1 exibida uma mensagem de carregamento. Depois que os dados s\u00e3o carregados, ele apresenta os dados sobre os sites e todos os plugins que exigem atualiza\u00e7\u00f5es.<\/p>\n<p>Voc\u00ea tamb\u00e9m notar\u00e1 um componente: <code>PluginPage<\/code> (<strong>PluginPage.jsx<\/strong>). Esse componente foi projetado para exibir sites individuais e os detalhes dos seus plugins. Inclui uma funcionalidade para alternar a visibilidade dos detalhes do plugin.<\/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 estilizar seu aplicativo, copie o <a href=\"https:\/\/github.com\/olawanlejoel\/plugins-chome-extension\/blob\/main\/src\/index.css\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo CSS do nosso c\u00f3digo-fonte<\/a> e cole-o em seu pr\u00f3prio arquivo CSS.<\/p>\n<\/aside>\n\n<h3>Configure o arquivo manifest<\/h3>\n<p>Para transformar sua interface de usu\u00e1rio e funcionalidade em uma extens\u00e3o do Chrome, voc\u00ea precisa configurar o arquivo <strong>manifest.json<\/strong>.\u00a0Crie um arquivo <strong>manifest.json<\/strong> na pasta <strong>public<\/strong>\u00a0e cole o c\u00f3digo abaixo:<\/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>Certifique-se de adicionar o arquivo de \u00edcone \u00e0 sua pasta <strong>public<\/strong>.<\/p>\n<p>Neste ponto, voc\u00ea pode executar o comando de build (<code>npm run build<\/code>) para que todos os seus ativos, inclusive o arquivo <strong>manifest.json<\/strong>, o <strong>index.html<\/strong> gerado pelo React e outros arquivos, sejam movidos para a pasta <strong>dist<\/strong> ou <strong>build<\/strong>.<\/p>\n<p>Em seguida, navegue at\u00e9 <code>chrome:\/\/extensions\/<\/code> e carregue isso como uma extens\u00e3o descompactada para o Chrome. Clique no bot\u00e3o <strong>Load Unpacked<\/strong> e selecione o diret\u00f3rio que voc\u00ea criou para sua extens\u00e3o.<\/p>\n<h3>Restrinja a extens\u00e3o a sites espec\u00edficos<\/h3>\n<p>Voc\u00ea percebeu que essa extens\u00e3o funciona a qualquer momento. Queremos que funcione somente quando um usu\u00e1rio estiver navegando no painel MyKinsta.<\/p>\n<p>Para fazer isso, vamos ajustar o arquivo <strong>App.jsx<\/strong>. Crie um estado para armazenar a aba ativa:<\/p>\n<pre><code class=\"language-jsx\">const [activeTab, setActiveTab] = useState(null);<\/code><\/pre>\n<p>Em seguida, atualize o hook <code>useEffect<\/code> para definir e invocar a fun\u00e7\u00e3o <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>O c\u00f3digo acima usa <code>chrome.tabs.query<\/code> com op\u00e7\u00f5es de consulta espec\u00edficas para garantir que recupere somente a aba ativa na janela atual. Depois que a aba \u00e9 recuperada, \u00e9 definida como a aba ativa no estado da extens\u00e3o.<\/p>\n<p>Por fim, implemente uma l\u00f3gica de <a href=\"https:\/\/kinsta.com\/pt\/blog\/renderizacao-condicional-react\/\">renderiza\u00e7\u00e3o condicional<\/a> na instru\u00e7\u00e3o de retorno do seu componente. Isso garante que a interface do usu\u00e1rio de gerenciamento de plugins seja exibida somente quando o usu\u00e1rio estiver no painel 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>Ap\u00f3s fazer as altera\u00e7\u00f5es, reconstrua seu aplicativo e recarregue a extens\u00e3o do Chrome. Isso aplicar\u00e1 a nova l\u00f3gica e as restri\u00e7\u00f5es.<\/p>\n<h2>Resumo<\/h2>\n<p>Neste artigo, voc\u00ea aprendeu os conceitos b\u00e1sicos da cria\u00e7\u00e3o de uma extens\u00e3o do Chrome e como criar uma com o React. Tamb\u00e9m aprendeu a criar uma extens\u00e3o que interage com a API da Kinsta.<\/p>\n<p>Como usu\u00e1rio da Kinsta, voc\u00ea pode aproveitar o enorme potencial e a flexibilidade que a API da Kinsta oferece, ajudando-o a desenvolver solu\u00e7\u00f5es personalizadas para gerenciar seus sites, aplicativos e bancos de dados.<\/p>\n<p><em>Que endpoint da API da Kinsta voc\u00ea tem usado muito, e como? Compartilhe conosco na se\u00e7\u00e3o de coment\u00e1rios!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como usu\u00e1rio do Google Chrome, voc\u00ea provavelmente j\u00e1 usou algumas extens\u00f5es nesse navegador. Voc\u00ea j\u00e1 se perguntou como elas s\u00e3o criadas, ou se voc\u00ea poderia criar &#8230;<\/p>\n","protected":false},"author":287,"featured_media":68295,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[951,970,1002,978],"class_list":["post-68294","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","topic-google-chrome","topic-react","topic-tutoriais-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>Como criar uma extens\u00e3o do Chrome para gerenciar os plugins do seu site com a API da Kinsta e o React - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na 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\/pt\/blog\/criar-extensao-chrome\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React\" \/>\n<meta property=\"og:description\" content=\"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na Kinsta.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-14T14:44:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-29T12:46:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na Kinsta.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React\",\"datePublished\":\"2024-05-14T14:44:33+00:00\",\"dateModified\":\"2024-05-29T12:46:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/\"},\"wordCount\":2395,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/\",\"name\":\"Como criar uma extens\u00e3o do Chrome para gerenciar os plugins do seu site com a API da Kinsta e o React - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"datePublished\":\"2024-05-14T14:44:33+00:00\",\"dateModified\":\"2024-05-29T12:46:28+00:00\",\"description\":\"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na Kinsta.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google Chrome\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/google-chrome\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como criar uma extens\u00e3o do Chrome para gerenciar os plugins do seu site com a API da Kinsta e o React - Kinsta\u00ae","description":"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na 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\/pt\/blog\/criar-extensao-chrome\/","og_locale":"pt_PT","og_type":"article","og_title":"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React","og_description":"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na Kinsta.","og_url":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2024-05-14T14:44:33+00:00","article_modified_time":"2024-05-29T12:46:28+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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":"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na Kinsta.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react-1024x512.jpg","twitter_creator":"@olawanle_joel","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Joel Olawanle","Tempo estimado de leitura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React","datePublished":"2024-05-14T14:44:33+00:00","dateModified":"2024-05-29T12:46:28+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/"},"wordCount":2395,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/","url":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/","name":"Como criar uma extens\u00e3o do Chrome para gerenciar os plugins do seu site com a API da Kinsta e o React - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","datePublished":"2024-05-14T14:44:33+00:00","dateModified":"2024-05-29T12:46:28+00:00","description":"Aprenda a criar uma extens\u00e3o do Chrome com React e a API da Kinsta para gerenciar plugins em sites WordPress hospedados na Kinsta.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/criar-extensao-chrome\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Google Chrome","item":"https:\/\/kinsta.com\/pt\/topicos\/google-chrome\/"},{"@type":"ListItem","position":3,"name":"Como Criar uma Extens\u00e3o do Chrome para Gerenciar os Plugins do seu Site com a API da Kinsta e o React"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/68294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=68294"}],"version-history":[{"count":10,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/68294\/revisions"}],"predecessor-version":[{"id":68530,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/68294\/revisions\/68530"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/translations\/es"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/68294\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/68295"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=68294"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=68294"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=68294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}