{"id":84003,"date":"2026-07-22T13:50:33","date_gmt":"2026-07-22T12:50:33","guid":{"rendered":"https:\/\/kinsta.com\/fr\/?p=84003&#038;preview=true&#038;preview_id=84003"},"modified":"2026-07-27T14:11:48","modified_gmt":"2026-07-27T13:11:48","slug":"ia-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/","title":{"rendered":"Int\u00e9gration de l&rsquo;IA dans WordPress : analyse approfondie de l&rsquo;architecture et \u00e9tude de cas concret"},"content":{"rendered":"<p>Avant <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, les <a href=\"https:\/\/kinsta.com\/fr\/blog\/plugins-wordpress-ai\/\">extensions ajoutant des fonctionnalit\u00e9s d\u2019IA<\/a> devaient demander et g\u00e9rer une cl\u00e9 API pour communiquer avec un fournisseur d\u2019IA.<\/p>\n<p>Cela pr\u00e9sentait plusieurs inconv\u00e9nients en termes de poids du code et de facilit\u00e9 de maintenance. Vous deviez int\u00e9grer dans vos extensions des biblioth\u00e8ques SDK propri\u00e9taires et lourdes, et r\u00e9diger des requ\u00eates cURL sp\u00e9cifiques \u00e0 chaque fournisseur.<\/p>\n<p>Ce sc\u00e9nario fragment\u00e9 a compl\u00e8tement chang\u00e9 avec <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-7-0\/#integration-with-ai\">l\u2019int\u00e9gration native de l\u2019IA introduite dans WordPress 7.0<\/a>. Aujourd\u2019hui, WordPress dispose d\u2019une interface centralis\u00e9e permettant de configurer les identifiants pour divers fournisseurs d\u2019IA, ainsi que d\u2019une nouvelle API PHP. Cette nouvelle architecture vous permet d\u2019envoyer des commandes, des instructions, des fichiers multim\u00e9dias et des structures de donn\u00e9es en toute transparence, tandis que le noyau g\u00e8re les requ\u00eates.<\/p>\n<p>Cette nouvelle architecture offre des avantages consid\u00e9rables tant pour les administrateurs de site que pour les d\u00e9veloppeurs d&rsquo;extensions.<\/p>\n<p>Les administrateurs n\u2019ont plus besoin de configurer les r\u00e9glages d\u2019IA sur plusieurs extensions. \u00c0 partir de WordPress 7.0, il vous suffit d\u2019installer et d\u2019activer les connecteurs de vos extensions, de saisir vos cl\u00e9s API dans l\u2019interface unifi\u00e9e \u00ab Connecteurs \u00bb, et celles-ci deviennent instantan\u00e9ment disponibles pour toutes les extensions bas\u00e9es sur l\u2019IA de votre site. Vous pouvez facilement surveiller l\u2019utilisation de l\u2019IA, changer de mod\u00e8le ou r\u00e9voquer l\u2019acc\u00e8s d\u2019un fournisseur pour toutes les extensions d\u2019un simple clic.<\/p>\n<p>Pour les d\u00e9veloppeurs d&rsquo;extensions, les avantages sont encore plus importants : ils vont de la s\u00e9curit\u00e9 des donn\u00e9es \u00e0 la portabilit\u00e9 du code, en passant par une r\u00e9duction drastique de la <a href=\"https:\/\/kinsta.com\/fr\/blog\/agences-wordpress-evolutives\/#technical-debt\">dette technique<\/a>.<\/p>\n<p>Pr\u00eats \u00e0 vous lancer dans cette aventure vers la nouvelle architecture IA de WordPress ? Plongeons-nous dans le vif du sujet.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Les trois couches de l\u2019architecture IA de WordPress<\/h2>\n<p>Aujourd\u2019hui, vos sites WordPress sont nativement compatibles avec l\u2019IA. Il ne s\u2019agit toutefois pas de fonctionnalit\u00e9s d\u2019IA pr\u00eates \u00e0 l\u2019emploi, mais plut\u00f4t des fondements permettant de cr\u00e9er des sites web aliment\u00e9s par l\u2019IA.<\/p>\n<p>La nouvelle architecture s\u2019articule autour de trois couches distinctes :<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Connecteur IA<\/h3>\n<p>Avant <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, chaque extensions ajoutant des fonctionnalit\u00e9s d\u2019IA \u00e0 votre site n\u00e9cessitait son propre syst\u00e8me pour stocker et g\u00e9rer vos cl\u00e9s API. Vos identifiants devaient \u00eatre cod\u00e9s en dur dans l&rsquo;extension ou g\u00e9r\u00e9s via une page de r\u00e9glages personnalis\u00e9e. Dans les deux cas, cette solution \u00e9tait loin d\u2019\u00eatre id\u00e9ale pour la gestion des donn\u00e9es sensibles.<\/p>\n<figure id=\"attachment_211404\" aria-describedby=\"caption-attachment-211404\" style=\"width: 1462px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211404 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/connectors-screen.png\" alt=\"L\u2019interface centralis\u00e9e des connecteurs IA dans le tableau de bord d\u2019administration de WordPress.\" width=\"1462\" height=\"1404\"><figcaption id=\"caption-attachment-211404\" class=\"wp-caption-text\">L\u2019interface centralis\u00e9e des connecteurs IA dans le tableau de bord d\u2019administration de WordPress.<\/figcaption><\/figure>\n<p>Une interface unifi\u00e9e vous permet de configurer tous vos fournisseurs de services d\u2019IA \u00e0 partir d\u2019un emplacement central. Cette interface apporte plusieurs avantages majeurs \u00e0 la gestion de votre site.<\/p>\n<p>Du point de vue de la gestion et de la s\u00e9curit\u00e9, le principal avantage r\u00e9side dans le fait que vous n\u2019avez \u00e0 configurer vos fournisseurs qu\u2019une seule fois dans l\u2019interface \u00ab Connecteurs \u00bb, apr\u00e8s quoi vous n\u2019avez plus \u00e0 vous en soucier, quel que soit le nombre d&rsquo;extensions qui les utilisent. Si vous devez un jour modifier vos cl\u00e9s API, vous n\u2019aurez pas \u00e0 reconfigurer chaque extension ; vous pourrez les mettre \u00e0 jour en une seule fois depuis l\u2019\u00e9cran \u00ab Connecteurs \u00bb.<\/p>\n<p>La centralisation des identifiants renforce \u00e9galement la s\u00e9curit\u00e9 de votre site en r\u00e9duisant le risque d\u2019exposition de donn\u00e9es sensibles via des extensions tierces qui pourraient \u00eatre mal cod\u00e9es ou peu fiables.<\/p>\n<p>Un autre avantage majeur r\u00e9side dans la portabilit\u00e9 du code. Vos extensions n\u2019ont plus besoin de savoir quel fournisseur d\u2019IA vous utilisez, car la nouvelle architecture dissocie l\u2019authentification de la logique des extensions. Cela signifie que si vous changez de fournisseur d\u2019IA, votre extension continuera de fonctionner sans qu\u2019il soit n\u00e9cessaire de modifier la moindre ligne de code.<\/p>\n<p>Cependant, la v\u00e9ritable avanc\u00e9e en mati\u00e8re de portabilit\u00e9 r\u00e9side dans la possibilit\u00e9 pour les administrateurs de site de configurer plusieurs connecteurs simultan\u00e9ment. Lorsqu\u2019une extension d\u00e9clenche une requ\u00eate, WordPress s\u00e9lectionne automatiquement le fournisseur d\u2019IA et le mod\u00e8le les plus adapt\u00e9s pour g\u00e9n\u00e9rer la r\u00e9ponse, en fonction \u00e0 la fois de la <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/#ai-model-preferences\">configuration sp\u00e9cifique de l&rsquo;extension<\/a> et des capacit\u00e9s des mod\u00e8les disponibles.<\/p>\n<h3>Client IA<\/h3>\n<p>Alors que l\u2019\u00e9cran \u00ab Connecteurs \u00bb fournit l\u2019interface utilisateur de configuration des fournisseurs d\u2019IA, le <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">client IA<\/a> offre aux d\u00e9veloppeurs l\u2019outil op\u00e9rationnel permettant de communiquer avec les mod\u00e8les d\u2019IA.<\/p>\n<p>Il s\u2019agit d\u2019une interface logicielle native qui normalise l\u2019interaction avec les mod\u00e8les d\u2019intelligence artificielle via la fonction globale <code>wp_ai_client_prompt()<\/code>\u00a0et un ensemble unifi\u00e9 de m\u00e9thodes PHP.<\/p>\n<h4>R\u00e9duction de la dette technique<\/h4>\n<p>Pour les d\u00e9veloppeurs, l\u2019un des principaux avantages de la nouvelle architecture d\u2019IA r\u00e9side dans la r\u00e9duction de la dette technique et des d\u00e9pendances. Avant WordPress 7.0, l\u2019ajout de fonctionnalit\u00e9s d\u2019IA entra\u00eenait un co\u00fbt tr\u00e8s \u00e9lev\u00e9 en termes de maintenance du code. Vous deviez int\u00e9grer des SDK propri\u00e9taires tiers (tels que les biblioth\u00e8ques officielles <a href=\"https:\/\/developers.openai.com\/api\/docs\/libraries\" target=\"_blank\" rel=\"noopener noreferrer\">d\u2019OpenAI<\/a> ou <a href=\"https:\/\/platform.claude.com\/docs\/en\/api\/client-sdks\" target=\"_blank\" rel=\"noopener noreferrer\">d\u2019Anthropic<\/a>) et surveiller en permanence les versions de ces biblioth\u00e8ques. Cela alourdissait consid\u00e9rablement la base de code des extensions et ouvrait la voie \u00e0 des erreurs de compatibilit\u00e9.<\/p>\n<p>De plus, il fallait \u00e9crire de nombreuses lignes de code pour g\u00e9rer la logique r\u00e9seau et l\u2019analyse des r\u00e9ponses. Pour aggraver encore la situation, le code \u00e9tait sp\u00e9cifique \u00e0 chaque fournisseur ; ainsi, si vous d\u00e9cidiez de changer de fournisseur d\u2019IA, vous deviez r\u00e9\u00e9crire l\u2019int\u00e9gralit\u00e9 de l\u2019architecture r\u00e9seau de votre extension.<\/p>\n<p>AI Client r\u00e9sout ce probl\u00e8me \u00e0 la racine en transf\u00e9rant tout ce travail fastidieux au c\u0153ur de WordPress. Votre code devient totalement ind\u00e9pendant du fournisseur d\u2019IA ; il vous suffit d\u2019\u00e9crire vos instructions une seule fois, et WordPress les traduira dans le \u00ab dialecte \u00bb sp\u00e9cifique du mod\u00e8le.<\/p>\n<h4>S\u00e9lection intelligente des mod\u00e8les<\/h4>\n<p>L\u2019une des fonctionnalit\u00e9s puissantes de l\u2019interface Fluent de l\u2019AI Client r\u00e9side dans la possibilit\u00e9 de d\u00e9finir des mod\u00e8les pr\u00e9f\u00e9r\u00e9s via la m\u00e9thode <code>using_model_preference()<\/code>, accessible par le biais de la fonction de construction <code>wp_ai_client_prompt()<\/code>. Cette m\u00e9thode vous permet de d\u00e9clarer une liste ordonn\u00e9e de mod\u00e8les pour la t\u00e2che sp\u00e9cifique de votre extension. Par exemple, le code suivant demande la g\u00e9n\u00e9ration de texte en ciblant trois mod\u00e8les pr\u00e9f\u00e9r\u00e9s :<\/p>\n<pre><code class=\"language-php\">$text_result = wp_ai_client_prompt( 'Convert the following transcript into a concise, blog-ready draft.' )\n\t-&gt;using_model_preference(\n\t\t'gemini-2.5-flash',\n\t\t'claude-3-5-sonnet',\n\t\t'gpt-4o'\n\t)\n\t-&gt;generate_text();<\/code><\/pre>\n<p>WordPress v\u00e9rifiera les fournisseurs configur\u00e9s sur l\u2019\u00e9cran \u00ab Connecteurs \u00bb et parcourra la liste des mod\u00e8les d\u00e9finis dans le code de l&rsquo;extension, en s\u00e9lectionnant le premier connecteur \u00e9galement disponible sur le site. Si aucun des mod\u00e8les sp\u00e9cifi\u00e9s dans votre code n\u2019est disponible parmi les connecteurs actifs, WordPress ignorera la liste des mod\u00e8les pr\u00e9f\u00e9r\u00e9s et se rabattra sur le premier mod\u00e8le compatible configur\u00e9 sur le site.<\/p>\n<p>Ce m\u00e9canisme garantit que votre plugin fonctionnera toujours, m\u00eame si l\u2019administrateur du site passe \u00e0 un autre fournisseur d\u2019IA.<\/p>\n<h3>Fournisseur d\u2019IA<\/h3>\n<p>Un fournisseur d\u2019IA est l\u2019entreprise qui poss\u00e8de, entra\u00eene et h\u00e9berge les grands mod\u00e8les linguistiques (LLM) que nous utilisons quotidiennement. OpenAI, Google Gemini et Anthropic sont les fournisseurs d\u2019IA les plus courants pris en charge via des connecteurs d\u00e9di\u00e9s dans WordPress 7.0, mais les d\u00e9veloppeurs peuvent enregistrer d\u2019autres fournisseurs d\u2019IA personnalis\u00e9s.<\/p>\n<p>Lorsque le code de votre extension appelle la m\u00e9thode <code>generate_text()<\/code>\u2014 ou toute autre m\u00e9thode de g\u00e9n\u00e9ration \u2014, WordPress compile et envoie une charge utile de donn\u00e9es au fournisseur d\u2019IA via le point de terminaison \u00e9tabli par le connecteur. Voici la s\u00e9quence d\u2019op\u00e9rations qui se d\u00e9roule en arri\u00e8re-plan :<\/p>\n<ul>\n<li>Dans un premier temps, le fournisseur d\u2019IA re\u00e7oit le texte de la requ\u00eate ainsi que les \u00e9ventuels fichiers multim\u00e9dias joints (charge utile).<\/li>\n<li>Une fois la demande re\u00e7ue, il la traite en appliquant les instructions du syst\u00e8me.<\/li>\n<li>\u00c0 partir de l\u00e0, il g\u00e9n\u00e8re la sortie sous forme de texte libre ou d\u2019objet JSON.<\/li>\n<li>Enfin, il renvoie cette sortie \u00e0 WordPress via une r\u00e9ponse HTTP.<\/li>\n<\/ul>\n<p>Chaque fournisseur propose une grande vari\u00e9t\u00e9 de mod\u00e8les aux capacit\u00e9s, vitesses et tarifs vari\u00e9s. Ceux-ci vont des mod\u00e8les sp\u00e9cialis\u00e9s exclusivement dans le traitement de texte aux mod\u00e8les multimodaux acceptant des fichiers multim\u00e9dias (audio, images, vid\u00e9o) en plus d\u2019une invite textuelle, en passant par des mod\u00e8les con\u00e7us pour des t\u00e2ches sp\u00e9cifiques, telles que la g\u00e9n\u00e9ration d\u2019images ou la conversion de la parole en texte.<\/p>\n<figure id=\"attachment_211411\" aria-describedby=\"caption-attachment-211411\" style=\"width: 1718px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211411 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/gemini-3-models.png\" alt=\"La famille de mod\u00e8les Gemini 3 de Google.\" width=\"1718\" height=\"1534\"><figcaption id=\"caption-attachment-211411\" class=\"wp-caption-text\">La famille de mod\u00e8les Gemini 3 de Google.<\/figcaption><\/figure>\n<p>Une fois encore, les mod\u00e8les disponibles pour un site WordPress d\u00e9pendent des fournisseurs d\u2019IA que l\u2019utilisateur configure dans l\u2019\u00e9cran \u00ab Connecteurs \u00bb. Cela signifie que votre extension ne dicte pas quel fournisseur sp\u00e9cifique utiliser.<\/p>\n<h2>Analyse approfondie de la fonction wp_ai_client_prompt()<\/h2>\n<p>La fonction <code>wp_ai_client_prompt()<\/code>\u00a0permet aux plugins de communiquer avec les mod\u00e8les d\u2019IA de mani\u00e8re standardis\u00e9e : vous n\u2019aurez pas \u00e0 installer de biblioth\u00e8ques externes, \u00e0 g\u00e9rer des configurations sp\u00e9cifiques \u00e0 chaque fournisseur, ni \u00e0 coder en dur des requ\u00eates HTTP manuelles.<\/p>\n<p>Il s\u2019agit d\u2019une interface logicielle qui vous permet d\u2019\u00e9crire votre code une seule fois, laissant WordPress se charger du gros du travail et traduire vos instructions dans le \u00ab dialecte \u00bb sp\u00e9cifique \u00e0 chaque mod\u00e8le.<\/p>\n<p>La fonction renvoie une instance de la <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ai_client_prompt_builder\/\" target=\"_blank\" rel=\"noopener noreferrer\">classe <code>WP_AI_Client_Prompt_Builder<\/code><\/a>, qui fournit une interface fluide compos\u00e9e de m\u00e9thodes encha\u00eenables pour personnaliser vos invites. La fonction est <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\" target=\"_blank\" rel=\"noopener noreferrer\">d\u00e9crite comme suit<\/a> :<\/p>\n<pre><code class=\"language-php\">\/**\n * Fluent builder for constructing AI prompts, returning WP_Error on failure.\n *\n * This class provides a fluent interface for building prompts with various\n * content types and model configurations. It wraps the PHP AI Client SDK's\n * PromptBuilder and adds WordPress-specific behavior including WP_Error\n * handling instead of exceptions, snake_case method naming, and integration\n * with the Abilities API.\n *\n * Only the generating methods will return a WP_Error, to not break the fluent\n * interface. As soon as any exception is caught in a chain of method calls,\n * the returned instance will be in an error state, and all subsequent method\n * calls will be no-ops that just return the same error state instance. Only\n * when a generating method is called, the WP_Error will be returned.\n *\/<\/code><\/pre>\n<p><code>wp_ai_client_prompt()<\/code> elle n\u2019effectue pas de requ\u00eate HTTP imm\u00e9diate ; elle instancie et renvoie plut\u00f4t un objet <code>WP_AI_Client_Prompt_Builder<\/code>. Plus de 50 m\u00e9thodes de configuration renseignent les propri\u00e9t\u00e9s priv\u00e9es de l\u2019objet \u00e0 l\u2019aide d\u2019une <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fluent_interface\" target=\"_blank\" rel=\"noopener noreferrer\">interface fluide<\/a>, ce qui rend le code tr\u00e8s lisible et facile \u00e0 \u00e9crire.<\/p>\n<p>Voici une liste non exhaustive des m\u00e9thodes que vous utiliserez le plus fr\u00e9quemment :<\/p>\n<ul>\n<li><code>with_text()<\/code>: Ajoute du texte au message actuel.<\/li>\n<li><code>with_file()<\/code>: Ajoute un fichier au message en cours.<\/li>\n<li><code>with_history()<\/code>: Ajoute des messages de l\u2019historique de la conversation.<\/li>\n<li><code>using_model_preference()<\/code>: D\u00e9finit les mod\u00e8les pr\u00e9f\u00e9r\u00e9s \u00e0 \u00e9valuer dans l\u2019ordre.<\/li>\n<li><code>using_system_instruction()<\/code>: D\u00e9finit l&rsquo;instruction syst\u00e8me.<\/li>\n<li><code>using_max_tokens()<\/code>: D\u00e9finit le nombre maximal de tokens \u00e0 g\u00e9n\u00e9rer.<\/li>\n<li><code>using_temperature()<\/code>: D\u00e9finit la temp\u00e9rature pour la g\u00e9n\u00e9ration.<\/li>\n<li><code>using_top_p()<\/code>: D\u00e9finit la valeur \u00ab top-p \u00bb pour la g\u00e9n\u00e9ration.<\/li>\n<li><code>using_top_k()<\/code>: D\u00e9finit la valeur \u00ab top-k \u00bb pour la g\u00e9n\u00e9ration.<\/li>\n<li><code>as_output_file_type()<\/code>: D\u00e9finit le type de fichier de sortie.<\/li>\n<li><code>as_json_response()<\/code>: Configure l&rsquo;invite pour la sortie de la r\u00e9ponse au format JSON.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: V\u00e9rifie si la g\u00e9n\u00e9ration de texte est prise en charge par la configuration active.<\/li>\n<li><code>is_supported_for_image_generation()<\/code>: V\u00e9rifie si la g\u00e9n\u00e9ration d\u2019images est prise en charge par la configuration active.<\/li>\n<li><code>is_supported_for_text_to_speech_conversion()<\/code>: V\u00e9rifie si la conversion texte-parole est prise en charge par la configuration active.<\/li>\n<li><code>is_supported_for_video_generation()<\/code>: V\u00e9rifie si la g\u00e9n\u00e9ration de vid\u00e9os est prise en charge par la configuration active.<\/li>\n<li><code>generate_text()<\/code>: G\u00e9n\u00e8re un r\u00e9sultat textuel \u00e0 partir de la consigne.<\/li>\n<li><code>generate_image()<\/code>: G\u00e9n\u00e8re une image \u00e0 partir de la consigne.<\/li>\n<li><code>convert_text_to_speech()<\/code>: Convertit le texte en parole.<\/li>\n<li><code>generate_speech()<\/code>: G\u00e9n\u00e8re un message vocal \u00e0 partir de la consigne.<\/li>\n<li><code>generate_video()<\/code>: G\u00e9n\u00e8re une vid\u00e9o \u00e0 partir de la consigne.<\/li>\n<\/ul>\n<p>Pour consulter la liste compl\u00e8te des m\u00e9thodes, veuillez vous reporter au <a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\" target=\"_blank\" rel=\"noopener noreferrer\">code source du c\u0153ur de WordPress<\/a>.<\/p>\n<p>Supposons que vous souhaitiez transcrire avec pr\u00e9cision le contenu d\u2019un fichier audio. Vous pourriez utiliser la fonction comme ci-dessous :<\/p>\n<pre><code class=\"language-php\">$transcription_builder = wp_ai_client_prompt( $prompt )\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\t\/\/ No configured provider supports the current prompt configuration.\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Voici ce que fait ce code :<\/p>\n<ul>\n<li><code>$prompt<\/code>: Repr\u00e9sente la cha\u00eene principale contenant vos instructions principales.<\/li>\n<li><code>with_file()<\/code>: Active les capacit\u00e9s multimodales de l\u2019interface. Dans l\u2019exemple ci-dessus, nous avons transmis la charge utile audio binaire pr\u00e9-encod\u00e9e sous forme de cha\u00eene encod\u00e9e en Base64, accompagn\u00e9e de son type MIME correspondant.<\/li>\n<li><code>using_temperature()<\/code>: Contr\u00f4le le d\u00e9terminisme de la r\u00e9ponse. Alors qu\u2019une valeur faible (0,1) oblige le mod\u00e8le \u00e0 rester fid\u00e8le \u00e0 l\u2019audio, une valeur plus \u00e9lev\u00e9e permet une plus grande libert\u00e9 cr\u00e9ative. Vous pouvez combiner cette m\u00e9thode avec la m\u00e9thode \u00ab <code>using_top_p()<\/code> \u00bb (probabilit\u00e9 maximale) pour un contr\u00f4le plus pr\u00e9cis de la sortie.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: V\u00e9rifie si les connecteurs actifs prennent en charge les exigences de la requ\u00eate actuelle avant d\u2019allouer des ressources \u00e0 un appel r\u00e9seau.<\/li>\n<li><code>generate_text()<\/code>: Il s\u2019agit de la m\u00e9thode de terminaison de l\u2019interface Fluent. Elle envoie la requ\u00eate HTTP unifi\u00e9e au fournisseur actif et renvoie soit la cha\u00eene de texte g\u00e9n\u00e9r\u00e9e, soit un objet \u00ab <code>WP_Error<\/code> \u00bb en cas d\u2019\u00e9chec.<\/li>\n<\/ul>\n<p>En r\u00e9sum\u00e9, nous avons transmis au fournisseur d\u2019IA une invite textuelle et un fichier audio joint. Nous avons d\u00e9fini une \u00ab temp\u00e9rature \u00bb faible afin de garantir un r\u00e9sultat aussi d\u00e9terministe que possible, v\u00e9rifi\u00e9 que la configuration active prenait en charge la g\u00e9n\u00e9ration de texte, puis enfin ex\u00e9cut\u00e9 la transcription de la parole en texte sur la base de la r\u00e9ponse de l\u2019IA.<\/p>\n<p>\u00c0 l\u2019aide d\u2019une autre instruction, nous pouvons renvoyer la transcription brute \u00e0 l\u2019IA afin de g\u00e9n\u00e9rer une r\u00e9ponse structur\u00e9e sous la forme d\u2019un objet JSON :<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in American English.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;using_system_instruction( \"You are a professional WordPress content editor. Always write in American English (use appropriate spelling, grammar, and conventions for that language variant).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();<\/code><\/pre>\n<p>Pour cette deuxi\u00e8me instruction, nous utilisons des m\u00e9thodes suppl\u00e9mentaires afin d\u2019exploiter d\u2019autres fonctionnalit\u00e9s de l\u2019API :<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code>: D\u00e9finit le contexte op\u00e9rationnel et le r\u00f4le comportemental du mod\u00e8le, en s\u00e9parant clairement son profil (\u00ab un r\u00e9dacteur de contenu WordPress professionnel \u00bb) de la charge utile des donn\u00e9es.<\/li>\n<li><code>using_temperature( 0.4 )<\/code>: D\u00e9finit un niveau de \u00ab temp\u00e9rature \u00bb plus \u00e9lev\u00e9 que lors de la t\u00e2che de transcription pr\u00e9c\u00e9dente, ce qui permet au mod\u00e8le d\u2019utiliser un vocabulaire plus riche et de produire un contenu plus fluide.<\/li>\n<li><code>as_json_response()<\/code>: Oblige le mod\u00e8le \u00e0 renvoyer une cha\u00eene JSON structur\u00e9e qui correspond \u00e0 la mise en page d\u00e9finie dans votre variable <code>$schema<\/code>. Cela s\u2019av\u00e8re utile lors de la pr\u00e9paration de contenu pour Gutenberg.<\/li>\n<\/ul>\n<p>Gr\u00e2ce \u00e0 une sortie structur\u00e9e au format JSON, vous pouvez extraire des champs individuels et les mapper par programmation dans des blocs Gutenberg natifs \u00e0 l\u2019aide des fonctions principales de WordPress.<\/p>\n<p>Pour un aper\u00e7u plus d\u00e9taill\u00e9 de l\u2019AI Client, consultez \u00e9galement la note de d\u00e9veloppement \u00ab <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">Pr\u00e9sentation de l\u2019AI Client dans WordPress 7.0<\/a> \u00bb.<\/p>\n<h2>Convertir un fichier audio en contenu compatible avec Gutenberg gr\u00e2ce \u00e0 l\u2019IA<\/h2>\n<p>Maintenant que vous comprenez mieux les trois couches de l\u2019architecture IA de WordPress, voyons comment tout cela s\u2019articule \u00e0 l\u2019aide d\u2019un exemple concret. Dans cette section, vous apprendrez \u00e0 mettre en place la logique centrale d\u2019une extension aliment\u00e9e par l\u2019IA, con\u00e7ue pour g\u00e9n\u00e9rer un brouillon d\u2019article bien r\u00e9dig\u00e9 directement \u00e0 partir d\u2019un fichier audio.<\/p>\n<p>Les cas d\u2019utilisation de cette fonctionnalit\u00e9 sont nombreux et vari\u00e9s. Imaginez pouvoir cr\u00e9er un article de blog complet \u00e0 partir d\u2019une br\u00e8ve note vocale envoy\u00e9e via votre application de messagerie pr\u00e9f\u00e9r\u00e9e, ou transcrire une interview audio enregistr\u00e9e sur votre smartphone.<\/p>\n<p>Pour mettre en \u0153uvre cette fonctionnalit\u00e9 sur votre site WordPress, vous devrez cr\u00e9er une extension personnalis\u00e9. Nous n\u2019aborderons pas ici les fichiers de base ni le processus complet d\u2019enregistrement de l&rsquo;extensio ; pour les principes fondamentaux du d\u00e9veloppement d&rsquo;extensions, vous pouvez vous reporter \u00e0 <a href=\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\">d\u2019autres tutoriels<\/a> sur le blog Kinsta ou \u00e0 la <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/how-to\/how-to-create-custom-plugins\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentation officielle de WordPress.org<\/a>.<\/p>\n<p>Nous nous concentrerons sur la logique centrale qui permet \u00e0 votre extension de communiquer avec votre fournisseur d\u2019IA. Mais ne vous inqui\u00e9tez pas, l&rsquo;extension est disponible \u00e0 la consultation et au t\u00e9l\u00e9chargement dans <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\" target=\"_blank\" rel=\"noopener noreferrer\">ce d\u00e9p\u00f4t GitHub<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>L&rsquo;extension d\u2019exemple de ce tutoriel a \u00e9t\u00e9 d\u00e9velopp\u00e9 sous WordPress 7.0. Elle ne fonctionnera pas sur les versions ant\u00e9rieures du CMS.<\/p>\n<\/aside>\n\n<h3>Fonctionnalit\u00e9s de ce plugin<\/h3>\n<p>Pour commencer, rendez-vous sur la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\" target=\"_blank\" rel=\"noopener noreferrer\">page du projet GitHub<\/a> et t\u00e9l\u00e9chargez l\u2019archive ZIP de l&rsquo;extension. Ensuite, connectez-vous \u00e0 votre tableau de bord WordPress 7.0 et importez-la via <strong>Extensions<\/strong> &gt; <strong>Ajouter<\/strong> &gt; <strong>T\u00e9l\u00e9verser une extension<\/strong>. Une fois l&rsquo;extension install\u00e9e et activ\u00e9e, vous \u00eates pr\u00eat \u00e0 suivre ce tutoriel.<\/p>\n<p>L&rsquo;extension <strong>AI Content Builder<\/strong> g\u00e9n\u00e8re une colonne lat\u00e9rale de r\u00e9glages personnalis\u00e9s, accessible via une ic\u00f4ne situ\u00e9e dans le coin sup\u00e9rieur droit de l\u2019interface de l\u2019\u00e9diteur de blocs. Cette colonne lat\u00e9rale comporte une interface d\u00e9di\u00e9e au t\u00e9l\u00e9versement de fichiers audio ainsi qu\u2019un bouton permettant \u00e0 l\u2019IA de remplacer le titre actuel de l\u2019article.<\/p>\n<figure id=\"attachment_211625\" aria-describedby=\"caption-attachment-211625\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211625 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-content-builder-sidebar.png\" alt=\"L'extension AI Content Builder ajoute une colonne lat\u00e9rale de r\u00e9glages personnalis\u00e9s \u00e0 l\u2019\u00e9diteur de blocs.\" width=\"1612\" height=\"1054\"><figcaption id=\"caption-attachment-211625\" class=\"wp-caption-text\">L&rsquo;extension AI Content Builder ajoute une colonne lat\u00e9rale de r\u00e9glages personnalis\u00e9s \u00e0 l\u2019\u00e9diteur de blocs.<\/figcaption><\/figure>\n<p>Le bouton \u00ab <strong>Importer un fichier audio<\/strong> \u00bb ouvre l\u2019outil d\u2019importation de m\u00e9dias de WordPress, vous permettant d\u2019importer un nouveau fichier audio ou d\u2019en s\u00e9lectionner un existant dans votre m\u00e9diath\u00e8que.<\/p>\n<figure id=\"attachment_211626\" aria-describedby=\"caption-attachment-211626\" style=\"width: 1560px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211626 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/select-or-upload-media.png\" alt=\"S\u00e9lectionnez ou importez des fichiers audio dans la m\u00e9diath\u00e8que de WordPress.\" width=\"1560\" height=\"1328\"><figcaption id=\"caption-attachment-211626\" class=\"wp-caption-text\">S\u00e9lectionnez ou importez des fichiers audio dans la m\u00e9diath\u00e8que de WordPress.<\/figcaption><\/figure>\n<p>Une fois le fichier audio charg\u00e9, le bouton \u00ab <strong>G\u00e9n\u00e9rer du contenu<\/strong> \u00bb d\u00e9clenche une requ\u00eate asynchrone vers votre fournisseur d\u2019IA actif.<\/p>\n<figure id=\"attachment_211627\" aria-describedby=\"caption-attachment-211627\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211627 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/generate-content-button.png\" alt=\"La colonne lat\u00e9rale de l'extension avec le bouton \u00ab G\u00e9n\u00e9rer du contenu \u00bb actif.\" width=\"1616\" height=\"1062\"><figcaption id=\"caption-attachment-211627\" class=\"wp-caption-text\">La colonne lat\u00e9rale de l&rsquo;extension avec le bouton \u00ab G\u00e9n\u00e9rer du contenu \u00bb actif.<\/figcaption><\/figure>\n<p>L\u2019image ci-dessous montre le brouillon final de l\u2019article g\u00e9n\u00e9r\u00e9 par l\u2019IA en quelques secondes seulement.<\/p>\n<figure id=\"attachment_211628\" aria-describedby=\"caption-attachment-211628\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211628 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-generated-post-content.png\" alt=\"Un brouillon d\u2019article de blog bien format\u00e9, g\u00e9n\u00e9r\u00e9 par l\u2019IA \u00e0 partir d\u2019un fichier audio brut.\" width=\"1612\" height=\"1336\"><figcaption id=\"caption-attachment-211628\" class=\"wp-caption-text\">Un brouillon d\u2019article de blog bien format\u00e9, g\u00e9n\u00e9r\u00e9 par l\u2019IA \u00e0 partir d\u2019un fichier audio brut.<\/figcaption><\/figure>\n<p>Le contenu obtenu est structur\u00e9 en blocs Gutenberg natifs, comprenant des paragraphes, des titres et des listes.<\/p>\n<figure id=\"attachment_211629\" aria-describedby=\"caption-attachment-211629\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211629 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/post-content-in-code-editor.png\" alt=\"Un balisage bien structur\u00e9 dans l\u2019\u00e9diteur de code WordPress.\" width=\"1616\" height=\"1396\"><figcaption id=\"caption-attachment-211629\" class=\"wp-caption-text\">Un balisage bien structur\u00e9 dans l\u2019\u00e9diteur de code WordPress.<\/figcaption><\/figure>\n<p>Penchons-nous maintenant sur le fonctionnement de l&rsquo;extension.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Cette extension a \u00e9t\u00e9 cr\u00e9\u00e9e sp\u00e9cialement pour ce tutoriel et est destin\u00e9e uniquement \u00e0 des fins d\u2019illustration. Ne l\u2019utilisez pas en production.<\/p>\n<\/aside>\n\n<h3>Ce dont vous avez besoin pour ce plugin<\/h3>\n<p>Voici les pr\u00e9requis de base pour d\u00e9velopper une extension WordPress qui s\u2019int\u00e8gre \u00e0 la nouvelle architecture d\u2019IA afin de g\u00e9n\u00e9rer le contenu de vos articles :<\/p>\n<ul>\n<li>WordPress 7.0<\/li>\n<li>Une cl\u00e9 API d\u2019un fournisseur d\u2019IA proposant un mod\u00e8le capable de convertir la parole en texte. Dans notre exemple, nous utiliserons Google AI.<\/li>\n<li>Votre IDE pr\u00e9f\u00e9r\u00e9. Pour cette extension, nous avons utilis\u00e9 VS Code.<\/li>\n<li>Une solide ma\u00eetrise du d\u00e9veloppement WordPress et Gutenberg, des API REST, du PHP et du JavaScript.<\/li>\n<\/ul>\n<p>Vous n\u2019avez pas \u00e0 vous soucier de Node.js, des processus de compilation ou de l\u2019importation de biblioth\u00e8ques externes, car cette extension s\u2019appuie enti\u00e8rement sur les API natives du c\u0153ur de WordPress. Le r\u00e9sultat est une extension l\u00e9g\u00e8re et s\u00e9curis\u00e9e, sans aucune dette technique.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>En raison de contraintes d\u2019espace, les sections suivantes se concentreront exclusivement sur le code r\u00e9gissant la communication avec le client IA et la gestion du contenu g\u00e9n\u00e9r\u00e9 par l\u2019IA. Le reste du code est enti\u00e8rement document\u00e9 dans le <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/tree\/35ef318c10768969e235c89617a59cc4b6b38eb4\" target=\"_blank\" rel=\"noopener noreferrer\">d\u00e9p\u00f4t GitHub<\/a>.<\/p>\n<\/aside>\n\n<h3>Structure du plugin et version minimale de WordPress<\/h3>\n<p>L&rsquo;extension AI Content Builder se compose de deux fichiers seulement :<\/p>\n<ul>\n<li><code>ai-content-builder.php<\/code><\/li>\n<li><code>editor.js.<\/code><\/li>\n<\/ul>\n<p>La version minimale n\u00e9cessaire de WordPress est la 7.0 ; veillez donc \u00e0 la d\u00e9finir dans l\u2019en-t\u00eate de l&rsquo;extension :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name: AI Content Builder\n * Description: Gutenberg sidebar plugin that uploads audio and generates post content using the WordPress 7.0 AI Client.\n * Version: 1.0.0\n * Requires at least: 7.0\n * Requires PHP: 8.0\n * Author: Your Name\n * License: GPL-2.0-or-later\n * Text Domain: ai-content-builder\n *\/<\/code><\/pre>\n<p>Cela \u00e9tant dit, examinons le processus de cr\u00e9ation d\u2019une extension WordPress aliment\u00e9e par l\u2019IA.<\/p>\n<h3>Le flux de donn\u00e9es du plugin<\/h3>\n<p>Avant de nous plonger dans le code, examinons comment les donn\u00e9es circulent depuis le backend de WordPress (l\u2019\u00e9diteur de blocs) vers le serveur PHP et le fournisseur d\u2019IA, puis reviennent dans le sens inverse.<\/p>\n<p><a href=\"#register-api-endpoint\">1. Du navigateur au serveur : appel REST asynchrone<\/a> : le navigateur envoie l\u2019identifiant audio au point de terminaison REST personnalis\u00e9 de l&rsquo;extension. Pour \u00e9viter que l\u2019interface utilisateur ne se fige, nous enregistrons un point de terminaison REST qui autorise les requ\u00eates asynchrones vers le serveur PHP.<\/p>\n<p><a href=\"#first-ai-pass\">2. Premier passage par l\u2019IA : transcription de la parole en texte<\/a> : le serveur intercepte la requ\u00eate, r\u00e9cup\u00e8re le fichier audio depuis la base de donn\u00e9es et interroge le client IA afin d\u2019extraire la transcription brute sous forme de texte.<\/p>\n<p><a href=\"#second-ai-pass\">3. Deuxi\u00e8me passage par l\u2019IA : structuration du contenu<\/a> : le serveur renvoie la transcription brute au client IA et lui demande de la formater sous la forme d\u2019un objet JSON structur\u00e9.<\/p>\n<p><a href=\"#block-generation\">4. Hydratation des donn\u00e9es et g\u00e9n\u00e9ration de blocs<\/a> : le script JavaScript (JS) re\u00e7oit l\u2019objet JSON structur\u00e9, le normalise et mappe les champs aux blocs natifs de Gutenberg.<\/p>\n<p>Examinons maintenant la logique qui sous-tend chaque phase.<\/p>\n<h3 id=\"register-api-endpoint\">1. Enregistrement d\u2019un point de terminaison API personnalis\u00e9<\/h3>\n<p>La premi\u00e8re \u00e9tape de la cr\u00e9ation de l&rsquo;extension <strong>AI Content Builder<\/strong> consiste \u00e0 enregistrer un point de terminaison API. Cette \u00e9tape est essentielle, car le traitement d\u2019un fichier audio et la g\u00e9n\u00e9ration d\u2019une r\u00e9ponse peuvent prendre plusieurs secondes (voire plusieurs minutes) pour le mod\u00e8le d\u2019IA. <strong>L\u2019enregistrement d\u2019un point de terminaison REST vous permet d\u2019effectuer des requ\u00eates asynchrones via les commandes de la colonne lat\u00e9rale, ce qui \u00e9vite le gel de l\u2019interface utilisateur.<\/strong><\/p>\n<p>L\u2019enregistrement d\u2019un point de terminaison API vous permet \u00e9galement d\u2019effectuer des appels IA s\u00e9curis\u00e9s sans exposer vos identifiants de connexion, en tirant parti du syst\u00e8me d\u2019authentification natif de WordPress.<\/p>\n<p>La logique d\u2019enregistrement et d\u2019initialisation du point de terminaison est g\u00e9r\u00e9e dans le fichier PHP de l&rsquo;extension \u00e0 l\u2019aide de deux m\u00e9thodes de classe : <code>init()<\/code> et <code>register_rest_routes()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function init(): void {\n\n\t\/\/ Register the custom REST endpoint used by the sidebar JS.\n\tadd_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );\n\n\t...\n}<\/code><\/pre>\n<p>En associant l\u2019appel de fonction au hook <code>rest_api_init<\/code>, l&rsquo;extension n\u2019enregistre la racine du point de terminaison que lorsqu\u2019une requ\u00eate API REST est d\u00e9clench\u00e9e. Cela am\u00e9liore les performances en \u00e9vitant les retards inutiles lors du chargement des pages.<\/p>\n<p>Vous pouvez configurer les routes \u00e0 l\u2019aide de la m\u00e9thode <code>register_rest_routes()<\/code>, comme indiqu\u00e9 dans le code ci-dessous :<\/p>\n<pre><code class=\"language-php\">public static function register_rest_routes(): void {\n\tregister_rest_route(\n\t\tself::REST_NAMESPACE,\n\t\tself::REST_ROUTE,\n\t\tarray(\n\t\t\t'methods'             =&gt; WP_REST_Server::CREATABLE, \/\/ Alias for POST.\n\t\t\t'callback'            =&gt; array( __CLASS__, 'handle_generate_request' ),\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\t\/\/ Reject unauthenticated or insufficiently privileged requests early.\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'args'                =&gt; array(\n\t\t\t\t'audio_id' =&gt; array(\n\t\t\t\t\t'type'     =&gt; 'integer',\n\t\t\t\t\t'required' =&gt; true,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}<\/code><\/pre>\n<p>Cette m\u00e9thode effectue les op\u00e9rations suivantes :<\/p>\n<ul>\n<li>La <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_rest_route\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>register_rest_route()<\/code><\/a>\u00a0prend trois param\u00e8tres : l\u2019espace de noms de la route, la route elle-m\u00eame et un tableau de configuration.<\/li>\n<li><code>WP_REST_Server::CREATABLE<\/code> est un alias de la m\u00e9thode de transport POST, utilis\u00e9 pour garantir une compatibilit\u00e9 maximale avec l\u2019architecture interne de WordPress.<\/li>\n<li><code>permission_callback<\/code> est une fonction anonyme qui limite l\u2019acc\u00e8s aux utilisateurs authentifi\u00e9s disposant des droits n\u00e9cessaires pour cr\u00e9er et modifier leurs propres articles. WordPress bloque alors la requ\u00eate avant de la traiter et renvoie automatiquement une erreur <a href=\"https:\/\/kinsta.com\/fr\/blog\/erreur-401\/\">401 Non autoris\u00e9<\/a> ou <a href=\"https:\/\/kinsta.com\/fr\/blog\/erreur-403-forbidden\/\">403 Acc\u00e8s interdit<\/a> en cas d\u2019acc\u00e8s non autoris\u00e9.<\/li>\n<li><code>args<\/code> Il s\u2019agit d\u2019un tableau facultatif de param\u00e8tres suppl\u00e9mentaires pouvant \u00eatre utilis\u00e9s pour modifier la r\u00e9ponse de l\u2019API. Il vous permet de sp\u00e9cifier les donn\u00e9es que la requ\u00eate adress\u00e9e au point de terminaison doit renvoyer.<\/li>\n<li><code>audio_id<\/code> est un tableau de param\u00e8tres qui sp\u00e9cifie le type de donn\u00e9es n\u00e9cessaire. Si le type de donn\u00e9es renvoy\u00e9 n\u2019est pas un entier ou s\u2019il est manquant, l\u2019API REST interrompt son ex\u00e9cution et g\u00e9n\u00e8re une erreur.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Veuillez vous reporter \u00e0 la documentation officielle pour plus d\u2019informations sur les <a href=\"https:\/\/developer.wordpress.org\/rest-api\/extending-the-rest-api\/routes-and-endpoints\/\" target=\"_blank\" rel=\"noopener noreferrer\">routes et les points de terminaison<\/a>.<\/p>\n<\/aside>\n\n<p>Enfin, assurez-vous que la colonne lat\u00e9rale de l\u2019\u00e9diteur sait o\u00f9 envoyer les donn\u00e9es. Pour ce faire, utilisez la fonction <code>wp_localize_script()<\/code>\u00a0au sein de la m\u00e9thode <code>enqueue_editor_assets()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function enqueue_editor_assets(): void {\n\t...\n\n\twp_localize_script(\n\t\t'ai-content-builder-editor',\n\t\t'AICBData',\n\t\tarray(\n\t\t\t'restPath' =&gt; '\/' . self::REST_NAMESPACE . self::REST_ROUTE,\n\t\t\t'nonce'    =&gt; wp_create_nonce( 'wp_rest' ),\n\t\t)\n\t);\n}<\/code><\/pre>\n<ul>\n<li>La <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_localize_script\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>wp_localize_script()<\/code><\/a> sert principalement \u00e0 associer un script enregistr\u00e9 \u00e0 une variable JavaScript, mais ici, nous l\u2019utilisons pour transmettre des donn\u00e9es de PHP vers JavaScript via l\u2019objet global <code>AICBData<\/code>.<\/li>\n<li><code>restPath<\/code> Il s&rsquo;agit de l&rsquo;adresse du point de terminaison ; en la sp\u00e9cifiant ici, vous \u00e9vitez de la coder en dur dans le fichier JavaScript.<\/li>\n<li><code>nonce<\/code> d\u00e9finit un jeton de s\u00e9curit\u00e9 afin d\u2019<a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_create_nonce\/\" target=\"_blank\" rel=\"noopener noreferrer\">emp\u00eacher tout acc\u00e8s non autoris\u00e9<\/a>.<\/li>\n<\/ul>\n<h3 id=\"first-ai-pass\">2. Acc\u00e9der au client IA pour extraire du texte d\u2019un fichier audio<\/h3>\n<p>Le c\u0153ur de notre extension est la m\u00e9thode <code>handle_generate_request()<\/code>. Cette m\u00e9thode effectue une s\u00e9quence de t\u00e2ches, commen\u00e7ant par des contr\u00f4les de s\u00e9curit\u00e9 et se terminant par la g\u00e9n\u00e9ration du contenu de l\u2019article \u00e0 ins\u00e9rer dans l\u2019\u00e9diteur de blocs.<\/p>\n<p>Tout d\u2019abord, elle v\u00e9rifie que le client IA est disponible et que la prise en charge de l\u2019IA n\u2019a pas \u00e9t\u00e9 d\u00e9sactiv\u00e9e sur le site.<\/p>\n<pre><code class=\"language-php\">public static function handle_generate_request( WP_REST_Request $request ) {\n\tif ( ! function_exists( 'wp_ai_client_prompt' ) ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_client_unavailable',\n\t\t\t'WordPress AI Client is not available. This plugin requires WordPress 7.0 .',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\tif ( function_exists( 'wp_supports_ai' ) && ! wp_supports_ai() ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_disabled',\n\t\t\t'AI support is disabled on this site.',\n\t\t\tarray( 'status' =&gt; 403 )\n\t\t);\n\t}\n\t...\n}<\/code><\/pre>\n<p>En cas d\u2019\u00e9chec, ces v\u00e9rifications renvoient respectivement une erreur 500 ou 403.<\/p>\n<p>Le bloc de code suivant effectue les actions suivantes :<\/p>\n<ul>\n<li>Extrait l\u2019identifiant du fichier audio de la requ\u00eate<\/li>\n<li>S&rsquo;assure que l&rsquo;identifiant du fichier audio est un entier positif<\/li>\n<li>V\u00e9rifie le type de fichier<\/li>\n<li>R\u00e9cup\u00e8re le type MIME<\/li>\n<li>Extrait et encode le contenu du fichier en Base64<\/li>\n<\/ul>\n<pre><code class=\"language-php\">$audio_id = absint( $request-&gt;get_param( 'audio_id' ) );\nif ( ! $audio_id ) {\n\treturn new WP_Error( 'invalid_audio_id', 'Invalid audio ID.', array( 'status' =&gt; 400 ) );\n}\n\n$attachment = get_post( $audio_id );\nif ( ! $attachment || 'attachment' !== $attachment-&gt;post_type ) {\n\treturn new WP_Error( 'audio_not_found', 'Audio attachment not found.', array( 'status' =&gt; 404 ) );\n}\n\n$mime_type = (string) get_post_mime_type( $audio_id );\nif ( 0 !== strpos( $mime_type, 'audio\/' ) ) {\n\treturn new WP_Error( 'invalid_audio_type', 'Attachment must be an audio file.', array( 'status' =&gt; 400 ) );\n}\n\n$audio_path = get_attached_file( $audio_id );\nif ( ! $audio_path || ! file_exists( $audio_path ) ) {\n\treturn new WP_Error( 'audio_path_missing', 'Audio file path not found on server.', array( 'status' =&gt; 404 ) );\n}\n\n$audio_bytes = file_get_contents( $audio_path );\nif ( false === $audio_bytes ) {\n\treturn new WP_Error( 'audio_read_failed', 'Unable to read audio file.', array( 'status' =&gt; 500 ) );\n}\n\n$audio_base64 = base64_encode( $audio_bytes );<\/code><\/pre>\n<figure id=\"attachment_211767\" aria-describedby=\"caption-attachment-211767\" style=\"width: 1594px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211767 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/mime-type-error.png\" alt=\"Un message d\u2019erreur est g\u00e9n\u00e9r\u00e9 lorsque l\u2019utilisateur tente de traiter un type de fichier non valide\" width=\"1594\" height=\"1190\"><figcaption id=\"caption-attachment-211767\" class=\"wp-caption-text\">Un message d\u2019erreur est g\u00e9n\u00e9r\u00e9 lorsque l\u2019utilisateur tente de traiter un type de fichier non valide<\/figcaption><\/figure>\n<p>Le fichier binaire a ainsi \u00e9t\u00e9 converti en une cha\u00eene de caract\u00e8res pouvant \u00eatre transmise au client IA. Nous pouvons d\u00e9sormais passer \u00e0 l\u2019extraction du texte :<\/p>\n<pre><code class=\"language-php\">$output_language = self::get_output_language();\n\n$transcription_builder = wp_ai_client_prompt(\n\t\"Transcribe this voice note accurately into $output_language. Return plain text only.\"\n)\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Voici une explication d\u00e9taill\u00e9e du fonctionnement du code ci-dessus.<\/p>\n<ul>\n<li><code>get_output_language()<\/code> est une m\u00e9thode statique d\u00e9finie ailleurs dans le script qui renvoie les r\u00e9glages r\u00e9gionaux du site. (Voir <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L135\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a>.)<\/li>\n<li><code>wp_ai_client_prompt()<\/code> initialise une nouvelle requ\u00eate en transmettant l&rsquo;invite principale.<\/li>\n<li><code>with_file()<\/code> indique au client IA que nous envoyons une requ\u00eate multimodale ; il accepte le contenu du fichier au format Base64 ainsi que le type MIME.<\/li>\n<li><code>using_temperature()<\/code> vous permet de sp\u00e9cifier le niveau de d\u00e9terminisme de la r\u00e9ponse. Nous d\u00e9finissons une valeur faible afin d\u2019obtenir une transcription fid\u00e8le de l\u2019audio.<\/li>\n<li>La m\u00e9thode <code>is_supported_for_text_generation()<\/code> v\u00e9rifie si le fournisseur d\u2019IA est capable de g\u00e9n\u00e9rer du texte \u00e0 partir des donn\u00e9es fournies ; si le fournisseur ne prend pas en charge les entr\u00e9es multimodales, l&rsquo;extension s\u2019arr\u00eate et renvoie un message d\u2019erreur.<\/li>\n<li>La m\u00e9thode <code>generate_text()<\/code>\u00a0lance la requ\u00eate HTTP.<\/li>\n<\/ul>\n<h3 id=\"second-ai-pass\">3. Conversion de la transcription audio en contenu structur\u00e9<\/h3>\n<p>Maintenant que nous disposons de la transcription, l&rsquo;extension doit \u00e0 nouveau communiquer avec le fournisseur d\u2019IA afin d\u2019obtenir une r\u00e9ponse JSON structur\u00e9e. Pour cela, nous devons d\u00e9finir un tableau structur\u00e9 au format JSON.<\/p>\n<pre><code class=\"language-php\">$schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'title'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t'sections' =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array(\n\t\t\t\t'type'       =&gt; 'object',\n\t\t\t\t'properties' =&gt; array(\n\t\t\t\t\t'heading'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t'level'      =&gt; array(\n\t\t\t\t\t\t'type' =&gt; 'integer',\n\t\t\t\t\t),\n\t\t\t\t\t'paragraphs' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t\t'bullet_points' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t'required'   =&gt; array( 'heading', 'level', 'paragraphs' ),\n\t\t\t),\n\t\t),\n\t),\n\t'required'   =&gt; array( 'title', 'sections' ),\n);<\/code><\/pre>\n<p>Gr\u00e2ce \u00e0 cette structure, l\u2019IA r\u00e9pondra par un objet JSON contenant un titre et un tableau de sections. Chaque section doit comporter un en-t\u00eate, un niveau d\u2019en-t\u00eate, au moins un paragraphe et des puces.<\/p>\n<p>Le sch\u00e9ma \u00e9tant d\u00e9sormais d\u00e9fini, nous pouvons passer \u00e0 la configuration de la deuxi\u00e8me requ\u00eate adress\u00e9e au client IA :<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in $output_language.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;using_system_instruction( \"You are a professional WordPress content editor. Always write in $output_language (use appropriate spelling, grammar, and conventions for that language variant).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();\n\nif ( is_wp_error( $structured_json ) ) {\n\treturn $structured_json;\n}<\/code><\/pre>\n<p>Analysons les points cl\u00e9s de ce code :<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code> d\u00e9finit la personnalit\u00e9 du mod\u00e8le.<\/li>\n<li><code>using_temperature( 0.4 )<\/code> d\u00e9finit une valeur de \u00ab temp\u00e9rature \u00bb plus \u00e9lev\u00e9e, ce qui donne \u00e0 l\u2019IA une plus grande libert\u00e9 cr\u00e9ative pour g\u00e9n\u00e9rer une r\u00e9ponse et produire un texte plus fluide et plus riche.<\/li>\n<li><code>as_json_response( $schema )<\/code> demande au client de fournir la r\u00e9ponse dans un format structur\u00e9.<\/li>\n<li>L&rsquo;extension s\u2019arr\u00eate en cas d\u2019erreur.<\/li>\n<\/ul>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 d\u00e9coder et \u00e0 nettoyer les donn\u00e9es.<\/p>\n<pre><code class=\"language-php\">$structured = json_decode( (string) $structured_json, true );\n\nif ( ! is_array( $structured ) ) {\n\treturn new WP_Error(\n\t\t'invalid_ai_json',\n\t\t'Could not parse structured AI response.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}\n\n$normalized = self::normalize_structured_post( $structured );\n\nif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\treturn new WP_Error(\n\t\t'empty_structured_content',\n\t\t'The AI provider returned empty structured content.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}<\/code><\/pre>\n<p>Dans le code ci-dessus :<\/p>\n<ul>\n<li>La fonction <code>json_decode()<\/code>\u00a0convertit la cha\u00eene JSON en un tableau associatif PHP.<\/li>\n<li>Si le JSON est mal form\u00e9, la v\u00e9rification suivante renvoie un code d&rsquo;\u00e9tat 500 accompagn\u00e9 d&rsquo;un message d&rsquo;erreur clair.<\/li>\n<li>La m\u00e9thode statique <code>normalize_structured_post()<\/code>\u00a0nettoie et normalise la sortie du fournisseur avant de la transmettre \u00e0 JavaScript (voir la d\u00e9finition de cette fonction sur <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L476\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a>).<\/li>\n<\/ul>\n<p>Il ne reste plus qu\u2019\u00e0 transmettre le r\u00e9sultat obtenu \u00e0 JavaScript afin de g\u00e9n\u00e9rer des blocs Gutenberg natifs.<\/p>\n<h3 id=\"block-generation\">4. G\u00e9n\u00e9ration d\u2019une sortie compatible avec Gutenberg<\/h3>\n<p>L\u2019\u00e9tape suivante consiste \u00e0 mapper la sortie JSON aux blocs Gutenberg natifs. Cette phase s\u2019effectue c\u00f4t\u00e9 client et est g\u00e9r\u00e9e par le fichier <code>editor.js<\/code>.<\/p>\n<p>Lorsque l\u2019utilisateur s\u00e9lectionne un fichier audio, le <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L342\" target=\"_blank\" rel=\"noopener noreferrer\">code suivant<\/a> est d\u00e9clench\u00e9 :<\/p>\n<pre><code class=\"language-javascript\">function AIContentBuilderSidebar() {\n\n\tconst [ audioId, setAudioId ] = useState( 0 );\n\t...\n\n\tconst onSelectAudio = function ( media ) {\n\t\tif ( ! media || ! media.id ) {\n\t\t\treturn;\n\t\t}\n\t\tsetAudioId( media.id );\n\t\tsetAudioLabel( media.title || media.filename || ( 'Audio #'   media.id ) );\n\t\tsetNotice( null );\n\t};\n\t...\n}<\/code><\/pre>\n<p>Ce code r\u00e9cup\u00e8re l\u2019identifiant du fichier audio enregistr\u00e9 dans la base de donn\u00e9es WordPress.<\/p>\n<p>Lorsque l\u2019utilisateur clique sur le bouton \u00ab <strong>G\u00e9n\u00e9rer du contenu<\/strong> \u00bb, la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L382\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>onGenerate()<\/code><\/a> utilise <code>apiFetch()<\/code> pour envoyer une requ\u00eate POST au point de terminaison de l\u2019API, en incluant notamment l\u2019identifiant du fichier audio.<\/p>\n<pre><code class=\"language-javascript\">const onGenerate = async function () {\n\n\t...\n\n\ttry {\n\t\tconst response = await apiFetch( {\n\t\t\tpath: AICBData.restPath,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'X-WP-Nonce': AICBData.nonce,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\taudio_id: audioId,\n\t\t\t},\n\t\t} );\n\t\t...\n\t}\n\t...\n}<\/code><\/pre>\n<ul>\n<li><code>await<\/code> met temporairement la fonction en pause afin d\u2019\u00e9viter que le navigateur ne se bloque pendant l\u2019attente de la r\u00e9ponse de l\u2019IA.<\/li>\n<li>Une fois re\u00e7u, l\u2019objet JSON est stock\u00e9 temporairement dans la variable <code>response<\/code>.<\/li>\n<\/ul>\n<p>Le contenu de la variable <code>response<\/code>\u00a0sera un objet structur\u00e9 comme suit :<\/p>\n<pre><code class=\"language-json\">{\n\ttitle: \"Two Wheels to the Medina: ...\",\n\tsections: [\n\t\t{\n\t\t\theading: \"A Well-Deserved Rest in the Red City\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"On April 24th, our group of seven motorcyclists...\" ],\n\t\t\tbullet_points: []\n\t\t},\n\t\t{\n\t\t\theading: \"Diving into the Medina and Jemaa el-Fnaa\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"We spent the day exploring the historic Medina...\" ],\n\t\t\tbullet_points: [ \n\t\t\t\t\"Navigating the vibrant, maze-like alleys of the ancient Medina\", \n\t\t\t\t\"Tasting traditional Berber tagines and Moroccan mint tea\",\n\t\t\t\t\"Shopping for handmade leather goods, spices, and lanterns in the souks\" \n\t\t\t]\n\t\t},\n\t\t{...}\n\t],\n\tcontent: \"Fallback plain text...\",\n\ttranscript: \"Full transcript...\"\n}<\/code><\/pre>\n<p>Cet objet fournit les donn\u00e9es n\u00e9cessaires \u00e0 la cr\u00e9ation des blocs. Cependant, le script peut recevoir soit une cha\u00eene JSON, soit un objet JSON imbriqu\u00e9 dans un autre objet. Par cons\u00e9quent, une \u00e9tape de normalisation suppl\u00e9mentaire est n\u00e9cessaire avant d\u2019extraire les donn\u00e9es pour la g\u00e9n\u00e9ration des blocs :<\/p>\n<pre><code class=\"language-javascript\">const normalizedSections = normalizeSectionsPayload( response.sections );<\/code><\/pre>\n<ul>\n<li>La fonction <code>normalizeSectionsPayload()<\/code> normalise les charges utiles incertaines de <code>sections<\/code>\u00a0en un tableau. (Voir le <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L171\" target=\"_blank\" rel=\"noopener noreferrer\">code sur GitHub<\/a>.)<\/li>\n<\/ul>\n<p>Ensuite, la variable <code>normalizedSections<\/code>\u00a0est transmise en tant qu\u2019argument \u00e0 la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">fonction qui convertit<\/a> les champs <code>sections<\/code> en blocs Gutenberg natifs :<\/p>\n<pre><code class=\"language-javascript\">const structuredBlocks = buildBlocksFromSections( normalizedSections );<\/code><\/pre>\n<p>Voici un extrait de la fonction <code>buildBlocksFromSections()<\/code> :<\/p>\n<pre><code class=\"language-javascript\">function buildBlocksFromSections( sections ) {\n\tif ( ! Array.isArray( sections ) ) {\n\t\treturn [];\n\t}\n\n\tconst blocks = [];\n\n\tsections.forEach( function ( section ) {\n\t\tif ( ! section || 'object' !== typeof section ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst heading =\n\t\t\t\t( 'string' === typeof section.heading )\n\t\t\t\t\t? section.heading.trim()\n\t\t\t\t\t: '';\n\n\t\t\tconst level = ( 3 === section.level ) ? 3 : 2;\n\n\t\t\tif ( heading ) {\n\t\t\t\tblocks.push(\n\t\t\t\t\tcreateBlock( 'core\/heading', {\n\t\t\t\t\t\tcontent: heading,\n\t\t\t\t\t\tlevel: level,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t...\n\n\t\t} );\n\treturn blocks;\n}<\/code><\/pre>\n<p>Dans le code ci-dessus, la boucle <code>forEach()<\/code> parcourt le tableau de donn\u00e9es, en extrayant les champs <code>section.heading<\/code> et <code>section.level<\/code> qui seront utilis\u00e9s par la fonction native <code>createBlock()<\/code>.<\/p>\n<p>Pour conna\u00eetre le mappage des champs <code>section.paragraphs<\/code> et <code>section.bullet_points<\/code>, veuillez vous reporter au <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">code source sur GitHub<\/a>.<\/p>\n<h2>Des possibilit\u00e9s d\u2019extension infinies<\/h2>\n<p>L\u2019introduction de l\u2019IA dans WordPress ouvre de tout nouveaux horizons tant pour les administrateurs de sites que pour les d\u00e9veloppeurs. Alors qu\u2019auparavant, vous deviez construire une infrastructure r\u00e9seau compl\u00e8te \u00e0 partir de z\u00e9ro simplement pour int\u00e9grer des fonctionnalit\u00e9s d\u2019IA \u00e0 votre site WordPress, l\u2019automatisation de votre flux de travail \u00e9ditorial et l\u2019ajout de fonctionnalit\u00e9s bas\u00e9es sur l\u2019IA sont d\u00e9sormais remarquablement simples.<\/p>\n<p>L&rsquo;extension pr\u00e9sent\u00e9e en exemple dans la deuxi\u00e8me partie de cet article n\u2019illustre qu\u2019un seul cas d\u2019utilisation. Cependant, elle d\u00e9montre clairement comment vous pouvez d\u00e9sormais cr\u00e9er des outils qui simplifient consid\u00e9rablement la gestion du site et l\u2019\u00e9dition de contenu. De plus, cette architecture d\u00e9bloque des fonctionnalit\u00e9s avanc\u00e9es qui \u00e9taient auparavant soit trop complexes \u00e0 mettre en \u0153uvre, soit trop co\u00fbteuses.<\/p>\n<p>Et pourtant, nous n\u2019en sommes qu\u2019au d\u00e9but. L\u2019intelligence artificielle est une r\u00e9alit\u00e9 en pleine \u00e9volution qui va sans aucun doute d\u00e9clencher une vague massive d\u2019innovation.<\/p>\n<p>En parlant d\u2019innovation\u2026 Avez-vous d\u00e9j\u00e0 essay\u00e9 l\u2019h\u00e9bergement Kinsta ? Si vous souhaitez doter votre site web de la meilleure technologie disponible aujourd\u2019hui pour WordPress, <a href=\"https:\/\/kinsta.com\/fr\/tarifs\/\">essayez Kinsta sans risque<\/a> ou <a href=\"https:\/\/kinsta.com\/fr\/contacter-le-service-commercial\/\">contactez notre \u00e9quipe commerciale<\/a> pour en savoir plus.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avant WordPress 7.0, les extensions ajoutant des fonctionnalit\u00e9s d\u2019IA devaient demander et g\u00e9rer une cl\u00e9 API pour communiquer avec un fournisseur d\u2019IA. Cela pr\u00e9sentait plusieurs inconv\u00e9nients &#8230;<\/p>\n","protected":false},"author":36,"featured_media":84004,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1028],"class_list":["post-84003","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-developpement-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Int\u00e9gration de l&#039;IA dans WordPress\u00a0: architecture et exemple concret<\/title>\n<meta name=\"description\" content=\"Explorez la nouvelle infrastructure d&#039;IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d&#039;utilisation concret de conversion audio-texte.\" \/>\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\/ia-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Int\u00e9gration de l&#039;IA dans WordPress : analyse approfondie de l&#039;architecture et \u00e9tude de cas concret\" \/>\n<meta property=\"og:description\" content=\"Explorez la nouvelle infrastructure d&#039;IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d&#039;utilisation concret de conversion audio-texte.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\" \/>\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=\"2026-07-22T12:50:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-27T13:11:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Explorez la nouvelle infrastructure d&#039;IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d&#039;utilisation concret de conversion audio-texte.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"33 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Int\u00e9gration de l&rsquo;IA dans WordPress : analyse approfondie de l&rsquo;architecture et \u00e9tude de cas concret\",\"datePublished\":\"2026-07-22T12:50:33+00:00\",\"dateModified\":\"2026-07-27T13:11:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\"},\"wordCount\":5314,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\",\"name\":\"Int\u00e9gration de l'IA dans WordPress\u00a0: architecture et exemple concret\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"datePublished\":\"2026-07-22T12:50:33+00:00\",\"dateModified\":\"2026-07-27T13:11:48+00:00\",\"description\":\"Explorez la nouvelle infrastructure d'IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d'utilisation concret de conversion audio-texte.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"D\u00e9veloppement WordPress\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/developpement-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Int\u00e9gration de l&#8217;IA dans WordPress : analyse approfondie de l&#8217;architecture et \u00e9tude de cas concret\"}]},{\"@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\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/fr\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Int\u00e9gration de l'IA dans WordPress\u00a0: architecture et exemple concret","description":"Explorez la nouvelle infrastructure d'IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d'utilisation concret de conversion audio-texte.","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\/ia-wordpress\/","og_locale":"fr_FR","og_type":"article","og_title":"Int\u00e9gration de l'IA dans WordPress : analyse approfondie de l'architecture et \u00e9tude de cas concret","og_description":"Explorez la nouvelle infrastructure d'IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d'utilisation concret de conversion audio-texte.","og_url":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2026-07-22T12:50:33+00:00","article_modified_time":"2026-07-27T13:11:48+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Explorez la nouvelle infrastructure d'IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d'utilisation concret de conversion audio-texte.","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Carlo Daniele","Dur\u00e9e de lecture estim\u00e9e":"33 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Int\u00e9gration de l&rsquo;IA dans WordPress : analyse approfondie de l&rsquo;architecture et \u00e9tude de cas concret","datePublished":"2026-07-22T12:50:33+00:00","dateModified":"2026-07-27T13:11:48+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/"},"wordCount":5314,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/","url":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/","name":"Int\u00e9gration de l'IA dans WordPress\u00a0: architecture et exemple concret","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","datePublished":"2026-07-22T12:50:33+00:00","dateModified":"2026-07-27T13:11:48+00:00","description":"Explorez la nouvelle infrastructure d'IA de WordPress. D\u00e9couvrez son architecture native, ses flux de travail internes et un cas d'utilisation concret de conversion audio-texte.","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"D\u00e9veloppement WordPress","item":"https:\/\/kinsta.com\/fr\/sujets\/developpement-wordpress\/"},{"@type":"ListItem","position":3,"name":"Int\u00e9gration de l&#8217;IA dans WordPress : analyse approfondie de l&#8217;architecture et \u00e9tude de cas concret"}]},{"@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\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/fr\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/84003","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\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=84003"}],"version-history":[{"count":9,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/84003\/revisions"}],"predecessor-version":[{"id":84074,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/84003\/revisions\/84074"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84003\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84003\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84003\/translations\/fr"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84003\/translations\/jp"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84003\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/84004"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=84003"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=84003"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=84003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}