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

Создать встраиваемый пакет

POST
/wp-json/wp2lms-pro/embed-packages/v1/packages
curl --request POST \
--url 'https://example.com/wp-json/wp2lms-pro/embed-packages/v1/packages?blog_id=1' \
--header 'Content-Type: application/json' \
--header 'X-WP-Nonce: <X-WP-Nonce>' \
--data '{ "title": "Интерактивный урок", "status": "publish", "html": "<!doctype html><html lang=\"ru\"><title>Урок</title><h1>Добро пожаловать</h1></html>" }'

Создаёт запись CPT wp2lms_embed_pkg (wp_insert_post) и по желанию заливает содержимое через ingest_from_request. Это не создание страниц WordPress: материализация — POST …/materialize-pages или POST …/batch. title необязателен: пустая строка после sanitize_text_field → «Untitled package». status необязателен, по умолчанию publish; допустимы только publish / draft / private (sanitize_key), иное PHP заменяет на publish. Содержимое можно не передавать — получится пакет без файлов (пустые launch_path/meta). Иначе один из каналов: multipart-файл (file / package_file / package_zip, расширение zip или html/htm), JSON files (дерево путей), JSON html (пишется как index.html). Если есть и files, и непустой html, а в дереве нет index.html — PHP добавит index.html из html. Пустой объект files деревом не считается. Ошибка ingest после insert — пакет сразу wp_delete_post(..., true) и тот же WP_Error клиенту. Нужно manage_network (multisite) или edit_pages. Cookie + X-WP-Nonce или Application Password.

blog_id
integer
>= 1

ID сайта сети (switch_to_blog). Необязательно: по умолчанию текущий блог запроса. Не ID пакета и не page_id. Минимум 1; на одиночном сайте должен совпадать с текущим — иначе 400 embed_packages_invalid_blog. В сети неизвестный сайт или сайт другой сети — 404 embed_packages_unknown_blog.

Example
1
object
title

Заголовок новой записи CPT. Необязательно. Пусто после sanitize → «Untitled package». После ingest может быть перезаписан из HTML/манифеста.

string
status

Post_status новой записи. Необязательно, по умолчанию publish. Иное значение PHP заменяет на publish.

string
Allowed values: publish draft private
html

Сырой HTML одного launch-файла. Необязательно. Пишется как index.html, если нет multipart и (при наличии files) в дереве ещё нет index.html.

string
files

Карта относительных путей к содержимому. Ключ — безопасный относительный путь (PackageFilePolicy). Пустой объект PHP не считает деревом. Небезопасный путь — unsafe_path; чужое расширение — disallowed_extension.

object
key
additional properties
One of:

Сырой текст файла (HTML/CSS/JS).

string
Example
{
"title": "Интерактивный урок",
"status": "publish",
"html": "<!doctype html><html lang=\"ru\"><title>Урок</title><h1>Добро пожаловать</h1></html>"
}

Пакет создан. Тело — package_payload (id, title, status, launch_*, meta).

Media typeapplication/json

Ответ package_payload — запись CPT плюс плоские поля из meta и полный объект meta.

object
id

ID записи CPT wp2lms_embed_pkg. Совпадает с {id} в path GET/PATCH/DELETE/content/materialize-pages.

integer
title

post_title пакета. После ingest PHP может заменить его на <title> launch-файла.

string
status

post_status пакета. REST принимает publish/draft/private; в ответе то, что лежит в БД.

string
content_type

Копия meta.content_type (web / scorm1.2 / scorm2004 / xapi или пусто).

string
content_tool

Копия meta.content_tool (детектор автора или пустая строка).

string
launch_path

Копия meta.launch_path — относительный HTML запуска, не URL.

string
launch_url

Абсолютный URL запуска (uploads baseurl + storage_rel + launch_path). Пусто, если содержимого нет.

string format: uri
activity_id

Копия meta.activity_id.

string
storage_rel

Копия meta.storage_rel — каталог в uploads, не URL.

string
is_multipage

Копия meta.is_multipage (true только для web без tool и ≥2 HTML).

boolean
pages

Копия meta.pages — индекс HTML внутри пакета, не страницы WordPress.

Array<object>
object
path

Относительный путь HTML внутри каталога пакета (posix, без ведущего /). Из PackagePagesIndex::scan.

string
title

Заголовок из <title> файла или имя без расширения, если тега нет.

string
meta

Полный массив post meta _wp2lms_embed_package (PackageMeta::get). У пакета без ingest — пустой объект.

object
content_type

Тип после ManifestPipeline — web, scorm1.2, scorm2004 или xapi. Пусто, пока содержимое не залито.

string
version

Версия из манифеста (для SCORM часто совпадает с content_type). Для web обычно пустая строка.

string
activity_id

XAPI activity id. Если парсер не дал — {home}wp2lms-embed-package/{id}.

string
launch_path

Относительный HTML запуска внутри storage (из манифеста или fallback index.html).

string
title

Заголовок из launch HTML / манифеста; PHP может перезаписать post_title пакета этим значением.

string
mastery_score

Mastery score из imsmanifest (SCORM), иначе null.

number
nullable
content_tool

Детектор автора: ispring, articulate_rise, articulate_storyline, articulate_presenter, captivate, elucidat или пустая строка.

string
storage_rel

Путь от uploads basedir, wp2lms-embed-packages/{id}/.

string
uploaded_at

Unix-время последней успешной записи содержимого (time() в finalize).

integer
is_multipage

True только для content_type=web без content_tool и ≥2 HTML в индексе.

boolean
pages

Индекс HTML (path+title), если пакет multipage; иначе [].

Array<object>
object
path

Относительный путь HTML внутри каталога пакета (posix, без ведущего /). Из PackagePagesIndex::scan.

string
title

Заголовок из <title> файла или имя без расширения, если тега нет.

string
Example
{
"id": 42,
"title": "Интерактивный урок",
"status": "publish",
"content_type": "web",
"content_tool": "",
"launch_path": "index.html",
"launch_url": "https://lms.example.com/wp-content/uploads/wp2lms-embed-packages/42/index.html",
"activity_id": "https://lms.example.com/wp2lms-embed-package/42",
"storage_rel": "wp2lms-embed-packages/42/",
"is_multipage": false,
"pages": [],
"meta": {
"content_type": "web",
"version": "",
"activity_id": "https://lms.example.com/wp2lms-embed-package/42",
"launch_path": "index.html",
"title": "Интерактивный урок",
"mastery_score": null,
"content_tool": "",
"storage_rel": "wp2lms-embed-packages/42/",
"uploaded_at": 1726252800,
"pages": [],
"is_multipage": false
}
}

Embed_packages_bad_file — multipart не ZIP и не HTML/HTM; embed_packages_invalid_blog — некорректный blog_id.

Media typeapplication/json
object
code

Код WP_Error (get_error_code()), например embed_packages_not_found.

string
message

Текст WP_Error (get_error_message()).

string
data

Data WP_Error. Обычно { "status": 404 }. Ошибки ingest/materialize без status WordPress REST отдаёт как 500.

object
Example
{
"code": "embed_packages_not_found",
"message": "Package not found.",
"data": {
"status": 404
}
}

Не аутентифицирован. WordPress REST: rest_forbidden (status 401), если нет cookie-сессии. Cookie + X-WP-Nonce или Application Password.

Media typeapplication/json
object
code

Код WP_Error (get_error_code()), например embed_packages_not_found.

string
message

Текст WP_Error (get_error_message()).

string
data

Data WP_Error. Обычно { "status": 404 }. Ошибки ingest/materialize без status WordPress REST отдаёт как 500.

object
Example
{
"code": "embed_packages_not_found",
"message": "Package not found.",
"data": {
"status": 404
}
}

Нет права manage_network (multisite) или edit_pages (одиночный сайт), либо невалидный REST nonce (rest_cookie_invalid_nonce).

Media typeapplication/json
object
code

Код WP_Error (get_error_code()), например embed_packages_not_found.

string
message

Текст WP_Error (get_error_message()).

string
data

Data WP_Error. Обычно { "status": 404 }. Ошибки ingest/materialize без status WordPress REST отдаёт как 500.

object
Example
{
"code": "embed_packages_not_found",
"message": "Package not found.",
"data": {
"status": 404
}
}

Embed_packages_unknown_blog — в сети нет такого сайта или сайт принадлежит другой сети.

Media typeapplication/json
object
code

Код WP_Error (get_error_code()), например embed_packages_not_found.

string
message

Текст WP_Error (get_error_message()).

string
data

Data WP_Error. Обычно { "status": 404 }. Ошибки ingest/materialize без status WordPress REST отдаёт как 500.

object
Example
{
"code": "embed_packages_not_found",
"message": "Package not found.",
"data": {
"status": 404
}
}

WP_Error без HTTP-status в data — сбой wp_insert_post или ingest (empty_tree, unsafe_path, disallowed_extension, zip_open, unzip_failed, process_failed, mkdir_failed, write_failed, invalid_file_value, unsafe_zip, missing_zip и др.). WordPress REST отдаёт такие ошибки как 500. Пакет при ошибке ingest удаляется.

Media typeapplication/json
object
code

Код WP_Error (get_error_code()), например embed_packages_not_found.

string
message

Текст WP_Error (get_error_message()).

string
data

Data WP_Error. Обычно { "status": 404 }. Ошибки ingest/materialize без status WordPress REST отдаёт как 500.

object
Example
{
"code": "embed_packages_not_found",
"message": "Package not found.",
"data": {
"status": 404
}
}