Релиз WordPress 7.0 («Armstrong») ознаменовал фундаментальную трансформацию архитектуры платформы: впервые в ядро была интегрирована нативная подсистема искусственного интеллекта — Core AI Subsystem с интерфейсом WP_AI_Client. До версии 7.0 каждый разработчик плагина или темы был вынужден самостоятельно подключать сторонние библиотеки (Guzzle, официальные клиенты OpenAI, Anthropic или Google), что вызывало конфликты версий зависимостей (Dependency Hell), несовместимость с PSR-стандартами и разрозненное хранение секретных API-ключей в незашифрованных опциях wp_options.
Архитектура нативного клиента WordPress 7.0 построена по принципу провайдеро-агностичной абстракции (Provider-Agnostic Layer):
wp_get_ai_client()), передавая массив сообщений, системный контекст и схему валидации.sodium_crypto_secretbox), исключая утечку токенов при компрометации дампов базы данных.Внутренняя топология вызова нативного AI-клиента ядра WordPress 7.0:
[ Кастомный плагин / Тема (PHP 8.4 / 8.5) ]
|
v (Вызов: wp_get_ai_client()->chat())
[ Подсистема ядра: WP_AI_Client ]
|
v (Провайдеро-агностичная нормализация контракта)
[ Core AI Connectors Registry ]
|
+---> Проверка: sodium_crypto_secretbox_open()
+---> Проверка системных квот и ролей
|
+--------------+--------------+--------------+
| | |
v v v
[ Anthropic Connector ] [ Gemini Connector ] [ Ollama Connector ]
(Claude 3.7 Sonnet) (Gemini 2.5 Flash) (Локальный DeepSeek)
| | |
+--------------+--------------+--------------+
|
v (Нормализация ответа ядра)
[ Класс: WP_AI_Response ]
|
v (Автоматический маппинг в DTO по JSON Schema)
[ Типизированный результат в бизнес-логике плагина ]Получение синглтона подсистемы через фабричную функцию wp_get_ai_client().
Определение структуры DTO с помощью типизированного класса WP_AI_Schema.
Сборка сообщений диалога, системного контекста и ограничений токенов.
Выбор активного провайдера, расшифровка ключа через Sodium и HTTP-вызов.
Ядро валидирует JSON-ответ и возвращает строго типизированный объект WP_AI_Response.
meta_title, meta_description и фокусных ключевых фраз через модель Gemini 2.5 Flash в фоне.wp/v2/ai/chat.Ниже приведен эталонный производственный артефакт сервиса генерации структурированных SEO-метаданных с использованием нативного WP_AI_Client ядра WordPress 7.0.
<?php
declare(strict_types=1);
/**
* Author: Artur Yusupov (Fullstack Agentic Lab)
* Package: @agentic-lab/core-ai
* Module: PostSeoMetadataGenerator
* Standard: WordPress 7.0+ Core AI Subsystem / PHP 8.4 Strict
*/
namespace AgenticLab\AiCore\Application;
use WP_AI_Client;
use WP_AI_Message;
use WP_AI_Schema;
use WP_AI_Response;
use WP_Error;
use Throwable;
final readonly class PostSeoMetadataDto
{
/**
* @param list<string> $keywords
*/
public function __construct(
public string $metaTitle,
public string $metaDescription,
public array $keywords,
public int $readingTimeMinutes,
public string $toneOfVoice
) {}
}
final class PostSeoMetadataGenerator
{
private WP_AI_Client $aiClient;
public function __construct()
{
// Получение инстанса нативного клиента ядра WordPress 7.0
$this->aiClient = function_exists('wp_get_ai_client')
? wp_get_ai_client()
: new WP_AI_Client();
}
/**
* Анализ контента статьи и генерация строго типизированного SEO-манифеста.
*
* @param string $postTitle Заголовок статьи
* @param string $postContent Основной текст статьи
* @return PostSeoMetadataDto|WP_Error
*/
public function generate(string $postTitle, string $postContent): PostSeoMetadataDto|WP_Error
{
// 1. Декларация схемы Structured Output через системный класс ядра
$schema = new WP_AI_Schema([
'type' => 'object',
'properties' => [
'meta_title' => [
'type' => 'string',
'description' => 'Привлекательный SEO-заголовок длиной до 60 символов.',
],
'meta_description' => [
'type' => 'string',
'description' => 'Краткое описание для сниппета поисковика длиной до 160 символов.',
],
'keywords' => [
'type' => 'array',
'items' => ['type' => 'string'],
'description' => 'Список из 3-5 релевантных поисковых запросов.',
],
'reading_time_minutes' => [
'type' => 'integer',
'description' => 'Расчетное время прочтения статьи в минутах.',
],
'tone_of_voice' => [
'type' => 'string',
'enum' => ['technical', 'business', 'casual'],
'description' => 'Стиль изложения контента.',
],
],
'required' => ['meta_title', 'meta_description', 'keywords', 'reading_time_minutes', 'tone_of_voice'],
'additionalProperties' => false,
]);
// 2. Сборка диалогового контекста
$messages = [
WP_AI_Message::system(
'Вы — главный эксперт по поисковой оптимизации для изданий enterprise-уровня. ' .
'Анализируйте материалы и генерируйте высококонверсионные метаданные строго по схеме.'
),
WP_AI_Message::user(
"Заголовок статьи: {$postTitle}\n\nСодержимое:\n" . mb_substr(wp_strip_all_tags($postContent), 0, 8000)
),
];
// 3. Вызов нативного ядра с гарантированной схемой Structured Output
try {
/** @var WP_AI_Response|WP_Error $response */
$response = $this->aiClient->chat([
'messages' => $messages,
'response_format' => $schema,
'temperature' => 0.2,
'max_tokens' => 800,
]);
if (is_wp_error($response)) {
return $response;
}
// 4. Извлечение валидированных данных из ответа ядра
$data = $response->get_structured_data();
if (!is_array($data)) {
return new WP_Error('ai_invalid_output', __('Ядро не смогло распарсить структурированный ответ.', 'agentic-lab'));
}
// 5. Формирование иммутабельного DTO
return new PostSeoMetadataDto(
metaTitle: (string) ($data['meta_title'] ?? ''),
metaDescription: (string) ($data['meta_description'] ?? ''),
keywords: (array) ($data['keywords'] ?? []),
readingTimeMinutes: (int) ($data['reading_time_minutes'] ?? 5),
toneOfVoice: (string) ($data['tone_of_voice'] ?? 'technical')
);
} catch (Throwable $e) {
return new WP_Error(
'ai_client_exception',
sprintf(__('Исключение при вызове WP_AI_Client: %s', 'agentic-lab'), $e->getMessage()),
['exception' => $e]
);
}
}
}Симптом: Ошибки дублирования классов Composer (Fatal error: Cannot declare class GuzzleHttp\Client) при установке нескольких плагинов с ИИ.
Причина: Попытка по старинке упаковать вендорский SDK внутрь плагина вместо использования нативного WP_AI_Client.
Решение: Полагаться на подсистему ядра wp_get_ai_client(), позволяя администратору сайта централизованно управлять провайдерами.
Симптом: Сбой генерации при переключении провайдера с OpenAI на Anthropic или Ollama.
Причина: Разработчик передает параметры, уникальные для одной платформы (например, top_k или presence_penalty), ломая абстракцию ядра.
Решение: Использовать только кросс-провайдерные опции ядра: temperature, max_tokens, response_format и messages.
Симптом: Критическая утечка корпоративных ключей при создании резервных копий сайта или компрометации базы данных SQL-инъекцией.
Причина: Использование update_option('openai_key', $key) без шифрования.
Решение: Использовать нативный реестр Core AI Connectors, который автоматически шифрует секреты через sodium_crypto_secretbox.
Симптом: Пользовательский интерфейс редактора блокируется на несколько секунд в ожидании полного завершения инференса.
Причина: Синхронный опрос эндпоинта без поддержки Server-Sent Events (SSE).
Решение: Использовать потоковый метод $aiClient->stream() для передачи токенов в реальном времени.
Плагин собирает массив системных и пользовательских сообщений WP_AI_Message.
Объявление WP_AI_Schema для гарантии типов и полей выходного DTO.
Ядро выбирает активный шлюз (Claude / Gemini / Ollama) и расшифровывает API-токен.
Инференс модели со строгой Structured Output валидацией.
Возврат десериализованного объекта в плагин для дальнейшей бизнес-обработки.