{"id":84103,"date":"2026-08-03T08:00:09","date_gmt":"2026-08-03T07:00:09","guid":{"rendered":"https:\/\/kinsta.com\/fr\/?p=84103&#038;preview=true&#038;preview_id=84103"},"modified":"2026-08-03T09:07:42","modified_gmt":"2026-08-03T08:07:42","slug":"guide-pratique-api-wordpress-abilities","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/","title":{"rendered":"Premiers pas avec l&rsquo;API Abilities de WordPress : un guide pratique"},"content":{"rendered":"<p>L&rsquo;API Abilities, introduite dans <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-6-9\/#abilities-api\">WordPress 6.9<\/a>, \u00e9tablit un langage commun permettant \u00e0 tous les composants de WordPress \u2014 tant le c\u0153ur du logiciel que les extensions \u2014 d&rsquo;exposer leurs fonctionnalit\u00e9s de mani\u00e8re unifi\u00e9e et compr\u00e9hensible, tant pour les humains que pour les machines. Votre site WordPress est ainsi pr\u00eat \u00e0 s&rsquo;int\u00e9grer \u00e0 des outils d&rsquo;automatisation externes de mani\u00e8re standardis\u00e9e et s\u00e9curis\u00e9e.<\/p>\n<p>Si vous vous demandez \u00e0 quoi pourraient ressembler certains cas d\u2019utilisation de l\u2019API Abilities, imaginez un mod\u00e8le d\u2019IA qui guide un utilisateur tout au long du processus d\u2019achat et lui permet m\u00eame de finaliser son achat sans se rendre sur votre site de commerce \u00e9lectronique. Ou imaginez un <a href=\"https:\/\/kinsta.com\/fr\/blog\/configurer-pipeline-ci-cd\/\">pipeline CI\/CD sur GitHub Actions<\/a> qui traite du texte extrait d\u2019un fichier audio ou vid\u00e9o et l\u2019envoie \u00e0 WordPress pour publication. Les cas d\u2019utilisation sont infinis.<\/p>\n<p>L\u2019API Abilities modifie le r\u00f4le m\u00eame de WordPress au sein de l\u2019\u00e9cosyst\u00e8me. Ce n\u2019est plus seulement un blog, ni m\u00eame un CMS ; aujourd\u2019hui, WordPress agit comme un moteur d\u2019ex\u00e9cution distribu\u00e9 pouvant \u00eatre orchestr\u00e9 de l\u2019ext\u00e9rieur, \u00e0 la mani\u00e8re d\u2019une sorte de syst\u00e8me d\u2019exploitation, enti\u00e8rement pr\u00eat pour les agents autonomes.<\/p>\n<p>Vous souhaitez en savoir plus ? 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>\u00c0 quoi sert une \u00ab ability \u00bb ?<\/h2>\n<p>Une \u00ab ability \u00bb est une fonctionnalit\u00e9 d\u00e9tectable et exploitable sur un site WordPress qui permet \u00e0 des entit\u00e9s externes (telles que des mod\u00e8les d\u2019IA) ou \u00e0 des composants internes d\u2019effectuer des op\u00e9rations sp\u00e9cifiques.<\/p>\n<p>L\u2019API peut notamment \u00eatre utilis\u00e9e pour :<\/p>\n<ul>\n<li>Rechercher du contenu ou effectuer des op\u00e9rations sp\u00e9cifiques sur la base de donn\u00e9es<\/li>\n<li>La lecture des r\u00e9glages de configuration du site<\/li>\n<li>Cr\u00e9er un article<\/li>\n<li>Convertir une structure JSON en blocs Gutenberg<\/li>\n<\/ul>\n<p>Exposer une capacit\u00e9 revient \u00e0 rendre une fonctionnalit\u00e9 sp\u00e9cifique interop\u00e9rable. Avant qu\u2019une capacit\u00e9 puisse \u00eatre d\u00e9couverte et utilis\u00e9e, elle doit \u00eatre enregistr\u00e9e dans un catalogue centralis\u00e9. Ce n\u2019est qu\u2019alors que WordPress et les mod\u00e8les d\u2019IA pourront la d\u00e9couvrir, en comprendre l\u2019intention et l\u2019invoquer en cas de besoin.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Une pr\u00e9cision s\u2019impose : un mod\u00e8le d\u2019IA n\u2019a jamais directement acc\u00e8s \u00e0 votre site. Il peut uniquement demander \u00e0 WordPress d\u2019ex\u00e9cuter une op\u00e9ration (par exemple, \u00ab donnez-moi le nombre total d\u2019articles sur le site \u00bb) n\u00e9cessaire \u00e0 l\u2019accomplissement de sa t\u00e2che.<\/p>\n<\/aside>\n\n<p>Par d\u00e9faut, les fonctionnalit\u00e9s de vos extensions sont totalement isol\u00e9es. En enregistrant une capacit\u00e9, vous d\u00e9clarez que la logique sous-jacente est disponible en tant que service pour l\u2019ensemble de l\u2019\u00e9cosyst\u00e8me.<\/p>\n<p>Prenons un exemple. Si votre extension dispose d\u2019une fonction qui convertit un objet JSON initial en contenu structur\u00e9 pr\u00eat \u00e0 \u00eatre utilis\u00e9 dans des blocs Gutenberg, vous pouvez l\u2019enregistrer en tant que capacit\u00e9. Cela permet \u00e0 d\u2019autres outils disposant des autorisations requises de d\u00e9clencher exactement la m\u00eame fonction.<\/p>\n<p>Dans notre pr\u00e9c\u00e9dent <a href=\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\">tutoriel sur le WordPress AI Client<\/a>, l&rsquo;extension g\u00e9rait la logique principale consistant \u00e0 envoyer un fichier audio au mod\u00e8le d\u2019IA, qui renvoyait une r\u00e9ponse structur\u00e9e au format JSON permettant de g\u00e9n\u00e9rer des blocs Gutenberg. Cependant, cette fonctionnalit\u00e9 restait limit\u00e9e \u00e0 notre extension. En enregistrant ce processus en tant que \u00ab capacit\u00e9 \u00bb, vous d\u00e9coupliez son ex\u00e9cution, et n\u2019importe quelle entit\u00e9 externe peut d\u00e9clencher l\u2019int\u00e9gralit\u00e9 de la logique de l&rsquo;extension en transmettant simplement un objet JSON contenant l\u2019identifiant d\u2019un fichier audio.<\/p>\n<p><strong>Une \u00ab capacit\u00e9 \u00bb fait office de contrat formel<\/strong> entre la logique PHP sous-jacente et toute entit\u00e9 qui demande son ex\u00e9cution. Ce contrat pr\u00e9cise les donn\u00e9es que la capacit\u00e9 attend en entr\u00e9e, son objectif et le sch\u00e9ma de donn\u00e9es qu\u2019elle renvoie en sortie.<\/p>\n<p>Lorsque vous enregistrez une capacit\u00e9, celle-ci est ajout\u00e9e au <a href=\"https:\/\/make.wordpress.org\/ai\/2025\/07\/17\/abilities-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">registre des capacit\u00e9s<\/a> de votre site. \u00c0 partir de ce moment, <strong>WordPress agit comme une passerelle s\u00e9curis\u00e9e <\/strong>: il v\u00e9rifie l\u2019authentification et valide les donn\u00e9es entrantes par rapport au sch\u00e9ma \u00e9tabli par le contrat. WordPress ne transmet la requ\u00eate \u00e0 la fonction PHP sous-jacente que si la charge utile respecte strictement les termes du contrat.<\/p>\n<p><strong>Une capacit\u00e9 est agnostique.<\/strong> WordPress n\u2019a pas besoin de conna\u00eetre l\u2019entit\u00e9 sp\u00e9cifique qui demande l\u2019acc\u00e8s ; il v\u00e9rifie uniquement que la requ\u00eate est autoris\u00e9e et qu\u2019elle respecte les contraintes du contrat.<\/p>\n<p>En enregistrant une capacit\u00e9, votre extension n\u2019est plus seulement une extension dot\u00e9e de sa propre logique interne ; elle devient un prestataire de services pour l\u2019ensemble de l\u2019\u00e9cosyst\u00e8me. Qu\u2019il s\u2019agisse d\u2019une application mobile, d\u2019un script d\u2019automatisation tel que Make.com ou <a href=\"https:\/\/kinsta.com\/fr\/blog\/woocommerce-zapier\/\">Zapier<\/a>, d\u2019un agent d\u2019IA ou d\u2019un serveur communiquant via le <a href=\"https:\/\/kinsta.com\/fr\/blog\/serveur-mcp-api-kinsta\/\">protocole MCP<\/a>, ces entit\u00e9s sauront exactement comment d\u00e9clencher des op\u00e9rations structur\u00e9es sur votre site.<\/p>\n<h2>Utilisation de l\u2019API \u00ab Abilities \u00bb<\/h2>\n<p>L\u2019API \u00ab Abilities \u00bb fournit un <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/php-api.md\" target=\"_blank\" rel=\"noopener noreferrer\">ensemble complet de fonctions<\/a> qui vous permettent de d\u00e9couvrir les capacit\u00e9s enregistr\u00e9es sur votre site, de les activer, ainsi que de les enregistrer et de les d\u00e9senregistrer.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>G\u00e9rer les capacit\u00e9s de votre site<\/h3>\n<p>Vous pouvez r\u00e9cup\u00e9rer la liste de toutes les capacit\u00e9s enregistr\u00e9es ou extraire un objet de capacit\u00e9 individuel. Vous pouvez \u00e9galement v\u00e9rifier certaines conditions, par exemple si une capacit\u00e9 sp\u00e9cifique est enregistr\u00e9e ou si l\u2019agent dispose des autorisations n\u00e9cessaires pour la d\u00e9clencher.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h4\" count-number=\"4\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h4>Obtenir la liste des capacit\u00e9s enregistr\u00e9es sur votre site<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_abilities\/\" target=\"_blank\" rel=\"noopener noreferrer\">La fonction <code>wp_get_abilities()<\/code><\/a> renvoie un tableau contenant toutes les capacit\u00e9s enregistr\u00e9es. Vous pouvez la tester \u00e0 l\u2019aide de <a href=\"https:\/\/kinsta.com\/fr\/blog\/wp-cli\/\">WP-CLI<\/a>. Une fois <a href=\"https:\/\/kinsta.com\/fr\/blog\/developpement-wordpress-distance-ssh-kinsta\/\">connect\u00e9 \u00e0 votre site via SSH<\/a>, acc\u00e9dez au r\u00e9pertoire racine du site, o\u00f9 se trouve votre <a href=\"https:\/\/kinsta.com\/fr\/blog\/wp-config-php\/\">fichier <code>wp-config.php<\/code><\/a>, \u00e0 l\u2019aide des commandes suivantes :<\/p>\n<pre><code class=\"language-bash\">cd \/path\/to\/your\/site\nls wp-config.php<\/code><\/pre>\n<p>Assurez-vous ensuite que WP-CLI reconna\u00eet l\u2019installation de votre site :<\/p>\n<pre><code class=\"language-bash\">wp core is-installed\nwp option get siteurl<\/code><\/pre>\n<p>Si l\u2019URL de votre site s\u2019affiche, vous \u00eates pr\u00eat \u00e0 ex\u00e9cuter la commande suivante :<\/p>\n<pre><code class=\"language-bash\">wp eval '$abilities = wp_get_abilities(); foreach ( $abilities as $a ) { echo $a-&gt;get_name() . PHP_EOL; }'<\/code><\/pre>\n<p>Cette commande ex\u00e9cute du <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/eval\/\" target=\"_blank\" rel=\"noopener noreferrer\">code PHP dans votre terminal<\/a>. Le code PHP demande les noms de toutes les fonctionnalit\u00e9s enregistr\u00e9es sur votre site et, par d\u00e9faut, devrait fournir la r\u00e9ponse suivante :<\/p>\n<pre><code class=\"language-bash\">core\/get-site-info\ncore\/get-user-info\ncore\/get-environment-info<\/code><\/pre>\n<p>Vous pouvez demander un ensemble de donn\u00e9es plus complet \u00e0 l\u2019aide de la commande suivante :<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$all_abilities = wp_get_abilities();\n\nforeach ( $all_abilities as $ability ) {\n\techo \"Ability Name: \" . esc_html( $ability-&gt;get_name() ) . \"n\";\n\techo \"Label: \" . esc_html( $ability-&gt;get_label() ) . \"n\";\n\techo \"Category: \" . esc_html( $ability-&gt;get_category() ) . \"n\";\n\techo \"Description: \" . esc_html( $ability-&gt;get_description() ) . \"n\";\n\techo \"---n\";\n}\n'<\/code><\/pre>\n<p>Lorsque vous ex\u00e9cutez cette commande sur un site <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a> vierge, le terminal affiche la r\u00e9ponse suivante :<\/p>\n<pre><code>Ability Name: core\/get-site-info\nLabel: Get Site Information\nCategory: site\nDescription: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.\n---\nAbility Name: core\/get-user-info\nLabel: Get User Information\nCategory: user\nDescription: Returns profile details for the current authenticated user to support personalization, auditing, and access-aware behavior. By default returns all fields, or optionally a filtered subset.\n---\nAbility Name: core\/get-environment-info\nLabel: Get Environment Info\nCategory: site\nDescription: Returns core details about the site's runtime context for diagnostics and compatibility (environment, PHP runtime, database server info, WordPress version). By default returns all fields, or optionally a filtered subset.\n---<\/code><\/pre>\n<h4>R\u00e9cup\u00e9rer un objet \u00ab ability \u00bb<\/h4>\n<p>La <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>wp_get_ability()<\/code><\/a> renvoie un objet \u00ab ability \u00bb unique en fonction de son nom. Vous pouvez la tester dans WP-CLI \u00e0 l\u2019aide de la commande suivante :<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit( 1 );\n}\n\necho \"Name: \" . $ability-&gt;get_name() . \"\\n\";\necho \"Label: \" . $ability-&gt;get_label() . \"\\n\";\necho \"Category: \" . $ability-&gt;get_category() . \"\\n\";\necho \"Description: \" . $ability-&gt;get_description() . \"\\n\";\necho \"nInput Schema:\\n\";\nvar_dump( $ability-&gt;get_input_schema() );\necho \"nOutput Schema:\\n\";\nvar_dump( $ability-&gt;get_output_schema() );\necho \"nMeta:\\n\";\nvar_dump( $ability-&gt;get_meta() );\n'<\/code><\/pre>\n<p>Si la capacit\u00e9 est correctement enregistr\u00e9e sur votre site, vous obtiendrez la r\u00e9ponse suivante dans votre terminal :<\/p>\n<pre><code>Name: core\/get-site-info\nLabel: Get Site Information\nCategory: site\nDescription: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.\n\nInput Schema:\narray(4) {\n  [\"type\"]=&gt;\n  string(6) \"object\"\n  [\"properties\"]=&gt;\n  array(1) {\n\t[\"fields\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(5) \"array\"\n\t  [\"items\"]=&gt;\n\t  array(2) {\n\t\t[\"type\"]=&gt;\n\t\tstring(6) \"string\"\n\t\t[\"enum\"]=&gt;\n\t\tarray(8) {\n\t\t  [0]=&gt;\n\t\t  string(4) \"name\"\n\t\t  [1]=&gt;\n\t\t  string(11) \"description\"\n\t\t  [2]=&gt;\n\t\t  string(3) \"url\"\n\t\t  [3]=&gt;\n\t\t  string(5) \"wpurl\"\n\t\t  [4]=&gt;\n\t\t  string(11) \"admin_email\"\n\t\t  [5]=&gt;\n\t\t  string(7) \"charset\"\n\t\t  [6]=&gt;\n\t\t  string(8) \"language\"\n\t\t  [7]=&gt;\n\t\t  string(7) \"version\"\n\t\t}\n\t  }\n\t  [\"description\"]=&gt;\n\t  string(81) \"Optional: Limit response to specific fields. If omitted, all fields are returned.\"\n\t}\n  }\n  [\"additionalProperties\"]=&gt;\n  bool(false)\n  [\"default\"]=&gt;\n  array(0) {\n  }\n}\n\nOutput Schema:\narray(3) {\n  [\"type\"]=&gt;\n  string(6) \"object\"\n  [\"properties\"]=&gt;\n  array(8) {\n\t[\"name\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(10) \"Site Title\"\n\t  [\"description\"]=&gt;\n\t  string(15) \"The site title.\"\n\t}\n\t[\"description\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(7) \"Tagline\"\n\t  [\"description\"]=&gt;\n\t  string(17) \"The site tagline.\"\n\t}\n\t[\"url\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(18) \"Site Address (URL)\"\n\t  [\"description\"]=&gt;\n\t  string(94) \"The public URL where visitors access the site. May differ from the WordPress installation URL.\"\n\t}\n\t[\"wpurl\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(23) \"WordPress Address (URL)\"\n\t  [\"description\"]=&gt;\n\t  string(83) \"The URL where WordPress core files are served. May differ from the public site URL.\"\n\t}\n\t[\"admin_email\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(28) \"Administration Email Address\"\n\t  [\"description\"]=&gt;\n\t  string(37) \"The site administrator email address.\"\n\t}\n\t[\"charset\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(12) \"Site Charset\"\n\t  [\"description\"]=&gt;\n\t  string(28) \"The site character encoding.\"\n\t}\n\t[\"language\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(13) \"Site Language\"\n\t  [\"description\"]=&gt;\n\t  string(42) \"The site locale in dash form (e.g. en-US).\"\n\t}\n\t[\"version\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(17) \"WordPress Version\"\n\t  [\"description\"]=&gt;\n\t  string(48) \"The WordPress core version running on this site.\"\n\t}\n  }\n  [\"additionalProperties\"]=&gt;\n  bool(false)\n}\n\nMeta:\narray(2) {\n  [\"annotations\"]=&gt;\n  array(3) {\n\t[\"readonly\"]=&gt;\n\tbool(true)\n\t[\"destructive\"]=&gt;\n\tbool(false)\n\t[\"idempotent\"]=&gt;\n\tbool(true)\n  }\n  [\"show_in_rest\"]=&gt;\n  bool(true)\n}<\/code><\/pre>\n<h4>V\u00e9rifier si une capacit\u00e9 est enregistr\u00e9e<\/h4>\n<p>La <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_has_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>wp_has_ability()<\/code><\/a> vous permet de v\u00e9rifier si une capacit\u00e9 est enregistr\u00e9e. Dans WP-CLI, vous pouvez l&rsquo;utiliser comme ceci :<\/p>\n<pre><code class=\"language-bash\">wp eval '\nif ( wp_has_ability( \"core\/get-site-info\" ) ) {\n\techo \"\u2713 core\/get-site-info is registered\\n\";\n} else {\n\techo \"\u2717 core\/get-site-info not found\\n\";\n}\n'<\/code><\/pre>\n<p>Si la fonctionnalit\u00e9 a \u00e9t\u00e9 enregistr\u00e9e, le message suivant s&rsquo;affichera dans le terminal :<\/p>\n<pre><code class=\"language-bash\">\u2713 core\/get-site-info is registered<\/code><\/pre>\n<h4>V\u00e9rifier les autorisations de l&rsquo;agent<\/h4>\n<p>Vous pouvez v\u00e9rifier si l\u2019utilisateur actuel dispose des autorisations n\u00e9cessaires pour ex\u00e9cuter une capacit\u00e9 en utilisant la <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ability\/check_permissions\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9thode <code>check_permissions()<\/code><\/a> de l\u2019objet <code>$ability<\/code>. Celle-ci renvoie \u00ab true \u00bb, \u00ab false \u00bb ou un objet <code>WP_Error<\/code>. Essayons d\u2019appeler cette m\u00e9thode depuis le terminal \u00e0 l\u2019aide de la commande WP-CLI suivante :<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\nif ( $ability ) {\n\t$has_permissions = $ability-&gt;check_permissions();\n\tif ( true === $has_permissions ) {\n\t\techo \"You have permissions to execute this ability.\";\n\t} else {\n\t\tif ( is_wp_error( $has_permissions ) ) {\n\t\t\terror_log( \"Permissions check failed: \" . $has_permissions-&gt;get_error_message() );\n\t\t}\n\t\techo \"You do not have permissions to execute this ability.\";\n\t}\n} else {\n\techo \"Ability not found.\";\n}\n'<\/code><\/pre>\n<p>Ici, nous avons d\u00e9fini <code>--user=1<\/code>, c&rsquo;est pourquoi vous obtiendrez la r\u00e9ponse suivante :<\/p>\n<pre><code class=\"language-bash\">You have permissions to execute this ability.<\/code><\/pre>\n<h3>Enregistrer une capacit\u00e9<\/h3>\n<p>Il est d\u00e9sormais temps d\u2019enregistrer une capacit\u00e9. Pour illustrer un cas d\u2019utilisation concret, nous allons \u00e9tendre le plugin d\u00e9crit dans <a href=\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\">notre article sur le WordPress AI Client<\/a>. Ce plugin envoie un fichier audio au mod\u00e8le d\u2019IA afin d\u2019en extraire le texte et de d\u00e9clencher la g\u00e9n\u00e9ration de blocs Gutenberg. Dans cette section, nous verrons comment enregistrer ce processus en tant que capacit\u00e9 afin que toute entit\u00e9 disposant des autorisations n\u00e9cessaires puisse le d\u00e9couvrir et l\u2019utiliser.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Pour les exemples ci-dessous, nous n\u2019affichons que le code essentiel. Pour tester par vous-m\u00eame le code fourni dans cette section, nous vous recommandons de t\u00e9l\u00e9charger l&rsquo;extension <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder Next<\/a> depuis GitHub et de l\u2019installer manuellement sur un site WordPress local ou de staging.<\/p>\n<\/aside>\n\n<p>Avant d\u2019enregistrer une nouvelle capacit\u00e9, vous devez enregistrer une nouvelle cat\u00e9gorie de capacit\u00e9.<\/p>\n<p>Pour cela, vous devrez accrocher la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability_category\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>wp_register_ability_category()<\/code><\/a> au hook <code>wp_abilities_api_categories_init<\/code>.<\/p>\n<p>Cette fonction accepte un slug de cat\u00e9gorie unique et un tableau associatif d\u2019arguments.<\/p>\n<p>Voici comment enregistrer votre cat\u00e9gorie de capacit\u00e9 :<\/p>\n<pre><code class=\"language-php\">function aicb_register_ability_category(): void {\n\n\tif ( ! function_exists( 'wp_register_ability_category' ) ) {\n\t\treturn;\n\t}\n\n\twp_register_ability_category(\n\t\t'content-generation',\n\t\tarray(\n\t\t\t'label'       =&gt; 'Content Generation',\n\t\t\t'description' =&gt; 'AI-powered content transformation and structuring abilities',\n\t\t)\n\t);\n}\nadd_action( 'wp_abilities_api_categories_init', 'aicb_register_ability_category' );<\/code><\/pre>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 enregistrer la fonctionnalit\u00e9. Pour ce faire, vous devrez associer la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>wp_register_ability()<\/code><\/a> \u00e0 l&rsquo;action <code>wp_abilities_api_init<\/code>.<\/p>\n<p>Cette fonction accepte deux arguments : le nom de la fonctionnalit\u00e9, y compris son espace de noms, et un tableau d&rsquo;arguments pour la configuration de la fonctionnalit\u00e9.<\/p>\n<p>Voici l&rsquo;enregistrement de la fonctionnalit\u00e9 pour l&rsquo;extension <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder<\/a> :<\/p>\n<pre><code class=\"language-php\">function aicb_register_audio_to_gutenberg_blocks_ability(): void {\n\n\tif ( ! function_exists( 'wp_register_ability' ) ) {\n\t\treturn;\n\t}\n\n\t$input_schema = array( ... );\n\n\t$output_schema = array( ... );\n\n\twp_register_ability(\n\t\t'ai-content-builder\/audio-to-gutenberg-blocks',\n\t\tarray(\n\t\t\t'category'            =&gt; 'content-generation',\n\t\t\t'label'               =&gt; 'Audio to Gutenberg Blocks',\n\t\t\t'description'         =&gt; 'Transcribes audio and converts the content into WordPress Gutenberg-compatible block objects.',\n\t\t\t'input_schema'        =&gt; $input_schema,\n\t\t\t'output_schema'       =&gt; $output_schema,\n\t\t\t'execute_callback'    =&gt; 'aicb_audio_to_gutenberg_blocks_callback',\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'meta'                =&gt; array(\n\t\t\t\t'show_in_rest' =&gt; true,\n\t\t\t\t'annotations'  =&gt; array(\n\t\t\t\t\t'readonly'     =&gt; false,\n\t\t\t\t\t'destructive'  =&gt; false,\n\t\t\t\t\t'idempotent'   =&gt; false,\n\t\t\t\t\t'instructions' =&gt; 'Processes an audio attachment: transcribes it, generates structured blog content via AI, and returns Gutenberg-ready block objects.',\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}\nadd_action( 'wp_abilities_api_init', 'aicb_register_audio_to_gutenberg_blocks_ability' );<\/code><\/pre>\n<p>Dans l\u2019appel de la fonction <code>wp_register_ability<\/code>, nous avons configur\u00e9 les arguments suivants :<\/p>\n<ul>\n<li><code>category<\/code> : La cat\u00e9gorie \u00e0 laquelle appartient la fonctionnalit\u00e9.<\/li>\n<li><code>label<\/code> : Le nom d\u2019affichage de la fonctionnalit\u00e9.<\/li>\n<li><code>description<\/code> : Une br\u00e8ve description du fonctionnement de la fonctionnalit\u00e9 et de son objectif.<\/li>\n<li><code>input_schema<\/code> : Le sch\u00e9ma de donn\u00e9es pour les arguments d\u2019entr\u00e9e.<\/li>\n<li><code>output_schema<\/code> : Le sch\u00e9ma de donn\u00e9es fourni et renvoy\u00e9 par la fonctionnalit\u00e9.<\/li>\n<li><code>execute_callback<\/code> : La fonction de rappel \u00e0 ex\u00e9cuter lorsque la capacit\u00e9 est d\u00e9clench\u00e9e.<\/li>\n<li><code>permission_callback<\/code> : Une fonction de rappel ex\u00e9cut\u00e9e pour v\u00e9rifier que l\u2019agent dispose des autorisations requises pour ex\u00e9cuter la fonctionnalit\u00e9.<\/li>\n<li><code>meta<\/code> : Un tableau de champs de m\u00e9tadonn\u00e9es suppl\u00e9mentaires pour la fonctionnalit\u00e9.<\/li>\n<li><code>show_in_rest<\/code> : D\u00e9termine s\u2019il convient ou non d\u2019exposer la fonctionnalit\u00e9 au sein de l\u2019API REST de WordPress.<\/li>\n<li><code>annotations<\/code> : Un tableau d\u2019\u00e9l\u00e9ments descriptifs d\u00e9finissant le comportement de la fonctionnalit\u00e9.<\/li>\n<\/ul>\n<p><code>input_schema<\/code> est un tableau qui d\u00e9finit le contrat d\u2019entr\u00e9e de la fonctionnalit\u00e9. Il repr\u00e9sente la d\u00e9finition du sch\u00e9ma JSON permettant de valider les donn\u00e9es d\u2019entr\u00e9e de la fonctionnalit\u00e9. Dans notre cas d\u2019utilisation sp\u00e9cifique, il est d\u00e9fini comme ceci :<\/p>\n<pre><code class=\"language-php\">$input_schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'audio_id' =&gt; array(\n\t\t\t'type'        =&gt; 'integer',\n\t\t\t'description' =&gt; 'The ID of the audio attachment to process and convert into Gutenberg blocks.',\n\t\t),\n\t),\n\t'required'   =&gt; array( 'audio_id' ),\n);<\/code><\/pre>\n<p>Ce sch\u00e9ma JSON repr\u00e9sente le format que les donn\u00e9es d\u2019entr\u00e9e doivent respecter pour utiliser cette fonctionnalit\u00e9.<\/p>\n<p><code>output_schema<\/code> correspond au contrat de sortie renvoy\u00e9 par la fonctionnalit\u00e9. Dans notre exemple, chaque \u00e9l\u00e9ment est un objet repr\u00e9sentant un bloc JSON :<\/p>\n<pre><code class=\"language-php\">$output_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( 'type' =&gt; 'object' ),\n\t\t),\n\t\t'blocks'     =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array( 'type' =&gt; 'object' ),\n\t\t),\n\t\t'transcript' =&gt; array( 'type' =&gt; 'string' ),\n\t),\n\t'required'   =&gt; array( 'blocks' ),\n);<\/code><\/pre>\n<p>L\u2019\u00e9tape suivante consiste \u00e0 d\u00e9finir la fonction de rappel qui s\u2019ex\u00e9cute lorsque la capacit\u00e9 est d\u00e9clench\u00e9e (voir le <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php#L483\" target=\"_blank\" rel=\"noopener noreferrer\">code complet sur GitHub<\/a>) :<\/p>\n<pre><code class=\"language-php\">function aicb_audio_to_gutenberg_blocks_callback( array $args ) {\n\n\t\/\/ missing code\n\t\/\/ see GitHub\n\t...\n\n\t$structured_json = wp_ai_client_prompt( $prompt )\n\t\t-&gt;using_system_instruction( $instructions )\n\t\t-&gt;using_temperature( 0.4 )\n\t\t-&gt;as_json_response( $schema )\n\t\t-&gt;generate_text();\n\n\tif ( is_wp_error( $structured_json ) ) {\n\t\treturn $structured_json;\n\t}\n\n\t$structured = json_decode( (string) $structured_json, true );\n\tif ( ! is_array( $structured ) ) {\n\t\treturn new WP_Error(\n\t\t\t'invalid_ai_json',\n\t\t\t'Could not parse structured AI response.',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\t\/\/ Normalize the output.\n\t$normalized = aicb_normalize_structured_post( $structured );\n\n\tif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\t\treturn new WP_Error(\n\t\t\t'empty_structured_content',\n\t\t\t'The AI provider returned empty structured content.',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\t\/\/ Convert to Gutenberg blocks.\n\t$blocks = aicb_sections_to_blocks( $normalized['title'], $normalized['sections'] );\n\n\treturn $blocks;\n}<\/code><\/pre>\n<p>Cette fonction appelle deux fonctions personnalis\u00e9es. La premi\u00e8re (<code>aicb_normalize_structured_post<\/code>) normalise la sortie de l\u2019IA dans un format pr\u00e9d\u00e9fini et nettoie les donn\u00e9es :<\/p>\n<pre><code class=\"language-php\">function aicb_normalize_structured_post( array $structured ): array {\n\t$title = isset( $structured['title'] )\n\t\t? sanitize_text_field( (string) $structured['title'] )\n\t\t: '';\n\n\t$sections = array();\n\n\tif ( isset( $structured['sections'] ) && is_array( $structured['sections'] ) ) {\n\t\tforeach ( $structured['sections'] as $section ) {\n\t\t\tif ( ! is_array( $section ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$heading = isset( $section['heading'] )\n\t\t\t\t? sanitize_text_field( (string) $section['heading'] )\n\t\t\t\t: '';\n\n\t\t\t$level = 2;\n\n\t\t\t$paragraphs = array();\n\t\t\tif ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {\n\t\t\t\tforeach ( $section['paragraphs'] as $paragraph ) {\n\t\t\t\t\t$clean_paragraph = trim( sanitize_textarea_field( (string) $paragraph ) );\n\t\t\t\t\tif ( '' !== $clean_paragraph ) {\n\t\t\t\t\t\t$paragraphs[] = $clean_paragraph;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$bullet_points = array();\n\t\t\tif ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {\n\t\t\t\tforeach ( $section['bullet_points'] as $bullet_point ) {\n\t\t\t\t\t$clean_bullet_point = trim( sanitize_text_field( (string) $bullet_point ) );\n\t\t\t\t\tif ( '' !== $clean_bullet_point ) {\n\t\t\t\t\t\t$bullet_points[] = $clean_bullet_point;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( '' === $heading || empty( $paragraphs ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$sections[] = array(\n\t\t\t\t'heading'       =&gt; $heading,\n\t\t\t\t'level'         =&gt; $level,\n\t\t\t\t'paragraphs'    =&gt; $paragraphs,\n\t\t\t\t'bullet_points' =&gt; $bullet_points,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn array(\n\t\t'title'    =&gt; $title,\n\t\t'sections' =&gt; $sections,\n\t);\n}<\/code><\/pre>\n<p>La fonction accepte un tableau structur\u00e9 d\u2019objets JSON, normalise et nettoie les donn\u00e9es, puis renvoie un tableau contenant le titre et les sections.<\/p>\n<p>La deuxi\u00e8me fonction (<code>aicb_sections_to_blocks<\/code>) convertit les donn\u00e9es normalis\u00e9es en objets descripteurs de blocs et est d\u00e9finie comme ceci :<\/p>\n<pre><code class=\"language-php\">function aicb_sections_to_blocks( string $title, array $sections ): array {\n\t$blocks = array();\n\n\tforeach ( $sections as $section ) {\n\t\tif ( ! is_array( $section ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$heading = isset( $section['heading'] ) ? trim( (string) $section['heading'] ) : '';\n\t\tif ( '' === $heading ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$paragraphs = array();\n\t\tif ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {\n\t\t\tforeach ( $section['paragraphs'] as $paragraph ) {\n\t\t\t\t$clean = trim( (string) $paragraph );\n\t\t\t\tif ( '' !== $clean ) {\n\t\t\t\t\t$paragraphs[] = $clean;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $paragraphs ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$blocks[] = array(\n\t\t\t'name'       =&gt; 'core\/heading',\n\t\t\t'attributes' =&gt; array(\n\t\t\t\t'content' =&gt; $heading,\n\t\t\t\t'level'   =&gt; 2,\n\t\t\t),\n\t\t);\n\n\t\tforeach ( $paragraphs as $paragraph ) {\n\t\t\t$blocks[] = array(\n\t\t\t\t'name'       =&gt; 'core\/paragraph',\n\t\t\t\t'attributes' =&gt; array(\n\t\t\t\t\t'content' =&gt; $paragraph,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {\n\t\t\t$bullet_items_html = '';\n\n\t\t\tforeach ( $section['bullet_points'] as $bullet_point ) {\n\t\t\t\t$clean_bullet = trim( sanitize_text_field( (string) $bullet_point ) );\n\t\t\t\tif ( '' === $clean_bullet ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t\/\/ core\/list expects HTML in the `values` attribute.\n\t\t\t\t$bullet_items_html .= '&lt;li&gt;' . esc_html( $clean_bullet ) . '&lt;\/li&gt;';\n\t\t\t}\n\n\t\t\tif ( '' !== $bullet_items_html ) {\n\t\t\t\t$blocks[] = array(\n\t\t\t\t\t'name'       =&gt; 'core\/list',\n\t\t\t\t\t'attributes' =&gt; array(\n\t\t\t\t\t\t'values' =&gt; '&lt;ul&gt;' . $bullet_items_html . '&lt;\/ul&gt;',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $blocks;\n}<\/code><\/pre>\n<p>Voici les principaux points forts de cette fonction :<\/p>\n<ul>\n<li>La fonction accepte deux arguments : une cha\u00eene de caract\u00e8res repr\u00e9sentant le titre de l\u2019article et un tableau contenant les sections g\u00e9n\u00e9r\u00e9es par le mod\u00e8le d\u2019IA.<\/li>\n<li>Pour chaque section, la fonction g\u00e9n\u00e8re un titre et au moins un paragraphe.<\/li>\n<li>Si des puces sont pr\u00e9sentes, elle g\u00e9n\u00e8re un nombre correspondant d\u2019\u00e9l\u00e9ments de liste.<\/li>\n<li>La fonction renvoie un tableau <code>$blocks<\/code> d\u2019objets descripteurs de blocs, qui correspond au contrat de sortie renvoy\u00e9 par la capacit\u00e9 (<code>$output_schema<\/code>).<\/li>\n<\/ul>\n<p>Notez que la sortie de la fonction n\u2019est pas le balisage brut des blocs. Celui-ci sera g\u00e9n\u00e9r\u00e9 c\u00f4t\u00e9 client \u00e0 l\u2019aide de la fonction JavaScript <code>createBlock<\/code>.<\/p>\n<p>Par exemple, l\u2019\u00e9l\u00e9ment de titre d\u2019une section est repr\u00e9sent\u00e9 par l\u2019objet suivant :<\/p>\n<pre><code class=\"language-php\">if ( '' !== $heading ) {\n\t$blocks[] = array(\n\t\t'name'       =&gt; 'core\/heading',\n\t\t'attributes' =&gt; array(\n\t\t\t'content' =&gt; $heading,\n\t\t\t'level'   =&gt; ( 3 === $level ) ? 3 : 2,\n\t\t),\n\t);\n}<\/code><\/pre>\n<p>Une fois votre fonctionnalit\u00e9 enregistr\u00e9e, vous pouvez ex\u00e9cuter dans votre terminal les m\u00eames commandes WP-CLI que celles pr\u00e9sent\u00e9es ci-dessus pour obtenir les d\u00e9tails. Le code suivant g\u00e9n\u00e9rera le sch\u00e9ma d\u2019entr\u00e9e de votre fonctionnalit\u00e9 :<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n    echo \"Ability not found\\n\";\n    exit( 1 );\n}\n\necho \"Input Schema:\\n\";\nvar_dump( $ability-&gt;get_input_schema() );\n'<\/code><\/pre>\n<p>Voici le r\u00e9sultat affich\u00e9 dans le terminal :<\/p>\n<pre><code>Input Schema:\narray(3) {\n\t[\"type\"]=&gt;\n\tstring(6) \"object\"\n\t[\"properties\"]=&gt;\n\tarray(1) {\n\t\t[\"audio_id\"]=&gt;\n\t\tarray(2) {\n\t\t\t[\"type\"]=&gt;\n\t\t\tstring(7) \"integer\"\n\t\t\t[\"description\"]=&gt;\n\t\t\tstring(76) \"The ID of the audio attachment to process and convert into Gutenberg blocks.\"\n\t\t}\n\t}\n\t[\"required\"]=&gt;\n\tarray(1) {\n\t\t[0]=&gt;\n\t\tstring(8) \"audio_id\"\n\t}\n}<\/code><\/pre>\n<p>De la m\u00eame mani\u00e8re, vous pouvez r\u00e9cup\u00e9rer le sch\u00e9ma de sortie de la capacit\u00e9 :<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n    echo \"Ability not found\\n\";\n    exit( 1 );\n}\n\necho \"Output Schema:\\n\";\nvar_dump( $ability-&gt;get_output_schema() );\n'<\/code><\/pre>\n<p>Vous pouvez \u00e9galement afficher l\u2019objet complet de votre capacit\u00e9 \u00e0 l\u2019aide de la commande suivante :<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit( 1 );\n}\n\necho \"Name: \" . $ability-&gt;get_name() . \"\\n\";\necho \"Label: \" . $ability-&gt;get_label() . \"\\n\";\necho \"Category: \" . $ability-&gt;get_category() . \"\\n\";\necho \"Description: \" . $ability-&gt;get_description() . \"\\n\";\necho \"nInput Schema:n\\\";\nvar_dump( $ability-&gt;get_input_schema() );\necho \"nOutput Schema:n\\\";\nvar_dump( $ability-&gt;get_output_schema() );\n'<\/code><\/pre>\n<h3>Ex\u00e9cution d\u2019une capacit\u00e9<\/h3>\n<p>Pour ex\u00e9cuter une fonctionnalit\u00e9, vous utiliserez la m\u00e9thode <code>execute()<\/code> de l\u2019objet <code>$ability<\/code>. Vous pouvez essayer d\u2019ex\u00e9cuter le code PHP suivant via WP-CLI pour d\u00e9clencher la fonctionnalit\u00e9 <code>core\/get-site-info<\/code>\u00a0:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit(1);\n}\n\n$result = $ability-&gt;execute();\n\nif ( is_wp_error( $result ) ) {\n\techo \"ERROR: \" . $result-&gt;get_error_message() . \"n\";\n\texit(1);\n}\n\necho json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . \"n\";\n'<\/code><\/pre>\n<p>Lorsque vous ex\u00e9cutez cette commande, la fonctionnalit\u00e9 renvoie un objet JSON similaire \u00e0 celui-ci :<\/p>\n<pre><code>{\n\t\"name\": \"WordPress 7.0\",\n\t\"description\": \"\",\n\t\"url\": \"http:\/\/yoursite.kinsta.cloud\",\n\t\"wpurl\": \"http:\/\/yoursite.kinsta.cloud\",\n\t\"admin_email\": \"yourname@youremail.com\",\n\t\"charset\": \"UTF-8\",\n\t\"language\": \"en-US\",\n\t\"version\": \"7.1-alpha-62550\"\n}<\/code><\/pre>\n<p>Ce qui pr\u00e9c\u00e8de n\u2019est qu\u2019un simple exemple de capacit\u00e9 fournissant des donn\u00e9es \u00e0 votre site.<\/p>\n<p>Comme mentionn\u00e9 ci-dessus, une fonctionnalit\u00e9 peut n\u00e9cessiter des donn\u00e9es d\u2019entr\u00e9e, effectuer des op\u00e9rations sur ces donn\u00e9es et renvoyer un r\u00e9sultat structur\u00e9. Nous pouvons en voir un exemple avec la fonctionnalit\u00e9 que nous avons enregistr\u00e9e dans la section pr\u00e9c\u00e9dente.<\/p>\n<p>Toujours dans votre terminal, acc\u00e9dez au r\u00e9pertoire racine de votre site et ex\u00e9cutez le code PHP suivant :<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit( 1 );\n}\n\n$input = array( \"audio_id\" =&gt; 1755 );\n\n$result = $ability-&gt;execute( $input );\n\nif ( is_wp_error( $result ) ) {\n\techo \"ERROR: \" . $result-&gt;get_error_message() . \"\\n\";\n\texit( 1 );\n}\n\necho json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . \"n\";\n'<\/code><\/pre>\n<p>La m\u00e9thode <code>execute<\/code>\u00a0transmet les donn\u00e9es d\u2019entr\u00e9e structur\u00e9es \u00e0 la fonctionnalit\u00e9, qui renvoie un tableau d\u2019objets pr\u00eats \u00e0 \u00eatre convertis en blocs Gutenberg :<\/p>\n<pre><code>[\n\t{\n\t\t\"name\": \"core\/heading\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"A Well-Deserved Rest Day in Marrakech\",\n\t\t\t\"level\": 2\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/paragraph\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"On April 24th, our group of seven motorcyclists took a break from the open road...\"\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/heading\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"Exploring Jemaa el-Fnaa and the Medina\",\n\t\t\t\"level\": 2\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/paragraph\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"Our journey led us straight to Jemaa el-Fnaa, the legendary main square of Marrakech...\"\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/list\",\n\t\t\"attributes\": {\n\t\t\t\"values\": \"&lt;ul&gt;&lt;li&gt;Navigating the bustling souks and narrow alleys of the ancient Medina.&lt;\/li&gt;&lt;li&gt;Savoring traditional Moroccan and Berber dishes.&lt;\/li&gt;&lt;li&gt;Experiencing the vibrant street performances and food stalls of Jemaa el-Fnaa at night.&lt;\/li&gt;&lt;\/ul&gt;\"\n\t\t}\n\t},\n\t...\n]<\/code><\/pre>\n<h2>Int\u00e9gration de l\u2019API REST<\/h2>\n<p>L\u2019API \u00ab Abilities \u00bb de WordPress fournit une structure de routage unifi\u00e9e qui permet \u00e0 des agents externes d\u2019interroger par programmation les cat\u00e9gories de capacit\u00e9s disponibles (<code>\/categories<\/code>), d\u2019inspecter des contrats de capacit\u00e9s sp\u00e9cifiques (<code>\/abilities\/{name}<\/code>) et d\u2019ex\u00e9cuter une capacit\u00e9 sp\u00e9cifique \u00e0 l\u2019aide du point de terminaison standard \u00ab run \u00bb (<code>\/abilities\/{name}\/run<\/code>).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Toutes les requ\u00eates adress\u00e9es \u00e0 l\u2019API REST de WordPress n\u00e9cessitent une authentification. Pour les scripts externes ou les outils tiers tels que Postman, veuillez utiliser les <a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/security\/application-passwords\/\" target=\"_blank\" rel=\"noopener noreferrer\">mots de passe d\u2019application WordPress<\/a>.<\/p>\n<\/aside>\n\n<p>Voici, par exemple, une requ\u00eate GET qui renvoie la liste des cat\u00e9gories de notre site de test :<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/categories<\/code><\/pre>\n<figure id=\"attachment_212438\" aria-describedby=\"caption-attachment-212438\" style=\"width: 1372px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-212438 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-26-alle-19.07.03.png\" alt=\"Requ\u00eate GET pour les cat\u00e9gories de comp\u00e9tences dans Postman\" width=\"1372\" height=\"496\"><figcaption id=\"caption-attachment-212438\" class=\"wp-caption-text\">Toutes les requ\u00eates doivent \u00eatre autoris\u00e9es<\/figcaption><\/figure>\n<p>Lorsque nous avons enregistr\u00e9 la fonctionnalit\u00e9 dans l\u2019exemple pr\u00e9c\u00e9dent, nous avons d\u00e9fini le param\u00e8tre <code>show_in_rest<\/code>\u00a0sur <code>true<\/code>. Ce faisant, nous avons rendu notre fonctionnalit\u00e9 automatiquement accessible via ces points de terminaison natifs de l\u2019API REST de WordPress, sous l\u2019espace de noms centralis\u00e9 \u00ab core \u00bb (<code>wp-abilities\/v1<\/code>).<\/p>\n<p>Cela signifie que vous n\u2019avez pas besoin d\u2019enregistrer manuellement des routes personnalis\u00e9es \u00e0 partir de z\u00e9ro pour appeler une capacit\u00e9 depuis un environnement externe. Les agents externes peuvent d\u00e9couvrir et ex\u00e9cuter votre capacit\u00e9 \u00e0 l\u2019aide de requ\u00eates HTTP standard.<\/p>\n<p>Vous pouvez consulter le contrat sp\u00e9cifique de notre capacit\u00e9 \u00e0 l\u2019aide de la requ\u00eate GET suivante :<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/abilities\/ai-content-builder\/audio-to-gutenberg-blocks<\/code><\/pre>\n<p>Enfin, vous pouvez d\u00e9clencher la fonctionnalit\u00e9 \u00e0 l\u2019aide d\u2019une requ\u00eate POST authentifi\u00e9e :<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/abilities\/ai-content-builder\/audio-to-gutenberg-blocks\/run<\/code><\/pre>\n<p>Lorsque vous envoyez ce type de requ\u00eate, veillez \u00e0 avoir sp\u00e9cifi\u00e9 les donn\u00e9es d\u2019entr\u00e9e. Dans notre exemple, nous avons d\u00e9fini le JSON suivant dans le corps de la requ\u00eate :<\/p>\n<pre><code class=\"language-json\">{\n\t\"input\": {\n\t\t\"audio_id\": YOUR_AUDIO_ID\n\t}\n}<\/code><\/pre>\n<figure id=\"attachment_212446\" aria-describedby=\"caption-attachment-212446\" style=\"width: 1378px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-212446 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/run-ability-via-rest-1.png\" alt=\"Ex\u00e9cution d\u2019une fonctionnalit\u00e9 via une requ\u00eate HTTP dans Postman\" width=\"1378\" height=\"1286\"><figcaption id=\"caption-attachment-212446\" class=\"wp-caption-text\">Ex\u00e9cution d\u2019une fonctionnalit\u00e9 via une requ\u00eate HTTP dans Postman<\/figcaption><\/figure>\n<p>Notre fonctionnalit\u00e9 a trait\u00e9 le fichier audio et l\u2019a transmis au mod\u00e8le d\u2019IA configur\u00e9 sur le site. Le mod\u00e8le a renvoy\u00e9 une sortie structur\u00e9e qui a ensuite \u00e9t\u00e9 normalis\u00e9e et nettoy\u00e9e, pour finalement renvoyer le tableau d\u2019objets suivant contenant les attributs du bloc :<\/p>\n<pre><code class=\"language-json\">{\n\t\"blocks\": [\n\t\t{\n\t\t\t\"name\": \"core\/heading\",\n\t\t\t\"attributes\": { \"content\": \"A Welcome Rest Day in Marrakech\", \"level\": 2 }\n\t\t},\n\t\t{\n\t\t\t\"name\": \"core\/paragraph\",\n\t\t\t\"attributes\": { \"content\": \"On April 24, our group of seven motorcyclists paused our journey...\" }\n\t\t}\n\t]\n}<\/code><\/pre>\n<p>Et c\u2019est pr\u00e9cis\u00e9ment le r\u00e9sultat que nous recherchions.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Depuis la sortie de WordPress 7.0, l\u2019API Abilities est d\u00e9sormais \u00e9galement disponible via JavaScript, gr\u00e2ce \u00e0 la mise en \u0153uvre de l\u2019API Abilities c\u00f4t\u00e9 client. Les d\u00e9veloppeurs peuvent exploiter les deux paquets <code>@wordpress\/abilities<\/code> et <code>@wordpress\/core-abilities<\/code> pour enregistrer des capacit\u00e9s \u2014 avec leurs sch\u00e9mas d\u2019entr\u00e9e et de sortie, leurs callbacks et leurs annotations \u2014 afin de mettre en \u0153uvre des fonctionnalit\u00e9s c\u00f4t\u00e9 client. Pour une analyse approfondie, consultez la note de d\u00e9veloppement <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/client-side-abilities-api-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">sur l\u2019API Abilities c\u00f4t\u00e9 client<\/a> et la <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/javascript-client.md\" target=\"_blank\" rel=\"noopener noreferrer\">documentation client JavaScript<\/a>.<\/p>\n<\/aside>\n\n<h2>L\u2019avenir de WordPress est \u00ab agentique \u00bb<\/h2>\n<p>Alors que <a href=\"https:\/\/kinsta.com\/fr\/blog\/ia-wordpress\/\">l\u2019AI Client et la nouvelle architecture de connecteurs<\/a> int\u00e8grent des capacit\u00e9s de traitement de l\u2019IA au sein de WordPress, l\u2019API Abilities red\u00e9finit la mani\u00e8re dont WordPress interagit avec le monde ext\u00e9rieur. Nous assistons \u00e0 un changement de paradigme radical, passant d\u2019une architecture web traditionnelle \u2014 reposant sur une interaction manuelle de l\u2019utilisateur o\u00f9 chaque int\u00e9gration n\u00e9cessitait des points de terminaison personnalis\u00e9s et un mappage manuel \u2014 \u00e0 une architecture orient\u00e9e intention, con\u00e7ue d\u00e8s le d\u00e9part pour l\u2019automatisation.<\/p>\n<p>Pour les d\u00e9veloppeurs WordPress, la nouvelle API Abilities repr\u00e9sente un tournant architectural, caract\u00e9ris\u00e9 par le d\u00e9couplage des fonctionnalit\u00e9s des plugins qui contiennent leur logique, le renforcement de la s\u00e9curit\u00e9 via le contrat d\u2019entr\u00e9e\/sortie, et la mise en place d\u2019une interop\u00e9rabilit\u00e9 native \u00e0 l\u2019\u00e9chelle de l\u2019ensemble de l\u2019\u00e9cosyst\u00e8me.<\/p>\n<p>Prises dans leur ensemble, ces fonctionnalit\u00e9s garantissent que l\u2019API Abilities n\u2019est pas simplement une API de plus, mais un v\u00e9ritable moteur d\u2019ex\u00e9cution distribu\u00e9 qui offre un aper\u00e7u d\u2019un avenir de plus en plus \u00ab agentique \u00bb pour WordPress.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;API Abilities, introduite dans WordPress 6.9, \u00e9tablit un langage commun permettant \u00e0 tous les composants de WordPress \u2014 tant le c\u0153ur du logiciel que les extensions &#8230;<\/p>\n","protected":false},"author":36,"featured_media":84104,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[953,1028],"class_list":["post-84103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","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>Premiers pas avec l&#039;API WordPress Abilities\u00a0: un guide pratique<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez comment utiliser l&#039;API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l&#039;automatisation par l&#039;IA.\" \/>\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\/guide-pratique-api-wordpress-abilities\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Premiers pas avec l&#039;API Abilities de WordPress : un guide pratique\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrez comment utiliser l&#039;API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l&#039;automatisation par l&#039;IA.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/\" \/>\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-08-03T07:00:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-03T08:07:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.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=\"D\u00e9couvrez comment utiliser l&#039;API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l&#039;automatisation par l&#039;IA.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.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=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Premiers pas avec l&rsquo;API Abilities de WordPress : un guide pratique\",\"datePublished\":\"2026-08-03T07:00:09+00:00\",\"dateModified\":\"2026-08-03T08:07:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/\"},\"wordCount\":2937,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/\",\"name\":\"Premiers pas avec l'API WordPress Abilities\u00a0: un guide pratique\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"datePublished\":\"2026-08-03T07:00:09+00:00\",\"dateModified\":\"2026-08-03T08:07:42+00:00\",\"description\":\"D\u00e9couvrez comment utiliser l'API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l'automatisation par l'IA.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Premiers pas avec l&#8217;API Abilities de WordPress : un guide pratique\"}]},{\"@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":"Premiers pas avec l'API WordPress Abilities\u00a0: un guide pratique","description":"D\u00e9couvrez comment utiliser l'API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l'automatisation par l'IA.","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\/guide-pratique-api-wordpress-abilities\/","og_locale":"fr_FR","og_type":"article","og_title":"Premiers pas avec l'API Abilities de WordPress : un guide pratique","og_description":"D\u00e9couvrez comment utiliser l'API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l'automatisation par l'IA.","og_url":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2026-08-03T07:00:09+00:00","article_modified_time":"2026-08-03T08:07:42+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"D\u00e9couvrez comment utiliser l'API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l'automatisation par l'IA.","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Carlo Daniele","Dur\u00e9e de lecture estim\u00e9e":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Premiers pas avec l&rsquo;API Abilities de WordPress : un guide pratique","datePublished":"2026-08-03T07:00:09+00:00","dateModified":"2026-08-03T08:07:42+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/"},"wordCount":2937,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/","url":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/","name":"Premiers pas avec l'API WordPress Abilities\u00a0: un guide pratique","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","datePublished":"2026-08-03T07:00:09+00:00","dateModified":"2026-08-03T08:07:42+00:00","description":"D\u00e9couvrez comment utiliser l'API WordPress Abilities pour transformer les fonctionnalit\u00e9s de votre extension en services s\u00e9curis\u00e9s, bas\u00e9s sur des contrats et pr\u00eats pour l'automatisation par l'IA.","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/guide-pratique-api-wordpress-abilities\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/fr\/sujets\/api\/"},{"@type":"ListItem","position":3,"name":"Premiers pas avec l&#8217;API Abilities de WordPress : un guide pratique"}]},{"@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\/84103","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=84103"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/84103\/revisions"}],"predecessor-version":[{"id":84170,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/84103\/revisions\/84170"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84103\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84103\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84103\/translations\/fr"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84103\/translations\/jp"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/84103\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/84104"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=84103"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=84103"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=84103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}