{"id":76971,"date":"2026-07-30T07:10:36","date_gmt":"2026-07-30T06:10:36","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=76971&#038;preview=true&#038;preview_id=76971"},"modified":"2026-08-05T12:52:29","modified_gmt":"2026-08-05T11:52:29","slug":"wordpress-abilities-api","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/","title":{"rendered":"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden"},"content":{"rendered":"<p>Die in <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-6-9\/#abilities-api\">WordPress 6.9<\/a> eingef\u00fchrte Abilities-API schafft eine gemeinsame Sprache, die es allen WordPress-Komponenten \u2013 sowohl dem Kern als auch den Plugins \u2013 erm\u00f6glicht, ihre Funktionen auf einheitliche und verst\u00e4ndliche Weise f\u00fcr Menschen und Maschinen gleicherma\u00dfen bereitzustellen. Dadurch ist deine WordPress-Seite bereit f\u00fcr die standardisierte und sichere Integration mit externen Automatisierungstools.<\/p>\n<p>Wenn du dich fragst, wie einige Anwendungsf\u00e4lle f\u00fcr die Abilities-API aussehen k\u00f6nnten, stell dir ein KI-Modell vor, das einen Nutzer durch den Kaufprozess f\u00fchrt und es ihm sogar erm\u00f6glicht, den Kauf abzuschlie\u00dfen, ohne deine E-Commerce-Website zu besuchen. Oder stell dir eine <a href=\"https:\/\/kinsta.com\/de\/blog\/ci-cd-pipeline-github-aktionen-erstellen\/\">CI\/CD-Pipeline auf GitHub Actions<\/a> vor, die aus einer Audio- oder Videodatei extrahierten Text verarbeitet und zur Ver\u00f6ffentlichung an WordPress sendet. Die Anwendungsf\u00e4lle sind endlos.<\/p>\n<p>Die Abilities-API ver\u00e4ndert die Rolle von WordPress innerhalb des \u00d6kosystems grundlegend. Es ist nicht mehr nur ein Blog und auch kein reines CMS mehr; heute fungiert WordPress als verteilte Ausf\u00fchrungs-Engine, die von au\u00dfen gesteuert werden kann \u2013 wie eine Art Betriebssystem, das vollst\u00e4ndig f\u00fcr autonome Agenten vorbereitet ist.<\/p>\n<p>Neugierig, mehr zu erfahren? Lass uns tiefer eintauchen.<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>Wozu dient eine \u201eAbility\u201c?<\/h2>\n<p>Eine \u201eAbility\u201c ist eine auffindbare, umsetzbare Funktion auf einer WordPress-Website, die bestimmte Vorg\u00e4nge f\u00fcr externe Entit\u00e4ten (wie KI-Modelle) oder interne Komponenten erm\u00f6glicht.<\/p>\n<p>Die API kann beispielsweise f\u00fcr Folgendes genutzt werden:<\/p>\n<ul>\n<li>Nach Inhalten suchen oder bestimmte Datenbankoperationen ausf\u00fchren<\/li>\n<li>Das Auslesen von Website-Konfigurationseinstellungen<\/li>\n<li>Einen Beitrag erstellen<\/li>\n<li>Eine JSON-Struktur in Gutenberg-Bl\u00f6cke umwandeln<\/li>\n<\/ul>\n<p>Eine F\u00e4higkeit verf\u00fcgbar zu machen bedeutet, eine bestimmte Funktionalit\u00e4t interoperabel zu gestalten. Bevor eine F\u00e4higkeit erkannt und genutzt werden kann, muss sie in einem zentralen Katalog registriert werden. Erst dann k\u00f6nnen WordPress und KI-Modelle sie erkennen, ihre Absicht verstehen und bei Bedarf aufrufen.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Eine Klarstellung ist notwendig: Ein KI-Modell hat niemals direkten Zugriff auf deine Website. Es kann WordPress lediglich auffordern, einen Vorgang auszuf\u00fchren (zum Beispiel: \u201eGib mir die Gesamtzahl der Beitr\u00e4ge auf der Website\u201c), der zur Erf\u00fcllung seiner Aufgabe erforderlich ist.<\/p>\n<\/aside>\n\n<p>Standardm\u00e4\u00dfig ist die Funktionalit\u00e4t deiner Plugins vollst\u00e4ndig isoliert. Durch die Registrierung einer F\u00e4higkeit erkl\u00e4rst du, dass die zugrunde liegende Logik als Dienst f\u00fcr das gesamte \u00d6kosystem verf\u00fcgbar ist.<\/p>\n<p>Schauen wir uns ein Beispiel an. Wenn dein Plugin eine Funktion hat, die ein urspr\u00fcngliches JSON-Objekt in strukturierte Inhalte umwandelt, die f\u00fcr Gutenberg-Bl\u00f6cke bereit sind, kannst du diese als F\u00e4higkeit registrieren. Dadurch k\u00f6nnen andere Tools mit den erforderlichen Berechtigungen genau dieselbe Funktion ausl\u00f6sen.<\/p>\n<p>In unserem vorherigen <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-ki\/\">Tutorial zum WordPress AI Client<\/a> \u00fcbernahm das Plugin die Kernlogik des Versendens einer Audiodatei an das KI-Modell, das eine JSON-strukturierte Antwort zur\u00fcckgab, um Gutenberg-Bl\u00f6cke zu generieren. Diese Funktionalit\u00e4t blieb jedoch auf unser Plugin beschr\u00e4nkt. Indem du diesen Prozess als \u201eF\u00e4higkeit\u201c registrierst, entkoppelst du die Ausf\u00fchrung, und jede externe Instanz kann die gesamte Plugin-Logik ausl\u00f6sen, indem sie einfach ein JSON-Objekt \u00fcbergibt, das eine Audio-Datei-ID enth\u00e4lt.<\/p>\n<p><strong>Eine F\u00e4higkeit dient als formaler Vertrag<\/strong> zwischen der zugrunde liegenden PHP-Logik und jeder Instanz, die deren Ausf\u00fchrung anfordert. Der Vertrag legt fest, welche Daten die F\u00e4higkeit als Eingabe erwartet, welchen Zweck sie verfolgt und welches Datenschema sie als Ausgabe zur\u00fcckgibt.<\/p>\n<p>Wenn du eine F\u00e4higkeit registrierst, wird sie dem <a href=\"https:\/\/make.wordpress.org\/ai\/2025\/07\/17\/abilities-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">F\u00e4higkeitsregister<\/a> deiner Website hinzugef\u00fcgt. Von diesem Moment an <strong>fungiert WordPress als sicheres Gateway<\/strong>: Es \u00fcberpr\u00fcft die Authentifizierung und validiert eingehende Daten anhand des im Vertrag festgelegten Schemas. WordPress leitet die Anfrage nur dann an die zugrunde liegende PHP-Funktion weiter, wenn die Nutzdaten streng dem Vertrag entsprechen.<\/p>\n<p><strong>Eine F\u00e4higkeit ist plattformunabh\u00e4ngig.<\/strong> WordPress muss nicht wissen, welche konkrete Instanz den Zugriff anfordert; es \u00fcberpr\u00fcft lediglich, ob die Anfrage autorisiert ist und die Vorgaben des Vertrags erf\u00fcllt.<\/p>\n<p>Durch die Registrierung einer F\u00e4higkeit ist dein Plugin nicht mehr nur eine Erweiterung mit eigener interner Logik; es wird zu einem Dienstanbieter f\u00fcr das gesamte \u00d6kosystem. Ob es sich nun um eine mobile Anwendung, ein Automatisierungsskript wie Make.com oder <a href=\"https:\/\/kinsta.com\/de\/blog\/woocommerce-zapier\/\">Zapier<\/a>, einen KI-Agenten oder einen Server handelt, der \u00fcber das <a href=\"https:\/\/kinsta.com\/de\/blog\/mcp-server-kinsta-api\/\">MCP-Protokoll<\/a> kommuniziert \u2013 diese Entit\u00e4ten wissen genau, wie sie strukturierte Vorg\u00e4nge auf deiner Website ausl\u00f6sen k\u00f6nnen.<\/p>\n<h2>Arbeiten mit der Abilities-API<\/h2>\n<p>Die Abilities-API bietet einen <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/php-api.md\" target=\"_blank\" rel=\"noopener noreferrer\">umfassenden Funktionsumfang<\/a>, mit dem du registrierte F\u00e4higkeiten auf deiner Website erkennen, aktivieren sowie F\u00e4higkeiten registrieren und deregistrieren kannst.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Arbeite mit den F\u00e4higkeiten deiner Website<\/h3>\n<p>Du kannst eine Liste aller registrierten F\u00e4higkeiten abrufen oder ein einzelnes F\u00e4higkeitsobjekt abrufen. Du kannst auch Bedingungen \u00fcberpr\u00fcfen, z. B. ob eine bestimmte F\u00e4higkeit registriert ist oder ob der Agent die Berechtigungen hat, sie auszul\u00f6sen.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h4\" count-number=\"4\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h4>Eine Liste der auf deiner Website registrierten F\u00e4higkeiten abrufen<\/h4>\n<p>Die <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_abilities\/\" target=\"_blank\" rel=\"noopener noreferrer\">Funktion <code>wp_get_abilities()<\/code><\/a> gibt ein Array aller registrierten F\u00e4higkeiten zur\u00fcck. Du kannst sie mit <a href=\"https:\/\/kinsta.com\/de\/blog\/wp-cli\/\">WP-CLI<\/a> testen. Sobald du <a href=\"https:\/\/kinsta.com\/de\/blog\/remote-wordpress-entwicklung-kinsta-ssh\/\">dich per SSH mit deiner Website verbunden hast<\/a>, wechsle mit den folgenden Befehlen in das Stammverzeichnis der Website, in dem sich deine <a href=\"https:\/\/kinsta.com\/de\/blog\/wp-config-php\/\">Datei <code>wp-config.php<\/code><\/a> befindet:<\/p>\n<pre><code class=\"language-bash\">cd \/path\/to\/your\/site\nls wp-config.php<\/code><\/pre>\n<p>Stelle anschlie\u00dfend sicher, dass WP-CLI deine Website-Installation erkennt:<\/p>\n<pre><code class=\"language-bash\">wp core is-installed\nwp option get siteurl<\/code><\/pre>\n<p>Wenn du die URL deiner Website erh\u00e4ltst, kannst du loslegen und den folgenden Befehl ausf\u00fchren:<\/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>Dieser Befehl f\u00fchrt <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/eval\/\" target=\"_blank\" rel=\"noopener noreferrer\">PHP-Code in deinem Terminal<\/a> aus. Das PHP-Skript fragt die Namen aller registrierten F\u00e4higkeiten auf deiner Website ab und sollte standardm\u00e4\u00dfig die folgende Antwort liefern:<\/p>\n<pre><code class=\"language-bash\">core\/get-site-info\ncore\/get-user-info\ncore\/get-environment-info<\/code><\/pre>\n<p>Mit dem folgenden Befehl kannst du einen umfassenderen Datensatz abfragen:<\/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>Wenn du diesen Befehl auf einer neuen <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-7-0\/\">WordPress-7.0<\/a> -Website ausf\u00fchrst, zeigt das Terminal die folgende Antwort an:<\/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>Ein \u201eF\u00e4higkeits\u201c-Objekt abrufen<\/h4>\n<p>Die <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">Funktion <code>wp_get_ability()<\/code><\/a> gibt ein einzelnes F\u00e4higkeit-Objekt anhand seines Namens zur\u00fcck. Du kannst das in WP-CLI mit folgendem Befehl testen:<\/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>Wenn die F\u00e4higkeit auf deiner Website korrekt registriert ist, erh\u00e4ltst du im Terminal folgende Antwort:<\/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>Pr\u00fcfen, ob eine F\u00e4higkeit registriert ist<\/h4>\n<p>Mit <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_has_ability\/\">der Funktion\u00a0<code>wp_has_ability()<\/code><\/a>\u00a0kannst du pr\u00fcfen, ob eine F\u00e4higkeit registriert ist. In WP-CLI kannst du sie wie folgt verwenden:<\/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>Wenn die Funktion registriert ist, erscheint folgende Meldung im Terminal:<\/p>\n<pre><code class=\"language-bash\">\u2713 core\/get-site-info is registered<\/code><\/pre>\n<h4>Agentenberechtigungen pr\u00fcfen<\/h4>\n<p>Du kannst \u00fcberpr\u00fcfen, ob der aktuelle Benutzer die Berechtigungen zum Ausf\u00fchren einer F\u00e4higkeit hat, indem du die <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ability\/check_permissions\/\" target=\"_blank\" rel=\"noopener noreferrer\">Methode <code>check_permissions()<\/code><\/a> des Objekts <code>$ability<\/code> verwendest. Diese gibt \u201etrue\u201c, \u201efalse\u201c oder ein <code>WP_Error<\/code>-Objekt zur\u00fcck. Versuchen wir, diese Methode \u00fcber das Terminal mit dem folgenden WP-CLI-Befehl aufzurufen:<\/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 haben wir <code>--user=1<\/code> festgelegt, weshalb du die folgende Antwort erh\u00e4ltst:<\/p>\n<pre><code class=\"language-bash\">You have permissions to execute this ability.<\/code><\/pre>\n<h3>Eine F\u00e4higkeit registrieren<\/h3>\n<p>Jetzt ist es an der Zeit, eine F\u00e4higkeit zu registrieren. Um einen Anwendungsfall aus der Praxis zu veranschaulichen, werden wir das in <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-ki\/\">unserem Artikel \u00fcber den WordPress-AI-Client<\/a> beschriebene Plugin erweitern. Das Plugin sendet eine Audiodatei an das KI-Modell, um den Text zu extrahieren und die Erstellung von Gutenberg-Bl\u00f6cken auszul\u00f6sen. In diesem Abschnitt schauen wir uns an, wie man diesen Prozess als F\u00e4higkeit registriert, damit jede Entit\u00e4t mit den erforderlichen Berechtigungen ihn finden und nutzen kann.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>In den folgenden Beispielen zeigen wir nur den wesentlichen Code. Um selbst mit dem in diesem Abschnitt bereitgestellten Code zu experimentieren, empfehlen wir dir, das <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\" target=\"_blank\" rel=\"noopener noreferrer\">\u201eAI Content Builder Next\u201c-Plugin<\/a> von GitHub herunterzuladen und es manuell auf einer lokalen oder Staging-WordPress-Website zu installieren.<\/p>\n<\/aside>\n\n<p>Bevor du eine neue F\u00e4higkeit registrierst, musst du eine neue F\u00e4higkeitskategorie registrieren.<\/p>\n<p>Dazu musst du die <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability_category\/\" target=\"_blank\" rel=\"noopener noreferrer\">Funktion <code>wp_register_ability_category()<\/code><\/a> in den Hook <code>wp_abilities_api_categories_init<\/code> einbinden.<\/p>\n<p>Die Funktion akzeptiert einen eindeutigen Kategorie-Slug und ein assoziatives Array mit Argumenten.<\/p>\n<p>So registrierst du deine Funktionskategorie:<\/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>Der n\u00e4chste Schritt ist die Registrierung der Funktion. Dazu bindest du die <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">Funktion <code>wp_register_ability()<\/code><\/a> in die Aktion <code>wp_abilities_api_init<\/code> ein.<\/p>\n<p>Die Funktion akzeptiert zwei Argumente: den Namen der Funktion einschlie\u00dflich ihres Namensraums und ein Array mit Argumenten f\u00fcr die Konfiguration der Funktion.<\/p>\n<p>So sieht die Funktionsregistrierung f\u00fcr das <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder-Plugin<\/a> aus:<\/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>Im Aufruf der Funktion <code>wp_register_ability<\/code> haben wir die folgenden Argumente konfiguriert:<\/p>\n<ul>\n<li><code>category<\/code>: Die Kategorie, zu der die Funktion geh\u00f6rt.<\/li>\n<li><code>label<\/code>: Der Anzeigename der Funktion.<\/li>\n<li><code>description<\/code>: Eine kurze Beschreibung der Funktion der F\u00e4higkeit und ihres Zwecks.<\/li>\n<li><code>input_schema<\/code>: Das Datenschema f\u00fcr die eingehenden Eingabeargumente.<\/li>\n<li><code>output_schema<\/code>: Das Datenschema, das von der Funktion bereitgestellt und zur\u00fcckgegeben wird.<\/li>\n<li><code>execute_callback<\/code>: Die Callback-Funktion, die ausgef\u00fchrt wird, wenn die F\u00e4higkeit ausgel\u00f6st wird.<\/li>\n<li><code>permission_callback<\/code>: Eine Callback-Funktion, die ausgef\u00fchrt wird, um zu \u00fcberpr\u00fcfen, ob der Agent \u00fcber die erforderlichen Berechtigungen zum Ausf\u00fchren der Funktion verf\u00fcgt.<\/li>\n<li><code>meta<\/code>: Ein Array mit zus\u00e4tzlichen Metadatenfeldern f\u00fcr die Funktion.<\/li>\n<li><code>show_in_rest<\/code>: Legt fest, ob die Funktion innerhalb der WordPress-REST-API verf\u00fcgbar sein soll oder nicht.<\/li>\n<li><code>annotations<\/code>: Ein Array mit beschreibenden Elementen, die das Verhalten der Funktion definieren.<\/li>\n<\/ul>\n<p><code>input_schema<\/code> ist ein Array, das den Eingabekontrakt der Funktion definiert. Es stellt die JSON-Schema-Definition zur Validierung der Eingabe der Funktion dar. In unserem konkreten Anwendungsfall ist es wie folgt definiert:<\/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>Dieses JSON-Schema gibt das Format vor, dem die Eingabedaten entsprechen m\u00fcssen, um diese Funktion nutzen zu k\u00f6nnen.<br \/>\n<code>output_schema<\/code> ist der von der Funktion zur\u00fcckgegebene Ausgabekontrakt. In unserem Beispiel ist jedes Element ein Objekt, das einen JSON-Block darstellt:<\/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>Der n\u00e4chste Schritt ist die Definition der Callback-Funktion, die ausgef\u00fchrt wird, wenn die F\u00e4higkeit ausgel\u00f6st wird (den <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php#L483\">vollst\u00e4ndigen Code findest du auf 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>Diese Funktion ruft zwei benutzerdefinierte Funktionen auf. Die erste (<code>aicb_normalize_structured_post<\/code>) normalisiert die Ausgabe der KI in ein vordefiniertes Format und bereinigt die Daten:<\/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>Die Funktion nimmt ein strukturiertes Array aus JSON-Objekten entgegen, normalisiert und bereinigt die Daten und gibt ein Array zur\u00fcck, das den Titel und die Abschnitte enth\u00e4lt.<\/p>\n<p>Die zweite Funktion (<code>aicb_sections_to_blocks<\/code>) wandelt die normalisierten Daten in Block-Deskriptor-Objekte um und ist wie folgt definiert:<\/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>Hier sind die wichtigsten Merkmale dieser Funktion:<\/p>\n<ul>\n<li>Die Funktion nimmt zwei Argumente entgegen: eine Zeichenkette, die den Titel des Beitrags darstellt, und ein Array mit den vom KI-Modell generierten Abschnitten.<\/li>\n<li>F\u00fcr jeden Abschnitt generiert die Funktion eine \u00dcberschrift und mindestens einen Absatz.<\/li>\n<li>Wenn Aufz\u00e4hlungspunkte vorhanden sind, generiert sie eine entsprechende Anzahl von Listenelementen.<\/li>\n<li>Die Funktion gibt ein Array <code>$blocks<\/code> mit Blockdeskriptor-Objekten zur\u00fcck, das dem vom \u201eAbility\u201c-Objekt (<code>$output_schema<\/code>) zur\u00fcckgegebenen Output-Contract entspricht.<\/li>\n<\/ul>\n<p>Beachte, dass die Ausgabe der Funktion nicht das rohe Block-Markup ist. Dieses wird clientseitig mithilfe der JavaScript-Funktion <code>createBlock<\/code> generiert.<\/p>\n<p>Das \u00dcberschriftenelement eines Abschnitts wird beispielsweise durch das folgende Objekt dargestellt:<\/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>Sobald du Ihre F\u00e4higkeit registriert hast, kannst du die oben gezeigten WP-CLI-Befehle in deinem Terminal ausf\u00fchren, um die Details abzurufen. Der folgende Code generiert das Eingabeschema f\u00fcr deine F\u00e4higkeit:<\/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>Hier ist das Ergebnis im 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>Auf die gleiche Weise kannst du das Ausgabeschema der F\u00e4higkeit abrufen:<\/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>Du kannst das vollst\u00e4ndige Objekt deiner F\u00e4higkeit auch mit dem folgenden Befehl anzeigen:<\/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>Eine F\u00e4higkeit ausf\u00fchren<\/h3>\n<p>Um eine Funktion auszuf\u00fchren, verwendest du die Methode <code>execute()<\/code>des Objekts <code>$ability<\/code>. Du kannst versuchen, den folgenden PHP-Code \u00fcber WP-CLI auszuf\u00fchren, um die Funktion <code>core\/get-site-info<\/code> auszul\u00f6sen:<\/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>Wenn du diesen Befehl ausf\u00fchrst, liefert die Funktion ein JSON-Objekt, das in etwa so aussieht:<\/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>Das oben Genannte ist nur ein einfaches Beispiel f\u00fcr eine Funktion, die Daten f\u00fcr deine Website bereitstellt.<\/p>\n<p>Wie oben erw\u00e4hnt, kann eine Funktion Eingabedaten ben\u00f6tigen, Operationen an diesen Daten durchf\u00fchren und eine strukturierte Ausgabe zur\u00fcckgeben. Ein Beispiel daf\u00fcr sehen wir bei der Funktion, die wir im vorherigen Abschnitt registriert haben.<\/p>\n<p>Navigiere im Terminal zum Stammverzeichnis deiner Website und f\u00fchre den folgenden PHP-Code aus:<\/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>Die Methode <code>execute<\/code> \u00fcbergibt die strukturierten Eingabedaten an die Funktion, die ein Array von Objekten zur\u00fcckgibt, die bereit sind, in Gutenberg-Bl\u00f6cke umgewandelt zu werden:<\/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-Integration<\/h2>\n<p>Die WordPress-Abilities-API bietet eine einheitliche Routing-Struktur, die es externen Akteuren erm\u00f6glicht, verf\u00fcgbare Ability-Kategorien programmgesteuert abzufragen (<code>\/categories<\/code>), bestimmte Ability-Vertr\u00e4ge zu \u00fcberpr\u00fcfen (<code>\/abilities\/{name}<\/code>) und eine bestimmte Ability \u00fcber den Standard-Run-Endpunkt auszuf\u00fchren (<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 Anfragen an die WordPress-REST-API erfordern eine Authentifizierung. F\u00fcr externe Skripte oder Tools von Drittanbietern wie Postman verwende <a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/security\/application-passwords\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress-Anwendungspassw\u00f6rter<\/a>.<\/p>\n<\/aside>\n\n<p>Hier ist zum Beispiel eine GET-Anfrage, die die Liste der Kategorien von unserer Testseite zur\u00fcckgibt:<\/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=\"GET-Anfrage f\u00fcr F\u00e4higkeitskategorien in Postman\" width=\"1372\" height=\"496\"><figcaption id=\"caption-attachment-212438\" class=\"wp-caption-text\">Alle Anfragen m\u00fcssen autorisiert werden<\/figcaption><\/figure>\n<p>Als wir die Funktion im vorherigen Beispiel registriert haben, haben wir den Parameter <code>show_in_rest<\/code> auf <code>true<\/code> gesetzt. Dadurch haben wir unsere Funktion automatisch \u00fcber diese nativen WordPress-REST-API-Endpunkte unter dem zentralen Core-Namespace (<code>wp-abilities\/v1<\/code>) zug\u00e4nglich gemacht.<\/p>\n<p>Das bedeutet, dass du benutzerdefinierte Routen nicht manuell von Grund auf neu registrieren musst, um eine Funktion aus einer externen Umgebung aufzurufen. Externe Agenten k\u00f6nnen deine Funktion mithilfe von Standard-HTTP-Anfragen erkennen und ausf\u00fchren.<\/p>\n<p>Du kannst den spezifischen Vertrag unserer Funktion mit der folgenden GET-Anfrage einsehen:<\/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>Schlie\u00dflich kannst du die Funktion mit einer authentifizierten POST-Anfrage ausl\u00f6sen:<\/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>Achte beim Senden dieser Art von Anfrage darauf, dass du die Eingabedaten angegeben hast. In unserem Beispiel haben wir den folgenden JSON-Text im Anfragetext festgelegt:<\/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=\"Ausf\u00fchren einer Funktion \u00fcber eine HTTP-Anfrage in Postman\" width=\"1378\" height=\"1286\"><figcaption id=\"caption-attachment-212446\" class=\"wp-caption-text\">Ausf\u00fchren einer Funktion \u00fcber eine HTTP-Anfrage in Postman<\/figcaption><\/figure>\n<p>Unsere Funktion hat das Audiomaterial verarbeitet und an das auf der Website konfigurierte KI-Modell weitergeleitet. Das Modell gab eine strukturierte Ausgabe zur\u00fcck, die anschlie\u00dfend normalisiert und bereinigt wurde, woraufhin schlie\u00dflich das folgende Array von Objekten mit den Block-Attributen zur\u00fcckgegeben wurde:<\/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>Und genau das ist das Ergebnis, das wir angestrebt haben.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Seit der Ver\u00f6ffentlichung von WordPress 7.0 ist die Abilities-API dank der Implementierung der Client-Side Abilities-API nun auch \u00fcber JavaScript verf\u00fcgbar. Entwickler k\u00f6nnen die beiden Pakete <code>@wordpress\/abilities<\/code> und <code>@wordpress\/core-abilities<\/code> nutzen, um Abilities \u2013 komplett mit ihren Eingabe- und Ausgabeschemata, Callbacks und Annotationen \u2013 zu registrieren und so clientseitige Funktionen zu implementieren. Eine ausf\u00fchrliche Analyse findest du im Entwicklerhinweis <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/client-side-abilities-api-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">zur Client-Side Abilities API<\/a> und in der <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/javascript-client.md\" target=\"_blank\" rel=\"noopener noreferrer\">JavaScript-Client-Dokumentation<\/a>.<\/p>\n<\/aside>\n\n<h2>Die Zukunft von WordPress ist agentisch<\/h2>\n<p>W\u00e4hrend der <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-ki\/\">AI Client und die neue Connector-Architektur<\/a> KI-Verarbeitungsfunktionen in WordPress integrieren, definiert die Abilities-API neu, wie WordPress mit der Au\u00dfenwelt interagiert. Wir erleben gerade einen drastischen Paradigmenwechsel: weg von einer traditionellen Webarchitektur \u2013 basierend auf manueller Benutzerinteraktion, bei der jede Integration benutzerdefinierte Endpunkte und manuelles Mapping erforderte \u2013 hin zu einer absichtsgesteuerten Architektur, die von Grund auf f\u00fcr die Automatisierung konzipiert wurde.<\/p>\n<p>F\u00fcr WordPress-Entwickler stellt die neue Abilities-API einen architektonischen Wendepunkt dar, der sich durch die Entkopplung von Funktionen von den Plugins, die deren Logik enthalten, die Durchsetzung von Sicherheit durch den Input\/Output-Vertrag und die Erm\u00f6glichung nativer Interoperabilit\u00e4t im gesamten \u00d6kosystem auszeichnet.<\/p>\n<p>Zusammengenommen sorgen diese Funktionen daf\u00fcr, dass die Abilities-API nicht nur eine weitere API ist, sondern eine echte verteilte Ausf\u00fchrungs-Engine, die einen Einblick in eine zunehmend agentenbasierte Zukunft f\u00fcr WordPress bietet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die in WordPress 6.9 eingef\u00fchrte Abilities-API schafft eine gemeinsame Sprache, die es allen WordPress-Komponenten \u2013 sowohl dem Kern als auch den Plugins \u2013 erm\u00f6glicht, ihre Funktionen &#8230;<\/p>\n","protected":false},"author":36,"featured_media":76972,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[925,999],"class_list":["post-76971","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","topic-wordpress-entwicklung"],"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>Erste Schritte mit der WordPress-Abilities-API<\/title>\n<meta name=\"description\" content=\"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.\" \/>\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\/de\/blog\/wordpress-abilities-api\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden\" \/>\n<meta property=\"og:description\" content=\"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T06:10:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-05T11:52:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/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=\"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide-1024x512.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden\",\"datePublished\":\"2026-07-30T06:10:36+00:00\",\"dateModified\":\"2026-08-05T11:52:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/\"},\"wordCount\":2381,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/\",\"name\":\"Erste Schritte mit der WordPress-Abilities-API\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"datePublished\":\"2026-07-30T06:10:36+00:00\",\"dateModified\":\"2026-08-05T11:52:29+00:00\",\"description\":\"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Erste Schritte mit der WordPress-Abilities-API","description":"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.","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\/de\/blog\/wordpress-abilities-api\/","og_locale":"de_DE","og_type":"article","og_title":"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden","og_description":"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.","og_url":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2026-07-30T06:10:36+00:00","article_modified_time":"2026-08-05T11:52:29+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/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":"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide-1024x512.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Carlo Daniele","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden","datePublished":"2026-07-30T06:10:36+00:00","dateModified":"2026-08-05T11:52:29+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/"},"wordCount":2381,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/","url":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/","name":"Erste Schritte mit der WordPress-Abilities-API","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","datePublished":"2026-07-30T06:10:36+00:00","dateModified":"2026-08-05T11:52:29+00:00","description":"Erfahre, wie du mit der WordPress Abilities API die Funktionen deines Plugins in sichere, vertragsbasierte Dienste umwandeln kannst, die f\u00fcr die KI-Automatisierung bereit sind.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-abilities-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/de\/thema\/api\/"},{"@type":"ListItem","position":3,"name":"Erste Schritte mit der WordPress-Abilities-API: Ein praktischer Leitfaden"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/76971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=76971"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/76971\/revisions"}],"predecessor-version":[{"id":77055,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/76971\/revisions\/77055"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/translations\/es"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/76971\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/76972"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=76971"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=76971"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=76971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}