Создать статическую сборку
const url = 'https://example.com/wp-json/wp2lms/static-builder/v1/builds?blog_id=1';const options = { method: 'POST', headers: {'X-WP-Nonce': '<X-WP-Nonce>', 'Content-Type': 'application/json'}, body: '{"page_ids":[42,57],"course_name":"Основы информационной безопасности","api_type":"scorm","course_id":"course-infosec-101","version":1,"export_mode":"package"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url 'https://example.com/wp-json/wp2lms/static-builder/v1/builds?blog_id=1' \ --header 'Content-Type: application/json' \ --header 'X-WP-Nonce: <X-WP-Nonce>' \ --data '{ "page_ids": [ 42, 57 ], "course_name": "Основы информационной безопасности", "api_type": "scorm", "course_id": "course-infosec-101", "version": 1, "export_mode": "package" }'Создаёт черновик CPT wp2lms_static_build, пишет ACF/флаги и страницы, публикует запись и отдаёт полный serialize. Генерация пакета не стартует: это не POST …/run.
Нужен непустой page_ids или валидный build_course_id (ID CPT wp2lms_courses). Без обоих — 400 pages_required. При build_course_id без page_ids страницы берутся из структуры курса (CourseBuildSync::apply_course_to_build); пустой курс — 400 empty_course. Несуществующий/не-курс — 404 course_not_found. Если переданы оба — линк по build_course_id, страницы из явных page_ids.
Каждый id в page_ids — существующая post_type=page; иначе 400 invalid_page_ids / page_not_found. Первый элемент — главная (main_page_id).
Можно не передавать api_type — в ответе будет ACF apiType или local. version если не передать — 1. export_mode если не передать — package.
Нужно manage_network или edit_pages. Cookie + X-WP-Nonce или Application Password.
Authorizations
Заголовок раздела «Authorizations»Parameters
Заголовок раздела «Parameters»Query Parameters
Заголовок раздела «Query Parameters»ID сайта мультисети, на котором читать/писать сборки. Необязательно: PHP берёт get_current_blog_id(). ≤ 0 — 400 invalid_blog. Чужой/несуществующий сайт — 404 blog_not_found. На одиночном сайте обычно не передают.
Example
1Request Bodyrequired
Заголовок раздела «Request Bodyrequired»Нужен непустой page_ids или валидный build_course_id (или оба).
object
ID страниц курса в порядке пакета. Необязателен, если передан build_course_id. Непустой массив положительных ID существующего post_type=page; иначе 400 invalid_page_ids / page_not_found. Первый элемент — главная страница. PHP делает array_unique.
ID CPT wp2lms_courses. Пишет meta ssb_course_id (config.build_course_id). Без page_ids страницы берутся из структуры курса. Несуществующий id — 404 course_not_found; пустой курс — 400 empty_course.
Отображаемое имя курса (ACF courseName). Необязательно; при build_course_id без явного имени подставляется title курса.
Тип пакета (ACF apiType). Необязательно. Иное значение — 400 invalid_api_type. Если не передать — в ответе apiType или local.
Идентификатор курса в LMS/xAPI (строка ACF), не WP post ID. Ключ ACF зависит от api_type.
Версия пакета (ACF version), float ≥ 1. Меньше 1 — 400 invalid_version. Если не передать — get_version_number даёт 1.
Служебный комментарий (ACF courseComment). Необязательно.
Package — ZIP/SCORM-пакет; live — живой просмотр. Иное — 400 invalid_export_mode. Если не передать — get_export_mode даёт package.
Избранная сборка курса (meta ssb_is_primary). Не больше одной на build_course_id / ssb_course_id: при true снимается у siblings. Без линка на курс — 400 primary_requires_course. Та же звезда в метабоксе «Сборки» на экране курса.
Examples
Явные page_ids
{ "page_ids": [ 42, 57 ], "course_name": "Основы информационной безопасности", "api_type": "scorm", "course_id": "course-infosec-101", "version": 1, "export_mode": "package"}Курс WP без page_ids
{ "build_course_id": 42, "api_type": "xapi", "export_mode": "package", "version": 1}Responses
Заголовок раздела «Responses»Сборка создана и опубликована. Тело — полный BuildService::serialize (config, страницы, статус, URL).
object
ID записи CPT wp2lms_static_build.
BuildStatus->value: new, pending, building, completed, error, stopped, rebuild, build, stopping. После create обычно new; после async run — pending.
True для completed, error, stopped.
object
ACF courseName в сохранённой сборке.
ACF apiType; пустое PHP подменяет на local.
ACF courseID (get_course_id), может быть пустой строкой.
ID связанного CPT wp2lms_courses (meta ssb_course_id). 0 если не привязана.
Число версии из ACF (get_version_number), по умолчанию 1.
ACF courseComment.
Package или live (get_export_mode; иное/пустое → package).
ID страниц в порядке пакета; первый = главная.
ID главной страницы (get_main_page), обычно page_ids[0].
Избранная сборка курса (meta ssb_is_primary). Не больше одной на связанный курс; звезда в метабоксе «Сборки».
True, если хотя бы у одной выбранной страницы есть термин таксономии секций. Сайтовая опция через REST не задаётся.
Сайтовая настройка Static Builder disableAutoAdditionData (не поле тела REST).
Для package — сайтовая notIncludeMediaFilesBuild; для live PHP всегда false.
Для package — saveExternalFiles (null → true); для live всегда false (внешние файлы не качаются).
Номер ревизии сборки из мета (get_revision_number).
Журнал шагов (get_logs(true) — новые сверху). После create обычно [].
object
Unix-время записи шага сборки (0, если в мета нет time).
Уровень записи лога сборки (info, если в мета нет level).
Текст шага генерации пакета.
URL просмотра (index.html / live). Не null только при status=completed и существующем view на диске; иначе null (в т.ч. сразу после create). Для live и package — если файл есть.
URL ZIP-пакета. Не null только при completed и существующем архиве (типично package / scorm / xapi). Для live ZIP часто отсутствует — тогда null.
URL каталога {uploads}/wp2lms-static/{id}/. Всегда строка, даже если файлов ещё нет.
Сырая ссылка wp-admin на карточку сборки (get_edit_post_link(..., 'raw')).
ID сайта, на котором лежит сборка (get_current_blog_id после switch_to_blog).
Example
{ "id": 128, "status": "new", "terminal": false, "config": { "course_name": "Основы информационной безопасности", "api_type": "scorm", "course_id": "course-infosec-101", "build_course_id": 42, "version": 1, "course_comment": "Пакет для LMS", "export_mode": "package" }, "page_ids": [ 42, 57 ], "main_page_id": 42, "use_sections_in_menu": false, "disable_auto_addition_data": false, "not_include_media_files_build": false, "save_external_files": true, "revision": 0, "logs": [], "view_url": null, "zip_url": null, "files_url": "https://pulse.example.com/wp-content/uploads/wp2lms-static/128/", "edit_url": "https://pulse.example.com/wp-admin/post.php?post=128&action=edit", "blog_id": 1}Pages_required — нет page_ids и build_course_id; empty_course — курс без страниц; invalid_page_ids / page_not_found; invalid_api_type / invalid_version / invalid_export_mode; invalid_blog.
object
Машинный код WP_Error (например wp2lms_static_builder_busy, rest_forbidden, invalid_nonce).
Человекочитаемое сообщение ошибки из PHP / WordPress REST.
Обычно { status: <HTTP-код> }. Если status нет, ядро REST часто отдаёт 500.
object
Example
{ "code": "wp2lms_static_builder_busy", "message": "Build is currently building and cannot be updated.", "data": { "status": 409 }}Не аутентифицирован. DualRest: rest_forbidden (status 401), если нет cookie-сессии. Cookie + X-WP-Nonce или Application Password.
object
Машинный код WP_Error (например wp2lms_static_builder_busy, rest_forbidden, invalid_nonce).
Человекочитаемое сообщение ошибки из PHP / WordPress REST.
Обычно { status: <HTTP-код> }. Если status нет, ядро REST часто отдаёт 500.
object
Example
{ "code": "wp2lms_static_builder_busy", "message": "Build is currently building and cannot be updated.", "data": { "status": 409 }}Нет права manage_network (мультисайт) или edit_pages (одиночный сайт); невалидный REST nonce rest_cookie_invalid_nonce.
object
Машинный код WP_Error (например wp2lms_static_builder_busy, rest_forbidden, invalid_nonce).
Человекочитаемое сообщение ошибки из PHP / WordPress REST.
Обычно { status: <HTTP-код> }. Если status нет, ядро REST часто отдаёт 500.
object
Example
{ "code": "wp2lms_static_builder_busy", "message": "Build is currently building and cannot be updated.", "data": { "status": 409 }}Course_not_found — нет CPT курса; blog_not_found — сайта нет или он в другой сети.
object
Машинный код WP_Error (например wp2lms_static_builder_busy, rest_forbidden, invalid_nonce).
Человекочитаемое сообщение ошибки из PHP / WordPress REST.
Обычно { status: <HTTP-код> }. Если status нет, ядро REST часто отдаёт 500.
object
Example
{ "code": "wp2lms_static_builder_busy", "message": "Build is currently building and cannot be updated.", "data": { "status": 409 }}Wp2lms_static_builder_create_failed — wp_insert_post вернул WP_Error; configure_failed — исключение при ACF/страницах (черновик тогда удаляется).
object
Машинный код WP_Error (например wp2lms_static_builder_busy, rest_forbidden, invalid_nonce).
Человекочитаемое сообщение ошибки из PHP / WordPress REST.
Обычно { status: <HTTP-код> }. Если status нет, ядро REST часто отдаёт 500.
object
Example
{ "code": "wp2lms_static_builder_busy", "message": "Build is currently building and cannot be updated.", "data": { "status": 409 }}