{"id":66420,"date":"2026-07-30T08:24:52","date_gmt":"2026-07-30T06:24:52","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=66420&#038;preview=true&#038;preview_id=66420"},"modified":"2026-08-05T15:00:55","modified_gmt":"2026-08-05T13:00:55","slug":"wordpress-abilities-api","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/","title":{"rendered":"Aan de slag met de WordPress Abilities API: een praktische gids"},"content":{"rendered":"<p>De Abilities API, ge\u00efntroduceerd in <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-6-9\/#abilities-api\">WordPress 6.9<\/a>, zorgt voor een gemeenschappelijke taal, waardoor alle WordPress-onderdelen \u2013 zowel de kern als plugins \u2013 hun functionaliteit op een uniforme, begrijpelijke manier kunnen aanbieden, zowel voor mensen als voor machines. Hierdoor is je WordPress site klaar voor integratie met externe automatiseringstools op een gestandaardiseerde en veilige manier.<\/p>\n<p>Als je je afvraagt hoe sommige toepassingen van de Abilities API eruit zouden kunnen zien: denk bijvoorbeeld aan een AI-model dat een gebruiker door het aankoopproces loodst en hem of haar zelfs in staat stelt de aankoop af te ronden zonder je e-commercewebsite te bezoeken. Of denk aan een <a href=\"https:\/\/kinsta.com\/nl\/blog\/ci-cd-pipeline-maken\/\">CI\/CD-pijplijn op GitHub Actions<\/a> die tekst verwerkt die uit een audio- of videobestand is gehaald en deze naar WordPress stuurt voor publicatie. De toepassingen zijn eindeloos.<\/p>\n<p>De Abilities API verandert de rol van WordPress binnen het ecosysteem fundamenteel. Het is niet langer alleen een blog, en zelfs geen CMS meer; tegenwoordig fungeert WordPress als een gedistribueerde uitvoeringsengine die van buitenaf kan worden aangestuurd, als een soort besturingssysteem, helemaal klaar voor autonome agents.<\/p>\n<p>Nieuwsgierig geworden? Tijd om er in te duiken!<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>Waarvoor is een ability bedoeld?<\/h2>\n<p>Een ability is een vindbare, bruikbare functionaliteit op een WordPress site die specifieke bewerkingen mogelijk maakt voor externe entiteiten (zoals AI-modellen) of interne componenten.<\/p>\n<p>De API kan bijvoorbeeld worden gebruikt voor:<\/p>\n<ul>\n<li>Het zoeken naar content of het uitvoeren van specifieke databasebewerkingen<\/li>\n<li>Het lezen van configuratie-instellingen van de site<\/li>\n<li>Een bericht aanmaken<\/li>\n<li>Een JSON-structuur omzetten in Gutenberg-blokken<\/li>\n<\/ul>\n<p>Een ability beschikbaar maken betekent dat je een specifieke functionaliteit interoperabel maakt. Voordat een ability ontdekt en gebruikt kan worden, moet deze worden geregistreerd in een centrale catalogus. Pas dan kunnen WordPress en AI-modellen het ontdekken, de bedoeling ervan begrijpen en het aanroepen wanneer dat nodig is.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>E\u00e9n ding moet duidelijk zijn: een AI-model heeft nooit directe toegang tot je site. Het kan WordPress alleen vragen om een bewerking uit te voeren (bijvoorbeeld: \u201egeef me het totale aantal berichten op de site&#8221;) die nodig is om zijn taak te voltooien.<\/p>\n<\/aside>\n\n<p>Standaard is de functionaliteit van je plugins volledig ge\u00efsoleerd. Door een ability te registreren, geef je aan dat de onderliggende logica beschikbaar is als een service voor het hele ecosysteem.<\/p>\n<p>Laten we eens naar een voorbeeld kijken. Als je plugin een functie heeft die een initieel JSON-object omzet in gestructureerde content die klaar is voor Gutenberg-blokken, kun je die als ability registreren. Hierdoor kunnen andere tools met de benodigde rechten precies dezelfde functie activeren.<\/p>\n<p>In onze vorige <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ai\/\">tutorial over de WordPress AI Client<\/a> zorgde de plugin voor de kernlogica van het versturen van een audiobestand naar het AI-model, dat een JSON-gestructureerd antwoord teruggaf om Gutenberg-blokken te genereren. Die functionaliteit bleef echter beperkt tot onze plugin. Door dit proces als ability te registreren, ontkoppel je de uitvoering, en kan elke externe entiteit de volledige logica van de plugin activeren door simpelweg een JSON-object door te geven dat een audiobestands-ID bevat.<\/p>\n<p><strong>Een ability fungeert als een formeel contract<\/strong> tussen de onderliggende PHP-logica en elke entiteit die de uitvoering ervan aanvraagt. Het contract specificeert de gegevens die de ability als invoer verwacht, de bedoeling ervan en het gegevensschema dat het als uitvoer retourneert.<\/p>\n<p>Als je een ability registreert, wordt deze toegevoegd aan <a href=\"https:\/\/make.wordpress.org\/ai\/2025\/07\/17\/abilities-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">het ability-register<\/a> van je site. Vanaf dat moment <strong>fungeert WordPress als een veilige gateway<\/strong>: het controleert de authenticatie en valideert binnenkomende gegevens aan de hand van het schema dat in het contract is vastgelegd. WordPress stuurt het verzoek alleen door naar de onderliggende PHP-functie als de payload strikt voldoet aan het contract.<\/p>\n<p><strong>Een ability is agnostisch.<\/strong> WordPress hoeft niet te weten welke specifieke entiteit toegang vraagt; het controleert alleen of het verzoek geautoriseerd is en voldoet aan de voorwaarden van het contract.<\/p>\n<p>Door een ability te registreren, is je plugin niet langer alleen maar een uitbreiding met zijn eigen interne logica; het wordt een dienstverlener voor het hele ecosysteem. Of het nu gaat om een mobiele app, een automatiseringsscript zoals Make.com of <a href=\"https:\/\/kinsta.com\/nl\/blog\/woocommerce-zapier\/\">Zapier<\/a>, een AI-agent of een server die via het <a href=\"https:\/\/kinsta.com\/nl\/blog\/mcp-server-kinsta-api\/\">MCP-protocol<\/a> communiceert: deze entiteiten weten precies hoe ze gestructureerde bewerkingen op je site moeten activeren.<\/p>\n<h2>Werken met de Abilities API<\/h2>\n<p>De Abilities API biedt een <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/php-api.md\" target=\"_blank\" rel=\"noopener noreferrer\">uitgebreide set functies<\/a> waarmee je geregistreerde abilities op je site kunt ontdekken, ze kunt activeren en abilities kunt registreren of deregistreren.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Werk met de abilities van je site<\/h3>\n<p>Je kunt een lijst opvragen van alle geregistreerde abilities of een afzonderlijk ability-object ophalen. Je kunt ook voorwaarden controleren, zoals of een specifieke ability is geregistreerd of dat de agent de rechten heeft om deze te activeren.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h4\" count-number=\"4\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h4>Een lijst ophalen van de abilities die op je site zijn geregistreerd<\/h4>\n<p>De <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_abilities\/\" target=\"_blank\" rel=\"noopener noreferrer\">functie <code>wp_get_abilities()<\/code><\/a> geeft een array terug met alle geregistreerde abilities. Je kunt dit testen met <a href=\"https:\/\/kinsta.com\/nl\/blog\/wp-cli\/\">WP-CLI<\/a>. Zodra je <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-op-afstand-ontwikkelen-kinsta-ssh\/\">via SSH verbinding hebt gemaakt met je site<\/a>, ga je naar de hoofdmap van de site, waar je <a href=\"https:\/\/kinsta.com\/nl\/blog\/wp-config-php\/\"> <code>wp-config.php <\/code> bestand<\/a> staat, met de volgende commando&#8217;s:<\/p>\n<pre><code class=\"language-bash\">cd \/path\/to\/your\/site\nls wp-config.php<\/code><\/pre>\n<p>Zorg er vervolgens voor dat WP-CLI je site-installatie herkent:<\/p>\n<pre><code class=\"language-bash\">wp core is-installed\nwp option get siteurl<\/code><\/pre>\n<p>Als je de URL van je site te zien krijgt, ben je klaar om de volgende opdracht uit te voeren:<\/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>Dit commando voert <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/eval\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP-code uit in je terminal<\/a>. De PHP-code vraagt de namen op van alle geregistreerde abilities op je site, en standaard zou je het volgende antwoord moeten krijgen:<\/p>\n<pre><code class=\"language-bash\">core\/get-site-info\ncore\/get-user-info\ncore\/get-environment-info<\/code><\/pre>\n<p>Je kunt een completere set gegevens opvragen met het volgende commando:<\/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>Als je dit commando uitvoert op een nieuwe <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a> site, geeft de terminal het volgende antwoord weer:<\/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>Een ability-object ophalen<\/h4>\n<p>De <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">functie <code>wp_get_ability()<\/code><\/a> geeft \u00e9\u00e9n ability-object terug op basis van de naam. Je kunt dit in WP-CLI testen met het volgende commando:<\/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>Als de ability correct op je site is geregistreerd, krijg je het volgende antwoord in je 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>Controleren of een ability is geregistreerd<\/h4>\n<p>Met <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_has_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">de functie <code>wp_has_ability()<\/code><\/a> kun je controleren of een ability is geregistreerd. In WP-CLI kun je deze als volgt gebruiken:<\/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>Als de ability is geregistreerd, verschijnt het volgende bericht in de terminal:<\/p>\n<pre><code class=\"language-bash\">\u2713 core\/get-site-info is registered<\/code><\/pre>\n<h4>De rechten van de gebruiker controleren<\/h4>\n<p>Je kunt controleren of de huidige gebruiker de rechten heeft om een ability uit te voeren door de <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ability\/check_permissions\/\" target=\"_blank\" rel=\"noopener noreferrer\">methode <code>check_permissions()<\/code><\/a> van het <code>$ability<\/code>-object te gebruiken. Dit geeft <code>true<\/code>, <code>false<\/code> of een <code>WP_Error<\/code>-object terug. Laten we deze methode eens aanroepen vanaf de terminal met de volgende WP-CLI-opdracht:<\/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>Hier hebben we <code>--user=1<\/code> ingesteld, en daarom krijg je het volgende antwoord:<\/p>\n<pre><code class=\"language-bash\">You have permissions to execute this ability.<\/code><\/pre>\n<h3>Een ability registreren<\/h3>\n<p>Het is nu tijd om een ability te registreren. Om een praktijkvoorbeeld te laten zien, breiden we de plugin uit die <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ai\/\">we in ons artikel over de WordPress AI Client<\/a> hebben beschreven. De plugin stuurt een audiobestand naar het AI-model om de tekst eruit te halen en het genereren van Gutenberg-blokken te activeren. In dit gedeelte bekijken we hoe je dit proces als ability kunt registreren, zodat elke entiteit met de benodigde rechten het kan vinden en gebruiken.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Voor de onderstaande voorbeelden laten we alleen de essenti\u00eble code zien. Om zelf aan de slag te gaan met de code uit dit gedeelte, raden we je aan de <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder Next-plugin<\/a> van GitHub te downloaden en deze handmatig te installeren op een lokale of staging WordPress site.<\/p>\n<\/aside>\n\n<p>Voordat je een nieuwe ability registreert, moet je eerst een nieuwe ability-categorie aanmaken.<\/p>\n<p>Hiervoor moet je de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability_category\/\" target=\"_blank\" rel=\"noopener noreferrer\">functie <code>wp_register_ability_category()<\/code><\/a> koppelen aan de hook <code>wp_abilities_api_categories_init<\/code>.<\/p>\n<p>De functie accepteert een unieke categorie-slug en een associatieve array met argumenten.<\/p>\n<p>Zo registreer je je ability-categorie:<\/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>De volgende stap is het registreren van de ability. Hiervoor koppel je de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">functie <code>wp_register_ability()<\/code><\/a> aan de actie <code>wp_abilities_api_init<\/code>.<\/p>\n<p>De functie accepteert twee argumenten: de naam van de ability, inclusief de namespace, en een array met argumenten voor de configuratie van de ability.<\/p>\n<p>Hier is de registratie van de ability voor de <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder-plugin<\/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>In de functie-call <code>wp_register_ability<\/code> hebben we de volgende argumenten geconfigureerd:<\/p>\n<ul>\n<li><code>category<\/code>: De categorie waartoe de ability behoort.<\/li>\n<li><code>label<\/code>: De weergavenaam van de ability.<\/li>\n<li><code>description<\/code>: Een korte beschrijving van wat de ability doet en waarvoor hij dient.<\/li>\n<li><code>input_schema<\/code>: Het gegevensschema voor de inkomende invoerargumenten.<\/li>\n<li><code>output_schema<\/code>: Het gegevensschema dat door de ability wordt geleverd en teruggestuurd.<\/li>\n<li><code>execute_callback<\/code>: De callback-functie die wordt uitgevoerd wanneer de ability wordt geactiveerd.<\/li>\n<li><code>permission_callback<\/code>: Een callback-functie die controleert of de agent de benodigde rechten heeft om de ability uit te voeren.<\/li>\n<li><code>meta<\/code>: Een array met extra metadatavelden voor de ability.<\/li>\n<li><code>show_in_rest<\/code>: Bepaalt of de ability al dan niet beschikbaar wordt gesteld binnen de WordPress REST API.<\/li>\n<li><code>annotations<\/code>: Een array met beschrijvende elementen die het gedrag van de ability defini\u00ebren.<\/li>\n<\/ul>\n<p><code>input_schema<\/code> is een array die het invoercontract van de ability definieert. Het vertegenwoordigt de JSON Schema-definitie voor het valideren van de invoer van de ability. In ons specifieke geval is het als volgt gedefinieerd:<\/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>Dit JSON-schema geeft het formaat weer dat de invoergegevens moeten volgen om deze ability te kunnen gebruiken.<\/p>\n<p><code>output_schema<\/code> is het uitvoercontract dat door de ability wordt geretourneerd. In ons voorbeeld is elk item een object dat een JSON-blok vertegenwoordigt:<\/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>De volgende stap is het defini\u00ebren van de callback-functie die wordt uitgevoerd wanneer de ability wordt geactiveerd (bekijk de <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php#L483\" target=\"_blank\" rel=\"noopener noreferrer\">volledige code op 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>Deze functie roept twee custom functies aan. De eerste (<code>aicb_normalize_structured_post<\/code>) normaliseert de uitvoer van de AI naar een vooraf gedefinieerd formaat en zuivert de gegevens:<\/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>De functie accepteert een gestructureerde array van JSON-objecten, normaliseert en zuivert de gegevens, en retourneert een array met de titel en de secties.<\/p>\n<p>De tweede functie (<code>aicb_sections_to_blocks<\/code>) zet de genormaliseerde gegevens om in blokdescriptor-objecten en is als volgt gedefinieerd:<\/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>Dit zijn de belangrijkste kenmerken van deze functie:<\/p>\n<ul>\n<li>De functie neemt 2 argumenten aan: een string die de titel van het bericht weergeeft en een array met de secties die door het AI-model zijn gegenereerd.<\/li>\n<li>Voor elke sectie genereert de functie een kop en minstens \u00e9\u00e9n alinea.<\/li>\n<li>Als er opsommingstekens zijn, genereert de functie een overeenkomstig aantal lijstitems.<\/li>\n<li>De functie retourneert een <code>$blocks<\/code>-array met blokdescriptor-objecten; dit is het outputcontract dat door de ability (<code>$output_schema<\/code>) wordt teruggestuurd.<\/li>\n<\/ul>\n<p>Let op: de uitvoer van de functie is niet de ruwe blokopmaak. Deze wordt aan de clientzijde gegenereerd met behulp van de JavaScript-functie <code>createBlock<\/code>.<\/p>\n<p>Het kopelement van een sectie wordt bijvoorbeeld weergegeven door het volgende object:<\/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>Zodra je je ability hebt geregistreerd, kun je dezelfde WP-CLI-commando&#8217;s als hierboven in je terminal uitvoeren om de details op te vragen. De volgende code genereert het invoerschema voor je ability:<\/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>Dit is het resultaat in de 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>Op dezelfde manier kun je het outputschema van de ability opvragen:<\/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>Je kunt ook het volledige object van je ability weergeven met de volgende opdracht:<\/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>Een ability uitvoeren<\/h3>\n<p>Om een ability uit te voeren, gebruik je de methode <code>execute()<\/code> van het <code>$ability<\/code>-object. Probeer eens de volgende PHP-code via WP-CLI uit te voeren om de ability <code>core\/get-site-info<\/code> te activeren:<\/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>Als je dit commando uitvoert, levert de ability een JSON-object op dat er ongeveer zo uitziet:<\/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>Het bovenstaande is slechts een eenvoudig voorbeeld van een ability die gegevens voor je site levert.<\/p>\n<p>Zoals hierboven vermeld, kan een ability invoergegevens vereisen, bewerkingen op die gegevens uitvoeren en een gestructureerde uitvoer retourneren. We kunnen hier een voorbeeld van zien met de ability die we in de vorige paragraaf hebben geregistreerd.<\/p>\n<p>Blijf in je terminal, ga naar de hoofdmap van je site en voer de volgende PHP-code uit:<\/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>De methode <code>execute<\/code> geeft de gestructureerde invoergegevens door aan de ability, die een array met objecten teruggeeft die klaar zijn om te worden omgezet in Gutenberg-blokken:<\/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>REST API-integratie<\/h2>\n<p>De WordPress Abilities API biedt een uniforme routingstructuur waarmee externe agents programmatisch beschikbare ability-categorie\u00ebn kunnen opvragen (<code>\/categories<\/code>), specifieke ability-contracten kunnen bekijken (<code>\/abilities\/{name}<\/code>) en een specifieke ability kunnen uitvoeren via het standaard run-endpoint (<code>\/abilities\/{name}\/run<\/code>).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Alle verzoeken aan de WordPress REST API vereisen authenticatie. Gebruik voor externe scripts of tools van derden, zoals Postman, <a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/security\/application-passwords\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress-applicatiewachtwoorden<\/a>.<\/p>\n<\/aside>\n\n<p>Hier is bijvoorbeeld een GET-verzoek dat de lijst met categorie\u00ebn van onze testsite teruggeeft:<\/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=\"size-full wp-image-212438\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-26-alle-19.07.03.png\" alt=\"GET-verzoek voor ability-categorie\u00ebn in Postman.\" width=\"1372\" height=\"496\"><figcaption id=\"caption-attachment-212438\" class=\"wp-caption-text\">Alle verzoeken moeten worden geautoriseerd.<\/figcaption><\/figure>\n<p>Toen we de ability in het vorige voorbeeld registreerden, hebben we de parameter <code>show_in_rest<\/code> ingesteld op <code>true<\/code>. Hierdoor hebben we onze ability automatisch toegankelijk gemaakt via deze native WordPress REST API-endpoints onder de gecentraliseerde kernnaamruimte (<code>wp-abilities\/v1<\/code>).<\/p>\n<p>Dit betekent dat je geen custom routes helemaal zelf hoeft te registreren om een ability vanuit een externe omgeving aan te roepen. Externe agents kunnen je ability vinden en uitvoeren met standaard HTTP-verzoeken.<\/p>\n<p>Je kunt het specifieke contract van onze ability bekijken met het volgende GET-verzoek:<\/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>Ten slotte kun je de ability activeren met een geauthenticeerd POST-verzoek:<\/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>Zorg er bij het versturen van dit soort verzoeken voor dat je de invoergegevens hebt opgegeven. Voor ons voorbeeld hebben we de volgende JSON in de verzoektekst gezet:<\/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=\"size-full wp-image-212446\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/run-ability-via-rest-1.png\" alt=\"Een ability uitvoeren via een HTTP-verzoek in Postman.\" width=\"1378\" height=\"1286\"><figcaption id=\"caption-attachment-212446\" class=\"wp-caption-text\">Een ability uitvoeren via een HTTP-verzoek in Postman.<\/figcaption><\/figure>\n<p>Onze ability heeft de audio verwerkt en doorgestuurd naar het AI-model dat op de site is geconfigureerd. Het model leverde een gestructureerde uitvoer op die vervolgens werd genormaliseerd en opgeschoond, waarna uiteindelijk de volgende reeks objecten werd teruggestuurd met daarin de blokattributen:<\/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>En dit is precies het resultaat waar we op mikten.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Sinds de release van WordPress 7.0 is de Abilities API nu ook beschikbaar via JavaScript, dankzij de introductie van de Client-Side Abilities API. Ontwikkelaars kunnen gebruikmaken van de twee pakketten <code>@wordpress\/abilities<\/code> en <code>@wordpress\/core-abilities<\/code> om abilities te registreren \u2013 compleet met hun invoer- en uitvoerschema&#8217;s, callbacks en annotaties \u2013 om client-side functionaliteit te bouwen. Voor een diepgaande analyse, zie de dev note over <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/client-side-abilities-api-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">de Client-Side Abilities API<\/a> en de <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/javascript-client.md\" target=\"_blank\" rel=\"noopener noreferrer\">JavaScript-clientdocumentatie<\/a>.<\/p>\n<\/aside>\n\n<h2>De toekomst van WordPress is agentisch<\/h2>\n<p>Terwijl de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ai\/\">AI Client en de nieuwe connectorarchitectuur<\/a> AI-verwerkingsmogelijkheden binnen WordPress brengen, geeft de Abilities API een nieuwe invulling aan hoe WordPress met de buitenwereld omgaat. We zijn getuige van een drastische paradigmaverschuiving: van een traditionele webarchitectuur \u2014 gebaseerd op handmatige gebruikersinteractie waarbij elke integratie custom endpoints en handmatige mapping vereiste \u2014 naar een intentiegestuurde architectuur die vanaf de basis is ontworpen voor automatisering.<\/p>\n<p>Voor WordPress-ontwikkelaars betekent de nieuwe Abilities API een architectonisch keerpunt, gekenmerkt door het loskoppelen van functionaliteit van plugins die de logica ervan bevatten, het waarborgen van beveiliging via het input\/output-contract en het mogelijk maken van native interoperabiliteit in het hele ecosysteem.<\/p>\n<p>Al deze kenmerken samen zorgen ervoor dat de Abilities API niet zomaar een API is, maar een echte gedistribueerde uitvoeringsengine die een glimp biedt van een toekomst waarin WordPress steeds meer op eigen kracht gaat werken.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De Abilities API, ge\u00efntroduceerd in WordPress 6.9, zorgt voor een gemeenschappelijke taal, waardoor alle WordPress-onderdelen \u2013 zowel de kern als plugins \u2013 hun functionaliteit op een &#8230;<\/p>\n","protected":false},"author":36,"featured_media":66421,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[911,892],"class_list":["post-66420","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","topic-wordpress-ontwikkeling"],"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>Aan de slag met de WordPress Abilities API: een praktische gids<\/title>\n<meta name=\"description\" content=\"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.\" \/>\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\/nl\/blog\/wordpress-abilities-api\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aan de slag met de WordPress Abilities API: een praktische gids\" \/>\n<meta property=\"og:description\" content=\"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T06:24:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-05T13:00:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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=\"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Aan de slag met de WordPress Abilities API: een praktische gids\",\"datePublished\":\"2026-07-30T06:24:52+00:00\",\"dateModified\":\"2026-08-05T13:00:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/\"},\"wordCount\":2351,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"inLanguage\":\"nl-NL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/\",\"name\":\"Aan de slag met de WordPress Abilities API: een praktische gids\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"datePublished\":\"2026-07-30T06:24:52+00:00\",\"dateModified\":\"2026-08-05T13:00:55+00:00\",\"description\":\"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Aan de slag met de WordPress Abilities API: een praktische gids\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"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\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Aan de slag met de WordPress Abilities API: een praktische gids","description":"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.","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\/nl\/blog\/wordpress-abilities-api\/","og_locale":"nl_NL","og_type":"article","og_title":"Aan de slag met de WordPress Abilities API: een praktische gids","og_description":"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.","og_url":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2026-07-30T06:24:52+00:00","article_modified_time":"2026-08-05T13:00:55+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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":"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Carlo Daniele","Geschatte leestijd":"22 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Aan de slag met de WordPress Abilities API: een praktische gids","datePublished":"2026-07-30T06:24:52+00:00","dateModified":"2026-08-05T13:00:55+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/"},"wordCount":2351,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","inLanguage":"nl-NL"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/","url":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/","name":"Aan de slag met de WordPress Abilities API: een praktische gids","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","datePublished":"2026-07-30T06:24:52+00:00","dateModified":"2026-08-05T13:00:55+00:00","description":"Leer hoe je de WordPress Abilities API gebruikt om de functies van je plugin om te zetten in veilige, contractgestuurde services die klaar zijn voor AI-automatisering.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-abilities-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/api\/"},{"@type":"ListItem","position":3,"name":"Aan de slag met de WordPress Abilities API: een praktische gids"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","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\/nl\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/66420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=66420"}],"version-history":[{"count":9,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/66420\/revisions"}],"predecessor-version":[{"id":66561,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/66420\/revisions\/66561"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/translations\/es"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/66420\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/66421"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=66420"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=66420"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=66420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}