[wp-trac] [WordPress Trac] #64098: Introduce Abilities API
WordPress Trac
noreply at wordpress.org
Tue Oct 28 10:20:17 UTC 2025
#64098: Introduce Abilities API
-------------------------------------------------+-------------------------
Reporter: gziolo | Owner: gziolo
Type: feature request | Status: closed
Priority: normal | Milestone: 6.9
Component: AI | Version: trunk
Severity: normal | Resolution: fixed
Keywords: has-patch has-unit-tests needs-dev- | Focuses:
note needs-docs |
-------------------------------------------------+-------------------------
Description changed by SergeyBiryukov:
Old description:
> Part of [https://make.wordpress.org/ai/2025/07/17/ai-building-blocks/ AI
> Building Blocks for WordPress ].
>
> > The Abilities API transforms WordPress from a collection of isolated
> functions into a unified, discoverable system. By creating a central
> registry of capabilities, it allows AI agents, automation tools, and
> developers to understand and interact with everything WordPress can do –
> from CLI commands and REST API endpoints to custom logic and plugin
> functions.
>
> Full proposal at https://make.wordpress.org/ai/2025/07/17/abilities-api/.
> Handbook page at https://make.wordpress.org/ai/handbook/projects
> /abilities-api/.
> Documentation in https://github.com/WordPress/abilities-
> api/tree/trunk/docs.
> Developed in https://github.com/WordPress/abilities-api.
> Composer package: https://packagist.org/packages/wordpress/abilities-api.
>
> Introduces a new Abilities API that allows WordPress plugins and themes
> to register and execute custom abilities with built-in permission
> checking, input/output validation via JSON Schema, and REST API
> integration.
>
> == Public Functions
>
> === Ability Management
> - `wp_register_ability( string $name, array $args ): ?WP_Ability` -
> Registers a new ability (must be called on `wp_abilities_api_init` hook)
> - `wp_unregister_ability( string $name ): ?WP_Ability` - Unregisters an
> ability
> - `wp_has_ability( string $name ): bool` - Checks if an ability is
> registered
> - `wp_get_ability( string $name ): ?WP_Ability` - Retrieves a registered
> ability
> - `wp_get_abilities(): array` - Retrieves all registered abilities
>
> === Ability Category Management
> - `wp_register_ability_category( string $slug, array $args ):
> ?WP_Ability_Category` - Registers an ability category (must be called on
> `wp_abilities_api_categories_init` hook)
> - `wp_unregister_ability_category( string $slug ): ?WP_Ability_Category`
> - Unregisters an ability category
> - `wp_has_ability_category( string $slug ): bool` - Checks if an ability
> category is registered
> - `wp_get_ability_category( string $slug ): ?WP_Ability_Category` -
> Retrieves a registered ability category
> - `wp_get_ability_categories(): array` - Retrieves all registered ability
> categories
>
> == Public Classes
>
> - `WP_Ability` - Encapsulates ability properties and methods (execute,
> check_permission, validate_input, etc.)
> - `WP_Ability_Category` - Encapsulates ability category properties
> - `WP_Abilities_Registry` - Manages ability registration and lookup
> (private, accessed via functions)
> - `WP_Ability_Categories_Registry` - Manages ability category
> registration (private, accessed via functions)
> - `WP_REST_Abilities_V1_Categories_Controller` - REST controller for
> listing category abilities
> - `WP_REST_Abilities_V1_List_Controller` - REST controller for listing
> abilities
> - `WP_REST_Abilities_V1_Run_Controller` - REST controller for executing
> abilities
>
> == REST API Endpoints
>
> === Namespace: `wp-abilities/v1`
>
> ==== List Category Abilities
> - `GET /wp-abilities/v1/categories` - Retrieve all registered ability
> categories
> - Query parameters: `page`, `per_page`
>
> ==== Get Single Category Ability
> - `GET /wp-abilities/v1/categories/(?P<slug>[a-z0-9]+(?:-[a-z0-9]+)*)` -
> Retrieve a specific ability category by name
>
> ==== List Abilities
> - `GET /wp-abilities/v1/abilities` - Retrieve all registered abilities
> - Query parameters: `page`, `per_page`, `category`
>
> ==== Get Single Ability
> - `GET /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+)` - Retrieve
> a specific ability by name
>
> ==== Execute Ability
> - `GET|POST|DELETE /wp-
> abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+)/run` - Execute an
> ability
> - Supports multiple HTTP methods based on ability annotations
> - Validates input against ability's input schema
> - Validates output against ability's output schema
> - Performs permission checks via ability's permission callback
>
> == Hooks
>
> === Actions
> - `wp_abilities_api_categories_init` - Fired when ability categories
> registry is initialized (register categories here)
> - `wp_abilities_api_init` - Fired when abilities registry is initialized
> (register abilities here)
> - `wp_before_execute_ability` - Fired before an ability gets executed,
> after input validation and permissions check
>
> - `wp_after_execute_ability` - Fires immediately after an ability
> finished executing
>
> === Filters
> - `wp_register_ability_category_args` - Filters ability category
> arguments before registration
> - `wp_register_ability_args` - Filters ability arguments before
> registration
New description:
Part of [https://make.wordpress.org/ai/2025/07/17/ai-building-blocks/ AI
Building Blocks for WordPress ].
> The Abilities API transforms WordPress from a collection of isolated
functions into a unified, discoverable system. By creating a central
registry of capabilities, it allows AI agents, automation tools, and
developers to understand and interact with everything WordPress can do –
from CLI commands and REST API endpoints to custom logic and plugin
functions.
Full proposal at https://make.wordpress.org/ai/2025/07/17/abilities-api/.
Handbook page at https://make.wordpress.org/ai/handbook/projects
/abilities-api/.
Documentation in https://github.com/WordPress/abilities-
api/tree/trunk/docs.
Developed in https://github.com/WordPress/abilities-api.
Composer package: https://packagist.org/packages/wordpress/abilities-api.
Introduces a new Abilities API that allows WordPress plugins and themes to
register and execute custom abilities with built-in permission checking,
input/output validation via JSON Schema, and REST API integration.
== Public Functions
=== Ability Management
- `wp_register_ability( string $name, array $args ): ?WP_Ability` -
Registers a new ability (must be called on `wp_abilities_api_init` hook)
- `wp_unregister_ability( string $name ): ?WP_Ability` - Unregisters an
ability
- `wp_has_ability( string $name ): bool` - Checks if an ability is
registered
- `wp_get_ability( string $name ): ?WP_Ability` - Retrieves a registered
ability
- `wp_get_abilities(): array` - Retrieves all registered abilities
=== Ability Category Management
- `wp_register_ability_category( string $slug, array $args ):
?WP_Ability_Category` - Registers an ability category (must be called on
`wp_abilities_api_categories_init` hook)
- `wp_unregister_ability_category( string $slug ): ?WP_Ability_Category` -
Unregisters an ability category
- `wp_has_ability_category( string $slug ): bool` - Checks if an ability
category is registered
- `wp_get_ability_category( string $slug ): ?WP_Ability_Category` -
Retrieves a registered ability category
- `wp_get_ability_categories(): array` - Retrieves all registered ability
categories
== Public Classes
- `WP_Ability` - Encapsulates ability properties and methods (execute,
check_permission, validate_input, etc.)
- `WP_Ability_Category` - Encapsulates ability category properties
- `WP_Abilities_Registry` - Manages ability registration and lookup
(private, accessed via functions)
- `WP_Ability_Categories_Registry` - Manages ability category registration
(private, accessed via functions)
- `WP_REST_Abilities_V1_Categories_Controller` - REST controller for
listing category abilities
- `WP_REST_Abilities_V1_List_Controller` - REST controller for listing
abilities
- `WP_REST_Abilities_V1_Run_Controller` - REST controller for executing
abilities
== REST API Endpoints
=== Namespace: `wp-abilities/v1`
==== List Ability Categories
- `GET /wp-abilities/v1/categories` - Retrieve all registered ability
categories
- Query parameters: `page`, `per_page`
==== Get Single Ability Category
- `GET /wp-abilities/v1/categories/(?P<slug>[a-z0-9]+(?:-[a-z0-9]+)*)` -
Retrieve a specific ability category by name
==== List Abilities
- `GET /wp-abilities/v1/abilities` - Retrieve all registered abilities
- Query parameters: `page`, `per_page`, `category`
==== Get Single Ability
- `GET /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+)` - Retrieve a
specific ability by name
==== Execute Ability
- `GET|POST|DELETE /wp-
abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+)/run` - Execute an
ability
- Supports multiple HTTP methods based on ability annotations
- Validates input against ability's input schema
- Validates output against ability's output schema
- Performs permission checks via ability's permission callback
== Hooks
=== Actions
- `wp_abilities_api_categories_init` - Fired when ability categories
registry is initialized (register categories here)
- `wp_abilities_api_init` - Fired when abilities registry is initialized
(register abilities here)
- `wp_before_execute_ability` - Fired before an ability gets executed,
after input validation and permissions check
- `wp_after_execute_ability` - Fires immediately after an ability finished
executing
=== Filters
- `wp_register_ability_category_args` - Filters ability category arguments
before registration
- `wp_register_ability_args` - Filters ability arguments before
registration
--
--
Ticket URL: <https://core.trac.wordpress.org/ticket/64098#comment:57>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list