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

Создать пустой сайт или дубликат исходного сайта

POST
/wp-json/wp2/site-manager/v1/sites
curl --request POST \
--url https://example.com/wp-json/wp2/site-manager/v1/sites \
--header 'Content-Type: application/json' \
--header 'X-WP-Nonce: <X-WP-Nonce>' \
--data '{ "title": "Учебный проект", "slug": "training", "description": "Песочница для курса", "status_id": 12, "category_ids": [ 3 ], "user_id": 1 }'

Создаёт сайт в текущей сети. Это не создание сети (см. Multi Network). Без source_blog_id (или 0) — синхронно wpmu_create_blog пустого сайта и 201 SiteDto. Обязательны title и slug после trim, иначе 400 missing_fields. Слаг нормализуется, свободный domain/path подбирается с auto_increment. Если source_blog_id > 0 — очередь site_manager.create_from_source и 202 с poll_url / events_url (заголовок Location, Retry-After=2). Источник не в текущей сети — 404 site_not_in_network. Нужно create_sites или manage_network. Чужой user_id — только супер-админ (403 forbidden_user). Только multisite.

Media typeapplication/json
object
title
required

Заголовок нового сайта (blogname / аргумент wpmu_create_blog). Обязательно; пустая строка после trim — 400 missing_fields.

string
slug
required

Адресный ярлык. Обязательно. PHP нормализует и при создании пустого сайта сам подбирает свободный domain/path (auto_increment). Пустой после trim — 400 missing_fields.

string
description

Необязательный blogdescription; после создания уходит в SiteMetadataPatch.

string
status_id

Необязательный ID статуса Site Manager; после wpmu_create_blog пишется в site meta. Несуществующий термин — 400 invalid_term.

integer
category_ids

Необязательные ID категорий; пустой или отсутствующий массив — категории не назначаются.

Array<integer>
user_id

Владелец/админ нового сайта для wpmu_create_blog. Необязательно: по умолчанию текущий пользователь REST. Назначить чужой id может только супер-админ, иначе 403 forbidden_user. user_id ≤ 0 после резолва — 401 missing_user.

integer
source_blog_id

Если > 0, PHP не создаёт сайт синхронно: ставит задание site_manager.create_from_source и отвечает 202. Источник должен быть в текущей сети, иначе 404 site_not_in_network. Без поля или 0 — пустой сайт и 201 SiteDto.

integer
Example
{
"title": "Учебный проект",
"slug": "training",
"description": "Песочница для курса",
"status_id": 12,
"category_ids": [
3
],
"user_id": 1
}

Пустой сайт создан. Тело — SiteMetadata::to_array.

Media typeapplication/json
object
blog_id

ID сайта в текущей сети (WP_Site->blog_id). Path {blog_id} тех же ручек — то же число.

integer
network_id

ID сети, которой принадлежит сайт (WP_Site->site_id). Это не blog_id и не CreateNetworkRequest.domain.

integer
title

Заголовок сайта — опция блога blogname (get_option на этом сайте). Не опция сети site_name.

string
slug

Адресный ярлык сайта. При SUBDOMAIN_INSTALL — поддомен относительно domain сети; иначе сегмент WP_Site->path без слэшей. PHP считает его в SiteSlugService::derive_slug_from_site.

string
domain

Хост сайта в таблице блогов (WP_Site->domain), без схемы https://.

string
path

Путь сайта в таблице блогов (WP_Site->path) со слэшами (часто / при поддоменах или /training/ при subdirectory). Это не путь файла Local Sync.

string
description

Подзаголовок сайта — опция блога blogdescription.

string
status_id

ID термина таксономии статусов Site Manager (site meta wp2platform_site_status). null, если статус не задан или id=0.

integer
nullable
status

Развёрнутый термин статуса Site Manager. null, если статус не задан. Не путать с флагом WP_Site->public.

object
id

Term_id статуса.

integer
name

Отображаемое имя статуса.

string
slug

Ярлык термина статуса (sanitize_title).

string
category_ids

ID терминов категорий Site Manager (site meta wp2platform_site_categories).

Array<integer>
categories

Развёрнутые категории сайта (id, name, slug). Во вложении SiteDto PHP не отдаёт parent.

Array<object>
object
id

Term_id категории сайтов (таксономия Site Manager, не рубрика записей).

integer
name

Отображаемое имя термина. В списке PHP может подменить дефолтные ярлыки через translate_default_term_label.

string
slug

Ярлык термина категории (sanitize_title при записи).

string
parent

Term_id родителя (WP_Term->parent); 0 — корень. В SiteDto.categories PHP это поле не кладёт.

integer
site_url

Публичный URL сайта (get_site_url(blog_id)).

string format: uri
admin_url

URL wp-admin этого сайта (get_admin_url(blog_id)), не /wp-admin/network/.

string format: uri
registered

Дата регистрации блога (WP_Site->registered), как хранит ядро.

string format: date-time
last_updated

Дата последнего обновления блога (WP_Site->last_updated).

string format: date-time
public

Флаг WP_Site->public (1 — публичный/активный, 0 — снят с публикации). Не термин статуса Site Manager.

integer
archived

Флаг WP_Site->archived (1 — в архиве, 0 — нет).

integer
deleted

Флаг WP_Site->deleted в таблице блогов (ядро пометило сайт удалённым). Не результат DELETE этой API.

integer
spam

Флаг WP_Site->spam (1 — помечен как спам).

integer
mature

Флаг WP_Site->mature.

integer
is_main_site

True, если это главный сайт сети (is_main_site(blog_id)). Его нельзя удалить, архивировать, деактивировать или сменить ему slug через API (main_site_forbidden / main_site_slug_forbidden).

boolean
is_template

True, если site meta wp2platform_site_manager_is_template равно 1 (сайт-шаблон для дублирования).

boolean
user_count

Число пользователей на сайте (count_users()['total_users']). PHP добавляет поле, только если в query include есть подстрока stats; иначе ключа нет.

integer
Example
{
"blog_id": 5,
"network_id": 1,
"title": "Учебный проект",
"slug": "training",
"domain": "training.example.com",
"path": "/",
"description": "Песочница для курса",
"status_id": 12,
"site_url": "https://training.example.com/",
"admin_url": "https://training.example.com/wp-admin/",
"public": 1,
"archived": 0,
"deleted": 0,
"spam": 0,
"mature": 0,
"is_main_site": false,
"is_template": false
}

Задание на копию принято (source_blog_id). Location — poll_url, Retry-After=2.

Media typeapplication/json
object
job_id

UUID задания PlatformJob. Тот же id в GET /jobs/{job_id} и SSE /jobs/{job_id}/events.

string format: uuid
status

Текущий статус задания на момент 202 (обычно pending сразу после enqueue).

string
type

Тип задания Site Manager. Создание копии — site_manager.create_from_source; массовые операции — site_manager.bulk.

string
poll_url

URL опроса JSON-состояния (rest_url(…/jobs/{job_id})). Дублируется в заголовке Location; Retry-After=2.

string format: uri
events_url

URL SSE-потока прогресса (…/jobs/{job_id}/events), не JSON-poll.

string format: uri
Example
{
"job_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "pending",
"type": "site_manager.create_from_source",
"poll_url": "https://example.com/wp-json/wp2/site-manager/v1/jobs/7c9e6679-7425-40de-944b-e07fc1f90ae7",
"events_url": "https://example.com/wp-json/wp2/site-manager/v1/jobs/7c9e6679-7425-40de-944b-e07fc1f90ae7/events"
}
Location
string

URL GET состояния задания (…/jobs/{job_id}).

Retry-After
integer

Секунды до следующего poll (PHP ставит 2).

Missing_fields — нет title или slug; not_multisite; invalid_term — несуществующий статус/категория после создания.

Media typeapplication/json
object
code

Машинный код ошибки или события.

string
message

Текст сообщения (лог, PIN, сброс пароля).

string
data

Дополнительные данные WP_Error или лицензии.

object
Examplegenerated
{
"code": "example",
"message": "example",
"data": {}
}

Не аутентифицирован. DualRest: rest_forbidden (status 401), если нет cookie-сессии. Либо missing_user — нет валидного владельца сайта.

Media typeapplication/json
object
code

Машинный код ошибки или события.

string
message

Текст сообщения (лог, PIN, сброс пароля).

string
data

Дополнительные данные WP_Error или лицензии.

object
Examplegenerated
{
"code": "example",
"message": "example",
"data": {}
}

Нет права create_sites/manage_network, невалидный REST nonce, либо forbidden_user (назначить user_id может только супер-админ).

Media typeapplication/json
object
code

Машинный код ошибки или события.

string
message

Текст сообщения (лог, PIN, сброс пароля).

string
data

Дополнительные данные WP_Error или лицензии.

object
Examplegenerated
{
"code": "example",
"message": "example",
"data": {}
}

Site_not_in_network — source_blog_id не в текущей сети.

Media typeapplication/json
object
code

Машинный код ошибки или события.

string
message

Текст сообщения (лог, PIN, сброс пароля).

string
data

Дополнительные данные WP_Error или лицензии.

object
Examplegenerated
{
"code": "example",
"message": "example",
"data": {}
}

WP_Error из wpmu_create_blog без HTTP-status в data (часто занятый домен). WordPress REST отдаёт такие ошибки как 500.

Media typeapplication/json
object
code

Машинный код ошибки или события.

string
message

Текст сообщения (лог, PIN, сброс пароля).

string
data

Дополнительные данные WP_Error или лицензии.

object
Examplegenerated
{
"code": "example",
"message": "example",
"data": {}
}