Перейти к содержимому

Инвентарь REST-ручек

Фаза 3: канонические YAML — полноценный контракт (requestBody / security / WpError / коды ответов), не только каталог path’ов. URL — {product}/{slug}/v1.

Канон YAML — в плагине: docs/openapi/<base>.{en,ru}.yaml (например wp2platform-modules.en.yaml). Сайт копирует спеки (npm run sync:openapi → openapi-specs/{en,ru}/<base>.yaml) и собирает API-страницы через Starlight OpenAPI. Сверка path/глубины: npm run audit:openapi (тело или x-empty-body, security, ru/en коды). Исключения сканера: vendor, vendor-lib, tests, includes/analogwp-*. License регистрируется из wp2platform/plugin.php через контроллер wordpress-core — в аудит добавлен явно.

Объём контракта (EN): 137 операций в продуктовых YAML ниже. Живая функциональная сверка на stage (Application Password): harness .cursor/skills/remote-ssh-wp/scripts/stage_openapi_e2e/ — целевой счёт 137 PASS. Multi-network REST на stage появляется только после committed setup (wp2platform_multi_network_committed); иначе path есть в YAML, но не в rest_get_server().

Колонка OpenAPI: контракт — операция описана в YAML с входом/выходом/ошибками.

WP_REST_Server::EDITABLE в PHP = POST|PUT|PATCH; в OpenAPI обычно документирован PATCH (этого достаточно для coverage). CREATABLE = POST, READABLE = GET, DELETABLE = DELETE.


Спека: docs/openapi/wp2platform-modules.{en,ru}.yaml → /docs/api/wp2platform. Auth по умолчанию: cookie / Application Password (DualRest), сеть.

Клиенты: админка Site Manager. blog_id в path.

METHOD Path OpenAPI
GET /wp-json/wp2/site-manager/v1/sites контракт
POST …/sites контракт
GET …/sites/slug-availability контракт
POST …/sites/bulk контракт
GET …/sites/{blog_id} контракт
PATCH (EDITABLE) …/sites/{blog_id} контракт
DELETE …/sites/{blog_id} контракт
POST …/sites/{blog_id}/archive контракт
POST …/sites/{blog_id}/unarchive контракт
POST …/sites/{blog_id}/activate контракт
POST …/sites/{blog_id}/deactivate контракт
GET …/sites/{blog_id}/users контракт
POST …/sites/{blog_id}/users контракт
DELETE …/sites/{blog_id}/users/{user_id} контракт
GET/POST …/categories контракт
PATCH/DELETE …/categories/{id} контракт
GET/POST …/statuses контракт
PATCH/DELETE …/statuses/{id} контракт
GET …/jobs контракт
GET …/jobs/{job_id} контракт
GET …/jobs/{job_id}/events контракт
METHOD Path OpenAPI
POST /wp-json/wp2/site-duplicator/v1/sites/{blog_id}/duplicate контракт
GET …/jobs, …/jobs/{job_id}, …/jobs/{job_id}/events контракт
METHOD Path OpenAPI
POST /wp-json/wp2/post-duplicator/v1/posts/{post_id}/duplicate контракт
POST …/posts/{post_id}/duplicate-batch контракт

Runtime: модуль boot’ится только при committed multi-network setup; без него ручки в OpenAPI есть, на сайте — нет.

METHOD Path OpenAPI
GET/POST /wp-json/wp2/multi-network/v1/networks контракт
GET …/networks/{network_id} контракт

Клиенты: скиллы media-hls-encode, media-whisper-tracks (formats, attachments, artifacts/pack). Query blog_id на части ручек.

METHOD Path OpenAPI
GET …/media-converter/v1/formats контракт
GET/PATCH …/settings контракт
POST …/media, …/encode контракт
GET …/attachments/{id} контракт
POST …/attachments/{id}/encode контракт
GET …/queue, …/queue/{key} контракт
POST …/queue/control, …/queue/clear контракт
DELETE …/queue/{key} контракт
POST …/queue/{key}/formats/{format}/cancel контракт
GET/POST/DELETE …/attachments/{id}/frame-miniatures контракт
GET/POST …/attachments/{id}/thumbnails контракт
PATCH/DELETE …/attachments/{id}/thumbnails/poster контракт
GET …/attachments/{id}/artifacts контракт
POST …/attachments/{id}/artifacts/pack контракт
PATCH/DELETE …/attachments/{id}/artifacts/{folder} контракт

Клиент: скилл media-whisper-tracks.

METHOD Path OpenAPI
GET/POST/PUT …/media-subtitles-timecodes/v1/attachments/{id}/tracks контракт
POST …/tracks/upload контракт
PATCH/DELETE …/tracks/{index} контракт
METHOD Path OpenAPI
GET …/enable-media-replace/v1/attachments/{id}/replace-info контракт
POST …/attachments/{id}/replace контракт

Ошибка: playback_artifacts_present (409), если к вложению привязаны артефакты playback.

Клиент: WP2Studio (STUDIO_SYNC_REST_BASE). Auth: public на POST /desktop/connect; дальше Bearer. PHP: src/Modules/StudioSync/. Не переделывать.

METHOD Path Auth OpenAPI
POST /wp-json/wp2/studio-sync/v1/desktop/connect public (one-time token) контракт
GET …/desktop/status Bearer контракт
POST …/desktop/disconnect Bearer контракт
GET …/sites Bearer контракт
GET …/status Bearer (legacy) контракт
GET …/sync/items Bearer контракт
GET …/sync/posts/{post_id} Bearer контракт
PATCH (EDITABLE) …/sync/posts/{post_id} Bearer, body base_hash+content контракт

Клиенты: скилл 09-local-sync, пайплайн page-builder (POST /validate). Capability: manage_network (MS) / edit_pages. Query blog_id.

METHOD Path OpenAPI
GET /wp-json/wp2/local-sync/v1/projects контракт
POST …/sync контракт
POST …/validate контракт

Клиент: админка Gutenberg sidebar. manage_categories + edit_posts. Create/delete секций — core /wp/v2/{taxonomy}, не этот API.

METHOD Path OpenAPI
GET /wp-json/wp2/course-manager/v1/sidebar контракт
PUT …/reorder контракт
PUT …/assign контракт
PATCH (EDITABLE) …/sections/{id} контракт

Клиент: формы входа WP2 Platform.

METHOD Path OpenAPI
POST /wp-json/wp2/passwordless/v1/request контракт
POST …/verify контракт

Клиент: interstitial consume в WP2 Platform.

METHOD Path OpenAPI
POST /wp-json/wp2/magic-links/v1/consume контракт

Клиент: админка Elementor. edit_posts. Модуль can_be_enabled только при установленном Elementor.

METHOD Path OpenAPI
GET/POST /wp-json/wp2/elementor-style-presets/v1/presets контракт
GET …/presets/{id} контракт
PATCH (EDITABLE) …/presets/{id} контракт

Клиенты: плееры (Vidstack и др.). Query blog_id, lang.

METHOD Path OpenAPI
GET /wp-json/wp2/media-playback/v1/attachments/{id} контракт

Регистрация: plugin.php → LicenseRestController('wp2', 'license', $hub). Репо wp2-wordpress-core не документируется отдельно. Auth: manage_network_options / manage_options.

METHOD Path OpenAPI
GET /wp-json/wp2/license/v1/products контракт
POST …/{product_id}/activate контракт
POST …/{product_id}/deactivate контракт
GET …/{product_id}/status контракт
GET …/{product_id}/data контракт

Спека: docs/openapi/wp2lms.{en,ru}.yaml.

Клиенты: скилл 10-static-builder, CLI bin/static-builder/*. Auth: edit_pages / manage_network. Query blog_id.

WP_Error: wp2lms_static_builder_invalid_blog, blog_not_found, busy, not_found, no_pages, cannot_stop, invalid_id, invalid_api_type, invalid_version, invalid_export_mode, pages_required, invalid_page_ids, page_not_found, empty_course, course_not_found, primary_requires_course, create_failed, configure_failed, update_failed, delete_failed, page_cache_rebuild, live_mode_disabled.

METHOD Path OpenAPI
GET /wp-json/wp2lms/static-builder/v1/pages контракт
GET/POST …/builds контракт (POST: page_ids или build_course_id; is_primary)
GET …/courses/{course_id}/builds контракт (is_primary в serialize)
GET/PATCH/DELETE …/builds/{id} контракт (PATCH: is_primary)
POST …/builds/{id}/run контракт
POST …/builds/{id}/stop контракт

Клиенты: Turbo frontend (Gutenberg/Twig), Gravity Forms bridge, xAPI session.

METHOD Path Auth OpenAPI
POST /wp-json/wp2lms/turbo/v1/xapi-actor/session cookie (email) контракт
POST …/gravity-forms/submit cookie контракт
POST …/dsh/expand cookie контракт
GET …/static/{id} edit_posts контракт

Спека: docs/openapi/wp2lms-pro.{en,ru}.yaml.

Alias wp2platform/module/embed-packages/v1 снят. Auth: manage_network / edit_pages. Query blog_id.

WP_Error: embed_packages_not_found, delete_failed, page_not_found, invalid_blog, unknown_blog.

METHOD Path OpenAPI
GET/POST /wp-json/wp2lms-pro/embed-packages/v1/packages контракт
GET/PATCH/DELETE …/packages/{id} контракт
POST …/packages/{id}/content контракт
POST …/packages/{id}/materialize-pages контракт
GET/PUT/DELETE …/pages/{page_id}/package контракт
POST …/batch контракт

Спека: docs/openapi/wp2tutor.{en,ru}.yaml. Namespace разделены по модулям. Bot не в этой спеке (см. wp2tutor-bot). RAG-ручки регистрируются при включённом модуле rag и rag_export_enabled.

METHOD Path Auth OpenAPI
GET / POST /wp-json/wp2tutor/ai/v1/chat GET public; POST X-Ai-Chat-Secret контракт
POST /wp-json/wp2tutor/embedding/v1/sync manage_options контракт
POST …/statuses manage_options контракт
POST …/diagnostics manage_options контракт
GET/POST /wp-json/wp2tutor/rag/v1/datatables admin контракт
GET …/chunk/{id_chunk} admin контракт

Спека: docs/openapi/wp2tutor-forms.{en,ru}.yaml. Свои NS wp2tutor-forms/form/v1 и wp2tutor-forms/i18n/v1 (не общий wp2tutor/v1). Form: cookie / Application Password (logged-in). i18n: public. Модуль wp2tutor_form через platform modules list.

METHOD Path OpenAPI
POST /wp-json/wp2tutor-forms/form/v1/updateDefinition контракт
POST …/updateShortcode контракт
POST …/updateStyles контракт
POST …/updateL10n контракт
POST …/updateRunner контракт
GET …/getRunnerData контракт
GET /wp-json/wp2tutor-forms/i18n/v1/locale контракт
GET …/translation контракт

Спека: docs/openapi/wp2tutor-bot.{en,ru}.yaml. Публичные webhooks. При выкладке сменить URL в Telegram/VK.

METHOD Path Auth OpenAPI
POST /wp-json/wp2tutor-bot/telegram/v1/webhook/{bot_id} public контракт
POST /wp-json/wp2tutor-bot/vk/v1/callback/{channel_id} public контракт
POST /wp-json/wp2tutor-bot/deepchat/v1/chat/{channel_id} public + X-Wp2tutor-Bot-Secret контракт
OPTIONS …/chat/{channel_id} public CORS контракт

Клиенты: Telegram/VK, Deep Chat UI (секрет канала не в бандле клиента).


  • AJAX admin-ajax.php, WP-CLI.
  • Core /wp/v2/*, AnalogWP REST, Elementor/WPML чужие namespace.
  • Библиотека wp2-wordpress-core как отдельный API (License описан у platform).
  • Темы / skin-блоки, deprecated отдельные плагины.
  • WP2 Wrapper — JS API, не WordPress REST.