Abilities API, появившийся в WordPress 6.9, задает общий язык, позволяющий всем компонентам WordPress — как ядру, так и плагинам — предлагать свою функциональность единым, понятным способом как для людей, так и для машин. Благодаря этому API ваш WordPress-сайт становится готовым к интеграции с внешними инструментами автоматизации стандартизированным и безопасным путем.
Если вам интересно, как могут выглядеть некоторые варианты использования Abilities API, представьте себе ИИ-модель, которая помогает пользователю выбрать товар и совершить покупку — и при этом юзеру даже не нужно посещать ваш интернет-магазин. Или представьте себе конвейер CI/CD в GitHub Actions, который обрабатывает текст, извлеченный из аудио- или видеофайла, и отправляет его в WordPress для публикации.
Abilities API меняет саму роль WordPressв экосистеме. Это уже не просто блог и даже не CMS; сегодня WordPress выступает в качестве распределенного движка выполнения, которым можно управлять извне, подобно операционной системе, полностью готовой к работе с автономными агентами.
Хотите узнать больше? Давайте начнем.
Для чего предназначена та или иная способность (ability)
Способность — это обнаруживаемая, прикладная функция на сайте WordPress, которая позволяет внешним объектам (таким как модели ИИ) или внутренним компонентам выполнять определенные операции.
API можно использовать для таких задач, как:
- Поиск контента или выполнение некоторых операций с БД.
- Чтение настроек конфигурации сайта.
- Создание поста.
- Преобразование структуры JSON в блоки Gutenberg.
Предоставление способности означает обеспечение совместимости для определенной функциональности. Прежде чем способность можно будет обнаружить и использовать, она должна быть зарегистрирована в централизованном каталоге. Только после этого WordPress и ИИ-модели смогут обнаружить ее, понять ее назначение и вызвать при необходимости.
Необходимо внести одно уточнение: ИИ-модель никогда не имеет прямого доступа к вашему сайту. Она может лишь запросить у WordPress выполнение операции (например, «выведи общее количество записей на сайте»), требуемой для решения своей задачи.
По умолчанию функциональность ваших плагинов полностью изолирована. Зарегистрировав способность, вы заявляете, что базовая логика доступна в качестве сервиса для всей экосистемы.
Рассмотрим пример. Если ваш плагин содержит функцию, которая преобразует исходный JSON-объект в структурированный контент, готовый для блоков Gutenberg, вы можете зарегистрировать её как способность. Это позволит другим инструментам с необходимыми правами доступа запускать ту же самую функцию.
Способность служит формальным контрактом между базовой логикой PHP и любым объектом, запрашивающим её выполнение. Контракт определяет данные, которые способность ожидает в качестве ввода, намерение, а также схему, возвращаемую в качестве вывода.
При регистрации способности она добавляется в реестр способностей вашего сайта. С этого момента WordPress выступает в качестве защищенного шлюза: он проверяет аутентификацию и сверяет входные данные со схемой, установленной контрактом. WordPress направляет запрос к требуемой PHP-функции только в том случае, если пейлоад строго соответствует контракту.
Способность является агностичной; WordPress не нужно знать, кто именно запрашивает доступ; он лишь проверяет, что запрос авторизован и соответствует ограничениям контракта.
Зарегистрировав способность, ваш плагин перестаёт быть просто расширением со своей внутренней логикой; он становится провайдером услуг для всей экосистемы. Будь то мобильное приложение, скрипт автоматизации, такой как Make.com или Zapier, ИИ-агент или сервер, взаимодействующий по протоколу MCP, эти сущности будут точно знать, как инициировать структурированные операции на вашем сайте.
Работа с Abilities API
Abilities API обеспечивает полный набор функций, позволяющих обнаруживать зарегистрированные способности на вашем сайте, активировать, регистрировать и дерегистрировать их.
Работаем со способностями сайта
Вы можете получить список всех зарегистрированных способностей или получить объект отдельной способности. Вы также можете проверить условия, например, зарегистрирована ли конкретная способность, имеет ли агент разрешения на ее активацию.
Получаем список способностей, зарегистрированных на сайте
Функция wp_get_abilities() возвращает массив всех зарегистрированных способностей. Вы можете протестировать её с помощью WP-CLI. После подключения к вашему сайту через SSH перейдите в корневой каталог сайта, где находится файл wp-config.php, используя следующие команды:
cd /path/to/your/site ls wp-config.php
Далее убедитесь, что WP-CLI распознает вашу установку:
wp core is-installed wp option get siteurl
Получив URL-адрес своего сайта, вы можете выполнить следующую команду:
wp eval '$abilities = wp_get_abilities(); foreach ( $abilities as $a ) { echo $a->get_name() . PHP_EOL; }'
Эта команда выполняет PHP-код в вашем терминале. PHP запрашивает имена всех зарегистрированных способностей на вашем сайте и по умолчанию должен предоставить следующий ответ:
core/get-site-info core/get-user-info core/get-environment-info
Более полный набор данных можно запросить с помощью следующей команды:
wp eval '
$all_abilities = wp_get_abilities();
foreach ( $all_abilities as $ability ) {
echo "Ability Name: " . esc_html( $ability->get_name() ) . "\n";
echo "Label: " . esc_html( $ability->get_label() ) . "\n";
echo "Category: " . esc_html( $ability->get_category() ) . "\n";
echo "Description: " . esc_html( $ability->get_description() ) . "\n";
echo "---\n";
}
'
При выполнении этой команды на новом сайте WordPress 7.0 в терминале отобразится следующий ответ:
Ability Name: core/get-site-info Label: Get Site Information Category: site Description: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset. --- Ability Name: core/get-user-info Label: Get User Information Category: user Description: 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. --- Ability Name: core/get-environment-info Label: Get Environment Info Category: site Description: 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. ---
Получаем объект способности
Функция wp_get_ability() возвращает один объект способности по ее имени. Вы можете протестировать её в WP-CLI с помощью следующей команды:
wp eval '
$ability = wp_get_ability( "core/get-site-info" );
if ( ! $ability ) {
echo "Ability not found\n";
exit( 1 );
}
echo "Name: " . $ability->get_name() . "\n";
echo "Label: " . $ability->get_label() . "\n";
echo "Category: " . $ability->get_category() . "\n";
echo "Description: " . $ability->get_description() . "\n";
echo "\nInput Schema:\n";
var_dump( $ability->get_input_schema() );
echo "\nOutput Schema:\n";
var_dump( $ability->get_output_schema() );
echo "\nMeta:\n";
var_dump( $ability->get_meta() );
'
Если эта способность корректно зарегистрирована на вашем сайте, вы получите следующий ответ в своем терминале:
Name: core/get-site-info
Label: Get Site Information
Category: site
Description: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.
Input Schema:
array(4) {
["type"]=>
string(6) "object"
["properties"]=>
array(1) {
["fields"]=>
array(3) {
["type"]=>
string(5) "array"
["items"]=>
array(2) {
["type"]=>
string(6) "string"
["enum"]=>
array(8) {
[0]=>
string(4) "name"
[1]=>
string(11) "description"
[2]=>
string(3) "url"
[3]=>
string(5) "wpurl"
[4]=>
string(11) "admin_email"
[5]=>
string(7) "charset"
[6]=>
string(8) "language"
[7]=>
string(7) "version"
}
}
["description"]=>
string(81) "Optional: Limit response to specific fields. If omitted, all fields are returned."
}
}
["additionalProperties"]=>
bool(false)
["default"]=>
array(0) {
}
}
Output Schema:
array(3) {
["type"]=>
string(6) "object"
["properties"]=>
array(8) {
["name"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(10) "Site Title"
["description"]=>
string(15) "The site title."
}
["description"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(7) "Tagline"
["description"]=>
string(17) "The site tagline."
}
["url"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(18) "Site Address (URL)"
["description"]=>
string(94) "The public URL where visitors access the site. May differ from the WordPress installation URL."
}
["wpurl"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(23) "WordPress Address (URL)"
["description"]=>
string(83) "The URL where WordPress core files are served. May differ from the public site URL."
}
["admin_email"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(28) "Administration Email Address"
["description"]=>
string(37) "The site administrator email address."
}
["charset"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(12) "Site Charset"
["description"]=>
string(28) "The site character encoding."
}
["language"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(13) "Site Language"
["description"]=>
string(42) "The site locale in dash form (e.g. en-US)."
}
["version"]=>
array(3) {
["type"]=>
string(6) "string"
["title"]=>
string(17) "WordPress Version"
["description"]=>
string(48) "The WordPress core version running on this site."
}
}
["additionalProperties"]=>
bool(false)
}
Meta:
array(2) {
["annotations"]=>
array(3) {
["readonly"]=>
bool(true)
["destructive"]=>
bool(false)
["idempotent"]=>
bool(true)
}
["show_in_rest"]=>
bool(true)
}
Проверяем, зарегистрирована ли данная способность
Функция wp_has_ability() позволяет проверить, зарегистрирована ли способность. В WP-CLI её можно использовать следующим образом:
wp eval '
if ( wp_has_ability( "core/get-site-info" ) ) {
echo "✓ core/get-site-info is registered\n";
} else {
echo "✗ core/get-site-info not found\n";
}
'
Если способность зарегистрирована, в терминале появится следующее сообщение:
✓ core/get-site-info is registered
Проверяем права доступа агента
Проверить наличие у текущего пользователя разрешений на выполнение способности можно с помощью метода check_permissions() объекта $ability. Этот метод возвращает true, false или объект WP_Error. Давайте попробуем вызвать этот метод из терминала, используя следующую команду WP-CLI:
wp --user=1 eval '
$ability = wp_get_ability( "core/get-site-info" );
if ( $ability ) {
$has_permissions = $ability->check_permissions();
if ( true === $has_permissions ) {
echo "You have permissions to execute this ability.";
} else {
if ( is_wp_error( $has_permissions ) ) {
error_log( "Permissions check failed: " . $has_permissions->get_error_message() );
}
echo "You do not have permissions to execute this ability.";
}
} else {
echo "Ability not found.";
}
'
Здесь мы установили параметр —user=1, поэтому вы получите следующий ответ:
You have permissions to execute this ability.
Регистрация способности
Теперь пришло время зарегистрировать способность. Чтобы продемонстрировать реальный пример использования, мы расширим плагин, описанный в нашей статье об ИИ-клиенте WordPress. Плагин отправляет аудиофайл в ИИ-модель для извлечения текста и запуска генерации блоков Gutenberg. В этом разделе мы рассмотрим, как зарегистрировать этот процесс в качестве способности.
В приведенных ниже примерах показан только основной код. Для непосредственного экспериментирования с представленным в этом разделе кодом мы рекомендуем загрузить плагин AI Content Builder Next с GitHub и установить его вручную на локальный или тестовый сайт WordPress.
Перед регистрацией новой способности необходимо зарегистрировать новую категорию способностей.
Для этого потребуется подцепить функцию wp_register_ability_category() к хуку wp_abilities_api_categories_init.
Функция принимает уникальный слаг категории и ассоциативный массив аргументов.
Вот как зарегистрировать категорию способностей:
function aicb_register_ability_category(): void {
if ( ! function_exists( 'wp_register_ability_category' ) ) {
return;
}
wp_register_ability_category(
'content-generation',
array(
'label' => 'Content Generation',
'description' => 'AI-powered content transformation and structuring abilities',
)
);
}
add_action( 'wp_abilities_api_categories_init', 'aicb_register_ability_category' );
Следующий шаг — регистрация способности. Для этого необходимо подцепить функцию wp_register_ability() к действию wp_abilities_api_init.
Функция принимает два аргумента: имя способности, включая её пространство имён, и массив аргументов для конфигурации способности.
Вот пример регистрации способности для плагина AI Content Builder:
function aicb_register_audio_to_gutenberg_blocks_ability(): void {
if ( ! function_exists( 'wp_register_ability' ) ) {
return;
}
$input_schema = array( ... );
$output_schema = array( ... );
wp_register_ability(
'ai-content-builder/audio-to-gutenberg-blocks',
array(
'category' => 'content-generation',
'label' => 'Audio to Gutenberg Blocks',
'description' => 'Transcribes audio and converts the content into WordPress Gutenberg-compatible block objects.',
'input_schema' => $input_schema,
'output_schema' => $output_schema,
'execute_callback' => 'aicb_audio_to_gutenberg_blocks_callback',
'permission_callback' => static function (): bool {
return current_user_can( 'edit_posts' );
},
'meta' => array(
'show_in_rest' => true,
'annotations' => array(
'readonly' => false,
'destructive' => false,
'idempotent' => false,
'instructions' => 'Processes an audio attachment: transcribes it, generates structured blog content via AI, and returns Gutenberg-ready block objects.',
),
),
)
);
}
add_action( 'wp_abilities_api_init', 'aicb_register_audio_to_gutenberg_blocks_ability' );
В вызове функции wp_register_ability мы настроили следующие аргументы:
- category: Категория, к которой относится способность.
- label: Отображаемое имя способности.
- description: Краткое описание того, что делает способность и каково её назначение.
- input_schema: Схема для входных аргументов.
- output_schema: Схема, предоставляемая и возвращаемая способностью.
- execute_callback: Функция обратного вызова, которая будет выполнена при срабатывании способности.
- permission_callback: Функция обратного вызова, выполняемая с целью проверки наличия у агента необходимых разрешений для запуска способности.
- meta: Массив дополнительных полей метаданных для способности.
- show_in_rest: Определяет, следует ли предлагать способность в REST API WordPress.
- annotations: Массив описательных элементов, определяющих поведение способности.
input_schema — это массив, определяющий входной контракт способности. Он представляет собой определение JSON Schema для валидации ввода способности. В нашем конкретном случае:
$input_schema = array( 'type' => 'object', 'properties' => array( 'audio_id' => array( 'type' => 'integer', 'description' => 'The ID of the audio attachment to process and convert into Gutenberg blocks.', ), ), 'required' => array( 'audio_id' ), );
Эта JSON-схема представляет формат, которому должны соответствовать входные данные для использования этой способности.
output_schema — это выходной контракт, возвращаемый данной способностью. В нашем примере каждый элемент представляет собой объект — блок JSON:
$output_schema = array( 'type' => 'object', 'properties' => array( 'title' => array( 'type' => 'string' ), 'sections' => array( 'type' => 'array', 'items' => array( 'type' => 'object' ), ), 'blocks' => array( 'type' => 'array', 'items' => array( 'type' => 'object' ), ), 'transcript' => array( 'type' => 'string' ), ), 'required' => array( 'blocks' ), );
Следующий шаг — определить функцию обратного вызова, которая выполняется при активации данной способности (полный код можно посмотреть на GitHub):
function aicb_audio_to_gutenberg_blocks_callback( array $args ) {
// missing code
// see GitHub
...
$structured_json = wp_ai_client_prompt( $prompt )
->using_system_instruction( $instructions )
->using_temperature( 0.4 )
->as_json_response( $schema )
->generate_text();
if ( is_wp_error( $structured_json ) ) {
return $structured_json;
}
$structured = json_decode( (string) $structured_json, true );
if ( ! is_array( $structured ) ) {
return new \WP_Error(
'invalid_ai_json',
'Could not parse structured AI response.',
array( 'status' => 500 )
);
}
// Normalize the output.
$normalized = aicb_normalize_structured_post( $structured );
if ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {
return new \WP_Error(
'empty_structured_content',
'The AI provider returned empty structured content.',
array( 'status' => 500 )
);
}
// Convert to Gutenberg blocks.
$blocks = aicb_sections_to_blocks( $normalized['title'], $normalized['sections'] );
return $blocks;
}
Эта функция вызывает две произвольных функции. Первая (aicb_normalize_structured_post) нормализует ИИ-вывод, сводя его к предопределенному формату, и очищает данные:
function aicb_normalize_structured_post( array $structured ): array {
$title = isset( $structured['title'] )
? sanitize_text_field( (string) $structured['title'] )
: '';
$sections = array();
if ( isset( $structured['sections'] ) && is_array( $structured['sections'] ) ) {
foreach ( $structured['sections'] as $section ) {
if ( ! is_array( $section ) ) {
continue;
}
$heading = isset( $section['heading'] )
? sanitize_text_field( (string) $section['heading'] )
: '';
$level = 2;
$paragraphs = array();
if ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {
foreach ( $section['paragraphs'] as $paragraph ) {
$clean_paragraph = trim( sanitize_textarea_field( (string) $paragraph ) );
if ( '' !== $clean_paragraph ) {
$paragraphs[] = $clean_paragraph;
}
}
}
$bullet_points = array();
if ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {
foreach ( $section['bullet_points'] as $bullet_point ) {
$clean_bullet_point = trim( sanitize_text_field( (string) $bullet_point ) );
if ( '' !== $clean_bullet_point ) {
$bullet_points[] = $clean_bullet_point;
}
}
}
if ( '' === $heading || empty( $paragraphs ) ) {
continue;
}
$sections[] = array(
'heading' => $heading,
'level' => $level,
'paragraphs' => $paragraphs,
'bullet_points' => $bullet_points,
);
}
}
return array(
'title' => $title,
'sections' => $sections,
);
}
Функция принимает структурированный массив JSON-объектов, нормализует и очищает данные, а затем возвращает массив, содержащий тайтл и разделы.
Вторая функция (aicb_sections_to_blocks) преобразует нормализованные данные в объекты дескрипторов блоков и определяется следующим образом:
function aicb_sections_to_blocks( string $title, array $sections ): array {
$blocks = array();
foreach ( $sections as $section ) {
if ( ! is_array( $section ) ) {
continue;
}
$heading = isset( $section['heading'] ) ? trim( (string) $section['heading'] ) : '';
if ( '' === $heading ) {
continue;
}
$paragraphs = array();
if ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {
foreach ( $section['paragraphs'] as $paragraph ) {
$clean = trim( (string) $paragraph );
if ( '' !== $clean ) {
$paragraphs[] = $clean;
}
}
}
if ( empty( $paragraphs ) ) {
continue;
}
$blocks[] = array(
'name' => 'core/heading',
'attributes' => array(
'content' => $heading,
'level' => 2,
),
);
foreach ( $paragraphs as $paragraph ) {
$blocks[] = array(
'name' => 'core/paragraph',
'attributes' => array(
'content' => $paragraph,
),
);
}
if ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {
$bullet_items_html = '';
foreach ( $section['bullet_points'] as $bullet_point ) {
$clean_bullet = trim( sanitize_text_field( (string) $bullet_point ) );
if ( '' === $clean_bullet ) {
continue;
}
// core/list expects HTML in the `values` attribute.
$bullet_items_html .= '<li>' . esc_html( $clean_bullet ) . '</li>';
}
if ( '' !== $bullet_items_html ) {
$blocks[] = array(
'name' => 'core/list',
'attributes' => array(
'values' => '<ul>' . $bullet_items_html . '</ul>',
),
);
}
}
}
return $blocks;
}
Вот основные особенности этой функции:
- Функция принимает 2 аргумента: строку, представляющую тайтл поста, и массив разделов, сгенерированных ИИ-моделью.
- Для каждого раздела функция генерирует заголовок и как минимум один абзац.
- Если присутствуют буллеты, она генерирует соответствующее количество элементов списка.
- Функция возвращает массив $blocks объектов дескрипторов блоков, который является выходным контрактом, возвращаемым способностью ($output_schema).
Обратите внимание, что выводом функции является не сырая разметка блоков. Она будет сгенерирована на стороне клиента с помощью функции JavaScript createBlock.
Например, элемент заголовка раздела представлен следующим объектом:
if ( '' !== $heading ) {
$blocks[] = array(
'name' => 'core/heading',
'attributes' => array(
'content' => $heading,
'level' => ( 3 === $level ) ? 3 : 2,
),
);
}
После регистрации вашей способности вы можете выполнить в терминале те же команды WP-CLI, что и выше, чтобы получить подробную информацию. Следующий код сгенерирует схему ввода для вашей способности:
wp --user=1 eval '
$ability = wp_get_ability( "ai-content-builder/audio-to-gutenberg-blocks" );
if ( ! $ability ) {
echo "Ability not found\n";
exit( 1 );
}
echo "Input Schema:\n";
var_dump( $ability->get_input_schema() );
'
Вот результат в терминале:
Input Schema:
array(3) {
["type"]=>
string(6) "object"
["properties"]=>
array(1) {
["audio_id"]=>
array(2) {
["type"]=>
string(7) "integer"
["description"]=>
string(76) "The ID of the audio attachment to process and convert into Gutenberg blocks."
}
}
["required"]=>
array(1) {
[0]=>
string(8) "audio_id"
}
}
Аналогичным образом можно получить схему вывода для данной способности:
wp --user=1 eval '
$ability = wp_get_ability( "ai-content-builder/audio-to-gutenberg-blocks" );
if ( ! $ability ) {
echo "Ability not found\n";
exit( 1 );
}
echo "Output Schema:\n";
var_dump( $ability->get_output_schema() );
'
Вы также можете отобразить полный объект своей способности с помощью следующей команды:
wp eval '
$ability = wp_get_ability( "ai-content-builder/audio-to-gutenberg-blocks" );
if ( ! $ability ) {
echo "Ability not found\n";
exit( 1 );
}
echo "Name: " . $ability->get_name() . "\n";
echo "Label: " . $ability->get_label() . "\n";
echo "Category: " . $ability->get_category() . "\n";
echo "Description: " . $ability->get_description() . "\n";
echo "\nInput Schema:\n";
var_dump( $ability->get_input_schema() );
echo "\nOutput Schema:\n";
var_dump( $ability->get_output_schema() );
'
Выполнение способности
Для выполнения способности вам потребуется использовать метод execute() объекта $ability. Вы можете попробовать запустить следующий PHP-код через WP-CLI, чтобы активировать функцию core/get-site-info:
wp --user=1 eval '
$ability = wp_get_ability( "core/get-site-info" );
if ( ! $ability ) {
echo "Ability not found\n";
exit(1);
}
$result = $ability->execute();
if ( is_wp_error( $result ) ) {
echo "ERROR: " . $result->get_error_message() . "\n";
exit(1);
}
echo json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . "\n";
'
При выполнении этой команды способность предоставит JSON-объект, похожий на следующий:
{
"name": "WordPress 7.0",
"description": "",
"url": "http://yoursite.kinsta.cloud",
"wpurl": "http://yoursite.kinsta.cloud",
"admin_email": "yourname@youremail.com",
"charset": "UTF-8",
"language": "en-US",
"version": "7.1-alpha-62550"
}
Выше приведён лишь простой пример способности, выводящей данные для вашего сайта.
Как уже упоминалось, способность может запрашивать входные данные, выполнять над ними операции и возвращать структурированный результат. Давайте воспользуемся примером способности, зарегистрированной в предыдущем разделе.
В терминале перейдите в корневой каталог вашего сайта и выполните следующий PHP-код:
wp --user=1 eval '
$ability = wp_get_ability( "ai-content-builder/audio-to-gutenberg-blocks" );
if ( ! $ability ) {
echo "Ability not found\n";
exit( 1 );
}
$input = array( "audio_id" => 1755 );
$result = $ability->execute( $input );
if ( is_wp_error( $result ) ) {
echo "ERROR: " . $result->get_error_message() . "\n";
exit( 1 );
}
echo json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . "\n";
'
Метод execute передает структурированные входные данные в способность, которая возвращает массив объектов, готовых к преобразованию в блоки Gutenberg:
[
{
"name": "core/heading",
"attributes": {
"content": "A Well-Deserved Rest Day in Marrakech",
"level": 2
}
},
{
"name": "core/paragraph",
"attributes": {
"content": "On April 24th, our group of seven motorcyclists took a break from the open road..."
}
},
{
"name": "core/heading",
"attributes": {
"content": "Exploring Jemaa el-Fnaa and the Medina",
"level": 2
}
},
{
"name": "core/paragraph",
"attributes": {
"content": "Our journey led us straight to Jemaa el-Fnaa, the legendary main square of Marrakech..."
}
},
{
"name": "core/list",
"attributes": {
"values": "<ul><li>Navigating the bustling souks and narrow alleys of the ancient Medina.</li><li>Savoring traditional Moroccan and Berber dishes.</li><li>Experiencing the vibrant street performances and food stalls of Jemaa el-Fnaa at night.</li></ul>"
}
},
...
]
Интеграция REST API
WordPress Abilities API предоставляет единую структуру маршрутизации, которая позволяет внешним агентам программно запрашивать доступные категории способностей (/categories), проверять контракты конкретных способностей (/abilities/{name}) и выполнять определенную способность, используя стандартную конечную точку run (/abilities/{name}/run).
Для всех запросов к REST API WordPress требуется аутентификация. Для внешних скриптов или сторонних инструментов, таких как Postman, используйте пароли приложений WordPress.
Вот, например, GET-запрос, который возвращает список категорий с нашего тестового сайта:
https://yoursite.kinsta.cloud/wp-json/wp-abilities/v1/categories
При регистрации способности в предыдущем примере мы установили параметр show_in_rest в значение true. Таким образом, наша способность стала автоматически доступна через эти нативные конечные точки REST API WordPress в централизованном пространстве имен ядра (wp-abilities/v1).
Это означает, что вам не нужно вручную регистрировать произвольные маршруты с нуля для вызова способности из внешней среды. Внешние агенты могут обнаружить и выполнить вашу способность, используя стандартные HTTP-запросы.
Вы можете ознакомиться с конкретным контрактом нашей способности с помощью следующего GET-запроса:
https://yoursite.kinsta.cloud/wp-json/wp-abilities/v1/abilities/ai-content-builder/audio-to-gutenberg-blocks
Наконец, вы можете активировать эту способность с помощью аутентифицированного POST-запроса:
https://yoursite.kinsta.cloud/wp-json/wp-abilities/v1/abilities/ai-content-builder/audio-to-gutenberg-blocks/run
При отправке запроса такого типа убедитесь, что вы указали входные данные. В нашем примере мы задали следующий JSON в теле запроса:
{
"input": {
"audio_id": YOUR_AUDIO_ID
}
}

Наша способность обработала аудиоданные и передала их ИИ-модели, настроенной на сайте. Модель вернула структурированный результат, который впоследствии был нормализован и очищен; в итоге мы получили следующий массив объектов, содержащих блочные атрибуты:
{
"blocks": [
{
"name": "core/heading",
"attributes": { "content": "A Welcome Rest Day in Marrakech", "level": 2 }
},
{
"name": "core/paragraph",
"attributes": { "content": "On April 24, our group of seven motorcyclists paused our journey..." }
}
]
}
Именно к такому результату мы и стремились.
Начиная с версии WordPress 7.0, Abilities API теперь доступен и через JavaScript благодаря реализации Client-Side Abilities API. Разработчики могут использовать два пакета @wordpress/abilities и @wordpress/core-abilities для регистрации способностей — вместе с их входными и выходными схемами, коллбэками и аннотациями — для реализации функциональности на стороне клиента.
Будущее WordPress — за агентами
В то время как AI Client и новая архитектура коннекторов внедряют возможности ИИ-обработки в WordPress, API Abilities переосмысливает взаимодействие WordPress с внешним миром. Мы наблюдаем кардинальный сдвиг парадигмы, переход от традиционной веб-архитектуры, основанной на ручном пользовательском взаимодействии, где каждая интеграция требовала произвольных конечных точек и ручного сопоставления, к архитектуре, ориентированной на намерения, разработанной с нуля для автоматизации.
API Abilities — это не просто еще один API, а настоящий распределенный движок выполнения, который дает представление о все более агентном будущем WordPress.
Источник: https://kinsta.com/
