{"id":77029,"date":"2024-05-14T15:43:30","date_gmt":"2024-05-14T14:43:30","guid":{"rendered":"https:\/\/kinsta.com\/fr\/?p=77029&#038;preview=true&#038;preview_id=77029"},"modified":"2024-05-24T14:41:09","modified_gmt":"2024-05-24T13:41:09","slug":"construire-extension-chrome","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/","title":{"rendered":"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l&rsquo;API Kinsta et React"},"content":{"rendered":"<p>En tant qu&rsquo;utilisateur de <a href=\"https:\/\/kinsta.com\/fr\/blog\/microsoft-edge-vs-chrome\/\">Google Chrome<\/a>, vous avez probablement utilis\u00e9 des extensions dans ce navigateur. Vous \u00eates-vous d\u00e9j\u00e0 demand\u00e9 comment elles \u00e9taient con\u00e7ues ou si vous pouviez en cr\u00e9er une ?<\/p>\n<p>Cet article vous guide \u00e0 travers le processus de cr\u00e9ation d&rsquo;une extension Chrome, en particulier une extension qui utilise React et l&rsquo;API Kinsta pour g\u00e9rer les extensins sur les sites WordPress h\u00e9berg\u00e9s avec 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>Qu&rsquo;est-ce qu&rsquo;une extension Chrome ?<\/h2>\n<p>Une extension Chrome est un programme install\u00e9 dans le navigateur Chrome et qui am\u00e9liore ses fonctionnalit\u00e9s. Les extensions peuvent aller de simples boutons dans la barre d&rsquo;outils \u00e0 des fonctionnalit\u00e9s enti\u00e8rement int\u00e9gr\u00e9es qui interagissent profond\u00e9ment avec votre exp\u00e9rience de navigation.<\/p>\n<h2>Comment cr\u00e9er une extension Chrome<\/h2>\n<p>La cr\u00e9ation d&rsquo;une extension Chrome est similaire au d\u00e9veloppement d&rsquo;une <a href=\"https:\/\/kinsta.com\/fr\/blog\/architecture-application-web\/\">application web<\/a>, mais elle n\u00e9cessite un fichier au format JSON appel\u00e9 <strong>manifest.json<\/strong>. Ce fichier constitue l&rsquo;\u00e9pine dorsale de l&rsquo;extension, dont il d\u00e9termine les r\u00e9glages, les autorisations et les fonctionnalit\u00e9s que vous souhaitez inclure.<\/p>\n<p>Pour commencer, cr\u00e9ez un dossier qui contiendra tous les fichiers de votre extension. Ensuite, cr\u00e9ez un fichier <strong>manifest.json<\/strong> dans ce dossier.<\/p>\n<p>Un fichier <strong>manifest.json<\/strong> de base pour une extension Chrome comprend des propri\u00e9t\u00e9s cl\u00e9s qui d\u00e9finissent les r\u00e9glages de base de l&rsquo;extension. Vous trouverez ci-dessous un exemple de fichier <strong>manifest.json<\/strong> comprenant les champs n\u00e9cessaires \u00e0 son fonctionnement :<\/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>Vous pouvez le charger et le tester en tant qu&rsquo;extension d\u00e9compress\u00e9e dans Chrome. Rendez-vous sur <code>chrome:\/\/extensions<\/code> dans votre navigateur et basculez en <strong>mode d\u00e9veloppeur<\/strong>, puis cliquez sur le bouton <strong>Charger l&rsquo;extension non empaquet\u00e9e<\/strong>. Cela ouvrira un navigateur de fichiers et vous pourrez s\u00e9lectionner le r\u00e9pertoire que vous avez cr\u00e9\u00e9 pour votre extension.<\/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=\"Chargez une extension Chrome en cliquant sur Charger l'extension non empaquet\u00e9e en mode d\u00e9veloppeur.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Chargez une extension Chrome en cliquant sur Charger l&rsquo;extension non empaquet\u00e9e en mode d\u00e9veloppeur.<\/figcaption><\/figure>\n<p>Lorsque vous cliquez sur l&rsquo;ic\u00f4ne de l&rsquo;extension, rien ne se passe car vous n&rsquo;avez pas cr\u00e9\u00e9 d&rsquo;interface utilisateur.<\/p>\n<h3>Cr\u00e9er une interface utilisateur (popup) pour votre extension Chrome<\/h3>\n<p>Comme pour toute application web, l&rsquo;interface utilisateur (UI) de votre extension utilise le <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-le-html\/\">HTML<\/a> pour structurer le contenu, le <a href=\"https:\/\/kinsta.com\/fr\/blog\/meilleurs-pratiques-css\/\">CSS<\/a> pour le styliser et le <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-javascript\/\">JavaScript<\/a> pour ajouter de l&rsquo;interactivit\u00e9.<\/p>\n<p>Cr\u00e9ons une interface utilisateur de base \u00e0 l&rsquo;aide de tous ces fichiers. Commencez par cr\u00e9er un fichier HTML (<strong>popup.html<\/strong>). Ce fichier d\u00e9finit la structure des \u00e9l\u00e9ments de votre interface utilisateur, tels que le texte, les titres, les images et les boutons. Ajoutez le code suivant :<\/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>Le code ci-dessus cr\u00e9e un titre, un paragraphe et un bouton. Les fichiers CSS et JavaScript sont \u00e9galement li\u00e9s. Ajoutez maintenant quelques styles dans le fichier <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>Ensuite, dans le fichier <strong>popup.js<\/strong>, ajoutez un r\u00e9cepteur d&rsquo;\u00e9v\u00e8nements au bouton de sorte que lorsqu&rsquo;il est cliqu\u00e9, une alerte s&rsquo;affiche :<\/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>Ce code JavaScript r\u00e9cup\u00e8re l&rsquo;onglet actif actuel et utilise l&rsquo;<a href=\"https:\/\/developer.chrome.com\/docs\/extensions\/reference\/api\/scripting\" target=\"_blank\" rel=\"noopener noreferrer\">API Chrome Scripting<\/a> pour ex\u00e9cuter un script qui affiche une alerte avec un message d&rsquo;accueil lorsque le bouton <strong>Say Hello<\/strong> est cliqu\u00e9. Cela introduit une interactivit\u00e9 de base dans votre extension Chrome.<\/p>\n<p>Gr\u00e2ce \u00e0 ces \u00e9tapes, vous avez mis en place une interface utilisateur popup simple pour votre extension Chrome, qui comprend un texte, un style et une fonctionnalit\u00e9 de base.<\/p>\n<p>Enfin, vous devez activer le fichier popup dans le fichier <strong>manifest.json<\/strong> en ajoutant quelques permissions :<\/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>Dans la configuration ci-dessus, la cl\u00e9 <code>default_popup<\/code> sp\u00e9cifie que <strong>popup.html<\/strong> sera l&rsquo;interface utilisateur par d\u00e9faut lorsque l&rsquo;utilisateur interagira avec l&rsquo;extension. Le tableau <code>permissions<\/code> comprend <code>scripting<\/code> et <code>tabs<\/code>, qui sont essentiels pour que l&rsquo;extension puisse interagir avec les onglets et utiliser les fonctions de script du navigateur.<\/p>\n<p>Le tableau <code>host_permissions<\/code> indique les sites avec lesquels votre extension peut interagir. Les mod\u00e8les <code>http:\/\/*\/*<\/code> et <code>https:\/\/*\/*<\/code> indiquent que votre extension peut interagir avec tous les sites web accessibles via les protocoles HTTP et HTTPS.<\/p>\n<p>Avec ces param\u00e8tres dans votre fichier <strong>manifest.json<\/strong>, votre extension Chrome est correctement configur\u00e9e pour afficher une fen\u00eatre contextuelle et ex\u00e9cuter des scripts.<\/p>\n<h3>Recharger votre extension Chrome<\/h3>\n<p>Une fois ces changements effectu\u00e9s dans votre dossier local, vous devez mettre \u00e0 jour le dossier d\u00e9compress\u00e9 charg\u00e9 dans Chrome. Pour cela, ouvrez la page des extensions de Chrome, trouvez votre extension et cliquez sur l&rsquo;ic\u00f4ne de rechargement.<\/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=\"Cliquez sur l'ic\u00f4ne d'actualisation pour recharger l'extension.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Cliquez sur l&rsquo;ic\u00f4ne d&rsquo;actualisation pour recharger l&rsquo;extension.<\/figcaption><\/figure>\n<p>Vous pouvez ensuite cliquer sur l&rsquo;ic\u00f4ne de l&rsquo;extension et une fen\u00eatre contextuelle apparait. Lorsque vous cliquez sur le bouton <strong>Say Hello<\/strong>, une alerte apparait.<\/p>\n<p>Vous avez maintenant des connaissances de base sur la mani\u00e8re de cr\u00e9er une extension Chrome. Il y a d&rsquo;autres possibilit\u00e9s. Vous pouvez manipuler l&rsquo;interface utilisateur de votre site, effectuer des requ\u00eates API, r\u00e9cup\u00e9rer des donn\u00e9es \u00e0 partir d&rsquo;URL pour effectuer des op\u00e9rations sp\u00e9cifiques, et bien plus encore.<\/p>\n<h2>Comment cr\u00e9er une extension Chrome avec React<\/h2>\n<p>Comme nous l&rsquo;avons mentionn\u00e9 pr\u00e9c\u00e9demment, la cr\u00e9ation d&rsquo;une extension Chrome est similaire \u00e0 la cr\u00e9ation d&rsquo;une application web. Vous pouvez utiliser des frameworks web populaires comme <a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-react-js\/\">React<\/a>.<\/p>\n<p>Pour React, le fichier <strong>manifest.json<\/strong> est cr\u00e9\u00e9 dans le dossier <strong>public<\/strong>. Ce dossier est utilis\u00e9 pour les ressources statiques que vous ne voulez pas voir trait\u00e9s par <a href=\"https:\/\/kinsta.com\/fr\/blog\/rollup-vs-webpack-vs-parcel\/\">Webpack<\/a> (ou des bundlers similaires que React peut utiliser sous le capot dans des outils comme <a href=\"https:\/\/create-react-app.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">Create React App<\/a>).<\/p>\n<p>Lorsque vous construisez votre application React, le processus de construction copie tout le contenu du dossier <strong>public<\/strong> dans le dossier <strong>dist<\/strong>. Voici comment cr\u00e9er une extension Chrome avec React :<\/p>\n<ol start=\"1\">\n<li>Cr\u00e9ez une nouvelle application React. Vous pouvez utiliser l&rsquo;environnement de d\u00e9veloppement local Vite en ex\u00e9cutant la commande suivante dans votre terminal :<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">npm create vite@latest<\/code><\/pre>\n<p>Ensuite, donnez un nom \u00e0 votre projet et s\u00e9lectionnez React comme framework. Une fois cela fait, naviguez dans le dossier du projet et installez les d\u00e9pendances :<\/p>\n<pre><code class=\"language-bash\">cd &lt;project-name&gt;\nnpm install<\/code><\/pre>\n<ol start=\"2\">\n<li>Dans le dossier <strong>public<\/strong> de votre projet React, cr\u00e9ez un fichier <strong>manifest.json<\/strong>. Ajoutez les configurations suivantes :<\/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 configuration d&rsquo;une extension Chrome comprend un objet <code>action<\/code> qui d\u00e9finit <strong>index.html<\/strong> comme fen\u00eatre contextuelle par d\u00e9faut lorsque vous cliquez sur l&rsquo;ic\u00f4ne de l&rsquo;extension. Il s&rsquo;agit du fichier HTML statique g\u00e9n\u00e9r\u00e9 lorsque vous construisez votre application React.<\/p>\n<ol start=\"3\">\n<li>D\u00e9veloppez l&rsquo;application React. N&rsquo;h\u00e9sitez pas \u00e0 faire des requ\u00eates d&rsquo;API, \u00e0 les styliser comme vous le souhaitez, \u00e0 utiliser des hooks React, etc.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Lorsque vous avez termin\u00e9 la construction de l&rsquo;interface utilisateur de l&rsquo;extension, ex\u00e9cutez la commande de construction dans React (<code>npm run build<\/code>). Toutes vos ressources, y compris votre fichier <strong>manifest.json<\/strong>, l&rsquo;<strong>index.html<\/strong> g\u00e9n\u00e9r\u00e9 par React, et d&rsquo;autres, sont d\u00e9plac\u00e9s dans le dossier <strong>dist<\/strong> ou <strong>build<\/strong>.<\/li>\n<li>Enfin, chargez votre extension dans Chrome. Naviguez jusqu&rsquo;\u00e0 <code>chrome:\/\/extensions\/<\/code> et rechargez votre extension.<\/li>\n<\/ol>\n<h2>Cr\u00e9ation d&rsquo;une extension Chrome pour g\u00e9rer les plugins de votre site avec l&rsquo;API Kinsta<\/h2>\n<p>Voici \u00e0 quoi ressemblera l&rsquo;extension Chrome que vous allez cr\u00e9er :<\/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=\"Extension Chrome construite avec React et interagissant avec l'API Kinsta.\" width=\"1001\" height=\"471\"><figcaption class=\"wp-caption-text\">Extension Chrome construite avec React et interagissant avec l&rsquo;API Kinsta.<\/figcaption><\/figure>\n<p>Lorsque vous cliquez sur l&rsquo;extension, celle-ci affiche une liste de sites dont les extensions sont obsol\u00e8tes sur votre compte <a href=\"https:\/\/my.kinsta.com\/?lang=fr\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>. Vous pouvez voir la liste des extensions et cliquer sur le bouton <strong>Voir dans MyKinsta<\/strong> pour naviguer vers la page <a href=\"https:\/\/kinsta.com\/fr\/docs\/hebergement-wordpress\/plugins-themes-wordpress\/\">Themes &#038; Extensions<\/a> du site, o\u00f9 vous pouvez mettre \u00e0 jour chaque extension.<\/p>\n<p>Voyons maintenant comment cr\u00e9er l&rsquo;extension Chrome.<\/p>\n<h3>Comprendre l&rsquo;API Kinsta<\/h3>\n<p>L&rsquo;<a href=\"https:\/\/kinsta.com\/fr\/docs\/api-kinsta\/\">API Kinsta<\/a> est un outil puissant qui vous permet d&rsquo;interagir de mani\u00e8re programmatique avec les services Kinsta comme les sites WordPress h\u00e9berg\u00e9s. Elle peut vous aider \u00e0 automatiser diverses t\u00e2ches li\u00e9es \u00e0 la gestion de WordPress, y compris la <a href=\"https:\/\/kinsta.com\/fr\/blog\/api-wordpress\/\">cr\u00e9ation de sites<\/a>, la <a href=\"https:\/\/kinsta.com\/fr\/blog\/planifier-taches-api-kinsta\/\">r\u00e9cup\u00e9ration d&rsquo;informations sur les sites<\/a>, l&rsquo;<a href=\"https:\/\/kinsta.com\/fr\/blog\/cle-api-kinsta\/#how-to-use-kinsta-api-to-build-a-status-checker\">obtention de l&rsquo;\u00e9tat d&rsquo;un site<\/a>, la <a href=\"https:\/\/kinsta.com\/fr\/blog\/journaux-api-serveur\/\">consultation<\/a> et la <a href=\"https:\/\/kinsta.com\/fr\/blog\/sauvegardes-wordpress-api\/\">restauration de sauvegardes<\/a>, et plus encore.<\/p>\n<p>Pour utiliser l&rsquo;API de Kinsta, vous devez avoir un compte avec au moins un site, une <a href=\"https:\/\/sevalla.com\/application-hosting\/\">application<\/a> ou une <a href=\"https:\/\/sevalla.com\/database-hosting\/\">base de donn\u00e9es<\/a> WordPress dans MyKinsta. Vous devez \u00e9galement g\u00e9n\u00e9rer une cl\u00e9 API pour vous authentifier et acc\u00e9der \u00e0 votre compte.<\/p>\n<p>Pour g\u00e9n\u00e9rer une cl\u00e9 API :<\/p>\n<ol start=\"1\">\n<li>Allez sur votre tableau de bord <a href=\"https:\/\/my.kinsta.com\/?lang=fr\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>.<\/li>\n<li>Naviguez jusqu&rsquo;\u00e0 la page des cl\u00e9s API (<strong>Votre nom<\/strong> &gt; <strong>R\u00e9glages de l&rsquo;entreprise <\/strong>&gt; <strong>Cl\u00e9s API<\/strong>).<\/li>\n<li>Cliquez sur <strong>Cr\u00e9er une cl\u00e9 API<\/strong>.<\/li>\n<li>Choisissez une date d&rsquo;expiration ou d\u00e9finissez une date de d\u00e9but personnalis\u00e9e et un nombre d&rsquo;heures pour l&rsquo;expiration de la cl\u00e9.<\/li>\n<li>Donnez un nom unique \u00e0 la cl\u00e9.<\/li>\n<li>Cliquez sur <strong>G\u00e9n\u00e9rer<\/strong>.<\/li>\n<\/ol>\n<p>Apr\u00e8s avoir cr\u00e9\u00e9 une cl\u00e9 API, copiez-la et conservez-la en lieu s\u00fbr (il est recommand\u00e9 d&rsquo;utiliser un <a href=\"https:\/\/kinsta.com\/fr\/blog\/gestionnaires-mots-passe\/\">gestionnaire de mots de passe<\/a>). Vous pouvez g\u00e9n\u00e9rer plusieurs cl\u00e9s API, qui seront r\u00e9pertori\u00e9es sur la page <strong>Cl\u00e9s API<\/strong>. Si vous devez r\u00e9voquer une cl\u00e9 API, cliquez sur le bouton <strong>R\u00e9voquer<\/strong>.<\/p>\n<h2>G\u00e9rer les plugins de votre site avec l&rsquo;API Kinsta et React<\/h2>\n<p>Commen\u00e7ons par d\u00e9velopper une interface utilisateur dans React, qui sera ensuite transform\u00e9e en une extension Chrome. Ce guide suppose une connaissance de base de React et de l&rsquo;interaction avec l&rsquo;API.<\/p>\n<h3>Mise en place de l&rsquo;environnement<\/h3>\n<p>Tout d&rsquo;abord, dans le fichier <strong>App.jsx<\/strong>, d\u00e9finissez une constante pour l&rsquo;URL de l&rsquo;API Kinsta afin d&rsquo;\u00e9viter toute redondance dans votre code :<\/p>\n<pre><code class=\"language-js\">const KinstaAPIUrl = 'https:\/\/api.kinsta.com\/v2';<\/code><\/pre>\n<p>Pour des raisons de s\u00e9curit\u00e9, stockez les donn\u00e9es sensibles telles que votre cl\u00e9 API et l&rsquo;identifiant de la soci\u00e9t\u00e9 Kinsta dans un fichier <strong>.env.local<\/strong> pour les garder en s\u00e9curit\u00e9 et hors de votre code source :<\/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>R\u00e9cup\u00e9rer des donn\u00e9es avec l&rsquo;API Kinsta<\/h3>\n<p>Dans le fichier <strong>App.jsx<\/strong>, vous devez faire plusieurs demandes \u00e0 l&rsquo;API de Kinsta pour r\u00e9cup\u00e9rer des informations sur les sites et les extensions.<\/p>\n<ol start=\"1\">\n<li><strong>R\u00e9cup\u00e9rer les sites de l&rsquo;entreprise :<\/strong> Commencez par r\u00e9cup\u00e9rer la liste des sites associ\u00e9s \u00e0 votre compte d&rsquo;entreprise Kinsta. Utilisez l&rsquo;identifiant de l&rsquo;entreprise dans une requ\u00eate GET, qui renvoie un tableau de d\u00e9tails sur les sites.\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>R\u00e9cup\u00e9rer les donn\u00e9es d&rsquo;environnement pour chaque site :<\/strong> Pour chaque site, r\u00e9cup\u00e9rez les environnements, qui comprennent l&rsquo;identifiant de l&rsquo;environnement n\u00e9cessaire pour les requ\u00eates ult\u00e9rieures. Pour cela, il convient de mapper chaque site et d&rsquo;effectuer un appel API au point de terminaison <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>R\u00e9cup\u00e9rer les extensions pour chaque environnement de site :<\/strong> Enfin, utilisez l&rsquo;identifiant de l&rsquo;environnement pour r\u00e9cup\u00e9rer les extensions pour chaque site. Cette \u00e9tape implique une fonction de mappage et un appel API au point de terminaison <code>\/sites\/environments\/${environmentId}\/plugins<\/code> pour chaque environnement.\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>Vous pouvez maintenant rassembler toutes ces requ\u00eates dans une fonction qui est utilis\u00e9e pour renvoyer le tableau final des sites avec des d\u00e9tails de base sur chaque site et ses extensions :<\/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>Afficher les donn\u00e9es du site<\/h3>\n<p>Cr\u00e9ez un \u00e9tat avec le hook <code>useState<\/code> pour stocker les sites dont les extensions sont obsol\u00e8tes. Le hook <code>useEffect<\/code> appellera \u00e9galement la m\u00e9thode <code>getSitesWithPluginData()<\/code> et extraira les d\u00e9tails du site lorsque le composant sera mont\u00e9.<\/p>\n<p>Dans le hook <code>useEffect<\/code>, cr\u00e9ez une fonction qui passera en boucle sur chaque site pour filtrer les sites dont les extensions sont obsol\u00e8tes et les stocker dans l&rsquo;\u00e9tat :<\/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>Dans le code ci-dessus, vous remarquez que l&rsquo;\u00e9tat de chargement est \u00e9galement cr\u00e9\u00e9 et d\u00e9fini sur <code>true<\/code> par d\u00e9faut. Il sera utilis\u00e9 pour contr\u00f4ler l&rsquo;affichage des donn\u00e9es. Lorsque toutes les donn\u00e9es sont charg\u00e9es, nous le fixons \u00e0 <code>false<\/code>.<\/p>\n<p>Vous trouverez ci-dessous un balisage permettant de rendre les donn\u00e9es du site et les extensions dans votre interface utilisateur.<\/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>Le code comprend un en-t\u00eate avec un logo et un paragraphe d&rsquo;information. Le contenu de l&rsquo;interface utilisateur est rendu de mani\u00e8re conditionnelle en fonction de l&rsquo;\u00e9tat de <code>isLoading<\/code>. Si les donn\u00e9es sont encore en cours de chargement, un message de chargement est affich\u00e9. Une fois les donn\u00e9es charg\u00e9es, l&rsquo;interface pr\u00e9sente les donn\u00e9es relatives aux sites et aux \u00e9ventuelles extensions n\u00e9cessitant des mises \u00e0 jour.<\/p>\n<p>Vous remarquerez \u00e9galement un composant : <code>PluginPage<\/code> (<strong>PluginPage.jsx<\/strong>). Ce composant est con\u00e7u pour afficher les sites individuels et les d\u00e9tails de leurs extensions. Il comprend une fonctionnalit\u00e9 permettant de basculer la visibilit\u00e9 des d\u00e9tails de l&rsquo;extension.<\/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>Pour styliser votre application, copiez le <a href=\"https:\/\/github.com\/olawanlejoel\/plugins-chome-extension\/blob\/main\/src\/index.css\" target=\"_blank\" rel=\"noopener noreferrer\">code CSS de notre code source<\/a> et collez-le dans votre propre fichier CSS.<\/p>\n<\/aside>\n\n<h3>Configurer le fichier manifest<\/h3>\n<p>Pour transformer votre interface utilisateur et vos fonctionnalit\u00e9s en une extension Chrome, vous devez configurer le fichier <strong>manifest.json<\/strong>.<\/p>\n<p>Cr\u00e9ez un fichier <strong>manifest.json<\/strong> dans le dossier <strong>public<\/strong> et collez le code ci-dessous :<\/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>Veillez \u00e0 ajouter le fichier d&rsquo;ic\u00f4nes \u00e0 votre dossier <strong>public<\/strong>.<\/p>\n<p>\u00c0 ce stade, vous pouvez maintenant ex\u00e9cuter la commande build (<code>npm run build<\/code>) pour que toutes vos ressources, y compris votre fichier <strong>manifest.json<\/strong>, l&rsquo;<strong>index.html<\/strong> g\u00e9n\u00e9r\u00e9 par React et d&rsquo;autres fichiers, soient d\u00e9plac\u00e9s dans le dossier <strong>dist<\/strong> ou <strong>build<\/strong>.<\/p>\n<p>Ensuite, naviguez jusqu&rsquo;\u00e0 <code>chrome:\/\/extensions\/<\/code> et chargez-la en tant qu&rsquo;extension d\u00e9compress\u00e9e dans Chrome. Cliquez sur le bouton <strong>Charger l&rsquo;extension non empaquet\u00e9e<\/strong> et s\u00e9lectionnez le r\u00e9pertoire que vous avez cr\u00e9\u00e9 pour votre extension.<\/p>\n<h3>Limiter l&rsquo;extension \u00e0 des sites sp\u00e9cifiques<\/h3>\n<p>Vous avez remarqu\u00e9 que cette extension fonctionne \u00e0 tout moment. Nous voulons qu&rsquo;elle ne fonctionne que lorsqu&rsquo;un utilisateur navigue vers le tableau de bord MyKinsta.<\/p>\n<p>Pour cela, ajustons le fichier <strong>App.jsx<\/strong>. Cr\u00e9ez un \u00e9tat pour stocker l&rsquo;onglet actif :<\/p>\n<pre><code class=\"language-jsx\">const [activeTab, setActiveTab] = useState(null);<\/code><\/pre>\n<p>Ensuite, mettez \u00e0 jour le hook <code>useEffect<\/code> pour d\u00e9finir et invoquer la fonction <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>Le code ci-dessus utilise <code>chrome.tabs.query<\/code> avec des options de requ\u00eate sp\u00e9cifiques pour s&rsquo;assurer qu&rsquo;il ne r\u00e9cup\u00e8re que l&rsquo;onglet actif dans la fen\u00eatre actuelle. Une fois l&rsquo;onglet r\u00e9cup\u00e9r\u00e9, il est d\u00e9fini comme onglet actif dans l&rsquo;\u00e9tat de l&rsquo;extension.<\/p>\n<p>Enfin, mettez en \u0153uvre une logique de <a href=\"https:\/\/kinsta.com\/fr\/blog\/rendu-conditionnel-react\/\">rendu conditionnel<\/a> dans l&rsquo;instruction de retour de votre composant. Cela permet de s&rsquo;assurer que l&rsquo;interface de gestion de l&rsquo;extension n&rsquo;appara\u00eet que lorsque l&rsquo;utilisateur est sur le tableau de bord 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>Apr\u00e8s avoir effectu\u00e9 les modifications, reconstruisez votre application et rechargez l&rsquo;extension Chrome. Cela appliquera la nouvelle logique et les nouvelles restrictions.<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Dans cet article, vous avez appris les bases de la cr\u00e9ation d&rsquo;une extension Chrome et comment en cr\u00e9er une avec React. Vous avez \u00e9galement appris \u00e0 cr\u00e9er une extension qui interagit avec l&rsquo;API Kinsta.<\/p>\n<p>En tant qu&rsquo;utilisateur de Kinsta, vous pouvez profiter de l&rsquo;\u00e9norme potentiel et de la flexibilit\u00e9 de l&rsquo;API Kinsta qui vous aide \u00e0 d\u00e9velopper des solutions personnalis\u00e9es pour g\u00e9rer vos sites, vos applications et vos bases de donn\u00e9es.<\/p>\n<p><em>Quel point de terminaison de l&rsquo;API Kinsta avez-vous beaucoup utilis\u00e9, et comment l&rsquo;avez-vous utilis\u00e9 ? Partagez avec nous dans la section des commentaires !<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En tant qu&rsquo;utilisateur de Google Chrome, vous avez probablement utilis\u00e9 des extensions dans ce navigateur. Vous \u00eates-vous d\u00e9j\u00e0 demand\u00e9 comment elles \u00e9taient con\u00e7ues ou si vous &#8230;<\/p>\n","protected":false},"author":287,"featured_media":77030,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[953,972,1004,980],"class_list":["post-77029","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","topic-google-chrome","topic-react","topic-tutoriel-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>Construire une extension Chrome avec l&#039;API Kinsta et React - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l&#039;API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec 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\/fr\/blog\/construire-extension-chrome\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l&#039;API Kinsta et React\" \/>\n<meta property=\"og:description\" content=\"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l&#039;API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec Kinsta.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-14T14:43:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-24T13:41:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/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=\"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l&#039;API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec Kinsta.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/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_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l&rsquo;API Kinsta et React\",\"datePublished\":\"2024-05-14T14:43:30+00:00\",\"dateModified\":\"2024-05-24T13:41:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/\"},\"wordCount\":2591,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/\",\"name\":\"Construire une extension Chrome avec l'API Kinsta et React - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"datePublished\":\"2024-05-14T14:43:30+00:00\",\"dateModified\":\"2024-05-24T13:41:09+00:00\",\"description\":\"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l'API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec Kinsta.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google Chrome\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/google-chrome\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l&#8217;API Kinsta et React\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/fr\/#website\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"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\/fr\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/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\/fr\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Construire une extension Chrome avec l'API Kinsta et React - Kinsta\u00ae","description":"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l'API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec 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\/fr\/blog\/construire-extension-chrome\/","og_locale":"fr_FR","og_type":"article","og_title":"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l'API Kinsta et React","og_description":"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l'API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec Kinsta.","og_url":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2024-05-14T14:43:30+00:00","article_modified_time":"2024-05-24T13:41:09+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/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":"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l'API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec Kinsta.","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react-1024x512.jpg","twitter_creator":"@olawanle_joel","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Joel Olawanle","Dur\u00e9e de lecture estim\u00e9e":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l&rsquo;API Kinsta et React","datePublished":"2024-05-14T14:43:30+00:00","dateModified":"2024-05-24T13:41:09+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/"},"wordCount":2591,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/","url":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/","name":"Construire une extension Chrome avec l'API Kinsta et React - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","datePublished":"2024-05-14T14:43:30+00:00","dateModified":"2024-05-24T13:41:09+00:00","description":"Apprenez \u00e0 cr\u00e9er une extension Chrome avec React et l'API Kinsta pour g\u00e9rer les extensions sur les sites WordPress h\u00e9berg\u00e9s avec Kinsta.","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2024\/05\/wp-build-a-chrome-extension-with-kinsta-api-and-react.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/construire-extension-chrome\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Google Chrome","item":"https:\/\/kinsta.com\/fr\/sujets\/google-chrome\/"},{"@type":"ListItem","position":3,"name":"Comment cr\u00e9er une extension Chrome pour g\u00e9rer les plugins de votre site avec l&#8217;API Kinsta et React"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/fr\/#website","url":"https:\/\/kinsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","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\/fr\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/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\/fr\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/77029","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=77029"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/77029\/revisions"}],"predecessor-version":[{"id":77158,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/77029\/revisions\/77158"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/translations\/es"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/77029\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/77030"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=77029"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=77029"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=77029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}