• Docs
        • Документация OnPress v2
            • Документация OnPress v2
              • Как устроена платформа
              • Быстрый старт
              • Доступ, роли и выбор сайта
                • Страницы
                  • Frontmatter: все поля
                  • Синтаксис markdown
                  • Языки и переводы страниц
                • Фреймы
                  • Вставки onpress/
                  • Бинды data-op-bind
                  • Сборка страницы и статическая копия
                • Готовые фреймы
                  • Фрейм assistant: страница с чатом ассистента
                  • Фрейм outline: оглавление в тексте
                  • Фрейм faq: вопросы из текста страницы
                  • Фрейм article: статья
                  • Фрейм docs: документация
                  • Фрейм site__header: шапка сайта
                  • Фрейм site__footer: подвал сайта
                  • Фрейм article__faq: вопросы из набора
                  • Фрейм landing: лендинг ассистента
                  • Фрейм assistant__chat: чат обычной разметкой
                  • Фрейм site__404: страница «не найдено»
                  • Фрейм news: лента новостей
                  • Фрейм news__category: рубрика новостей
                  • Фрейм news__post: новость
                  • Фрейм news__more: читайте ещё
                  • Фрейм news__share: поделиться
                  • Фрейм author__page: страница автора
                  • Фрейм author__byline: подпись автора
                  • Фрейм author__card: карточка автора
                  • Фрейм author__avatar: аватар автора
                  • Фрейм author__socials: соцсети автора
                  • Фрейм author__head: объявление набора автора
                  • Фрейм home: главная-документ
                  • Фрейм pricing: тарифы
                • Наборы данных и системные источники
                  • Повторитель onpress/repeat
              • Стили и оформление
              • Меню
              • Сайдбар документации
              • Языки сайта
              • Настройки, главная и кэш
              • SEO
              • Медиа
              • Сайты и домены
              • Пользователи и профиль
              • Дашборд и вход
                • Рецепты
                  • Сайт с нуля
                  • Раздел документации
                  • Лендинг из конструктора
                  • FAQ на странице
                  • Свой фрейм из готового
                  • Многоязычный сайт
                  • Поменять меню
                  • Перенести страницу
                  • Картинки в статье
                  • Список из данных
                  • Сменить оформление
                • Справочник API
                  • Справочник: страницы
                  • Справочник: переводы
                  • Справочник: фреймы
                  • Справочник: данные
                  • Справочник: меню
                  • Справочник: сайдбар документации
                  • Справочник: стили
                  • Справочник: настройки, главная, кэш
                  • Справочник: языки
                  • Справочник: SEO
                  • Справочник: медиа
                  • Справочник: сайты
                  • Справочник: пользователи и профиль
                  • Справочник: вход и служебное
                • Ошибки и частые проблемы
                  • Коды ошибок
        • Старая документация v1
            • Старая документация v1
              • Начало
              • Привязка домена
              • Виджеты
              • Структура ссылок
              • Connector.js
              • Шапка
              • Подвал
              • Мультиязычность
              • Меню
              • Как настроить стили сайта через Design
              • Schema разметка
              • Open Graph
              • Аналитика
              • FAQ
              • Robots.txt
              • Sitemap
OnPress OnPress
  • Документация
  • Контакты
Войти
    • Docs
        • Документация OnPress v2
            • Документация OnPress v2
              • Как устроена платформа
              • Быстрый старт
              • Доступ, роли и выбор сайта
                • Страницы
                  • Frontmatter: все поля
                  • Синтаксис markdown
                  • Языки и переводы страниц
                • Фреймы
                  • Вставки onpress/
                  • Бинды data-op-bind
                  • Сборка страницы и статическая копия
                • Готовые фреймы
                  • Фрейм assistant: страница с чатом ассистента
                  • Фрейм outline: оглавление в тексте
                  • Фрейм faq: вопросы из текста страницы
                  • Фрейм article: статья
                  • Фрейм docs: документация
                  • Фрейм site__header: шапка сайта
                  • Фрейм site__footer: подвал сайта
                  • Фрейм article__faq: вопросы из набора
                  • Фрейм landing: лендинг ассистента
                  • Фрейм assistant__chat: чат обычной разметкой
                  • Фрейм site__404: страница «не найдено»
                  • Фрейм news: лента новостей
                  • Фрейм news__category: рубрика новостей
                  • Фрейм news__post: новость
                  • Фрейм news__more: читайте ещё
                  • Фрейм news__share: поделиться
                  • Фрейм author__page: страница автора
                  • Фрейм author__byline: подпись автора
                  • Фрейм author__card: карточка автора
                  • Фрейм author__avatar: аватар автора
                  • Фрейм author__socials: соцсети автора
                  • Фрейм author__head: объявление набора автора
                  • Фрейм home: главная-документ
                  • Фрейм pricing: тарифы
                • Наборы данных и системные источники
                  • Повторитель onpress/repeat
              • Стили и оформление
              • Меню
              • Сайдбар документации
              • Языки сайта
              • Настройки, главная и кэш
              • SEO
              • Медиа
              • Сайты и домены
              • Пользователи и профиль
              • Дашборд и вход
                • Рецепты
                  • Сайт с нуля
                  • Раздел документации
                  • Лендинг из конструктора
                  • FAQ на странице
                  • Свой фрейм из готового
                  • Многоязычный сайт
                  • Поменять меню
                  • Перенести страницу
                  • Картинки в статье
                  • Список из данных
                  • Сменить оформление
                • Справочник API
                  • Справочник: страницы
                  • Справочник: переводы
                  • Справочник: фреймы
                  • Справочник: данные
                  • Справочник: меню
                  • Справочник: сайдбар документации
                  • Справочник: стили
                  • Справочник: настройки, главная, кэш
                  • Справочник: языки
                  • Справочник: SEO
                  • Справочник: медиа
                  • Справочник: сайты
                  • Справочник: пользователи и профиль
                  • Справочник: вход и служебное
                • Ошибки и частые проблемы
                  • Коды ошибок
        • Старая документация v1
            • Старая документация v1
              • Начало
              • Привязка домена
              • Виджеты
              • Структура ссылок
              • Connector.js
              • Шапка
              • Подвал
              • Мультиязычность
              • Меню
              • Как настроить стили сайта через Design
              • Schema разметка
              • Open Graph
              • Аналитика
              • FAQ
              • Robots.txt
              • Sitemap
Документация OnPress v2
Markdown
Открыть в ИИ
  • Открыть в ChatGPT
  • Открыть в Claude
  • Открыть в Gemini
  • Открыть в Perplexity
  • Открыть в Grok
  • Открыть в DeepSeek

Сайты и домены

Ручки /sites относятся к сети, а не к сайту: префикса /site/{siteId} у них нет, и blog_id, заголовок и domain запроса они не читают — сайт называется {id} в пути. {id} — site_id или номер блога, принимается и то и другое.

РучкаКому доступна
GET /sites/{id}администратору этого сайта и суперадмину; остальным — 404 site_not_found
POST /sitesсуперадмину сети
POST /sites/{id}/domainсуперадмину сети
DELETE /sites/{id}суперадмину сети
POST /sites/{id}/restoreсуперадмину сети

Номера сайтов в примерах ниже условные — подставляйте свои. Администратор сайта на сетевых операциях получает 403 insufficient_role с текстом network super admin required: они переписывают реестр сети, а не опции сайта.

Карточка сайта

curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/sites/233" | jq '{site_id, blog_id, domain, home, is_super_admin, realm, public, blog_public, theme, show_on_front, page_on_front, languages, counts: .counts | {pages, menus, frames, datasets}}'
{
  "site_id": "x9HTLHECq",
  "blog_id": 233,
  "domain": "test.onpress.pro",
  "home": "https://test.onpress.pro",
  "is_super_admin": true,
  "realm": "prod",
  "public": 1,
  "blog_public": 1,
  "theme": { "template": "onpress-v2", "stylesheet": "onpress-v2", "current_theme": "onpress-v2" },
  "show_on_front": "page",
  "page_on_front": 5776,
  "languages": { "default": "en", "list": ["en", "ru"] },
  "counts": { "pages": 101, "menus": 14, "frames": 23, "datasets": 4 }
}

Отсюда берут site_id для адресов /api/v2/site/{site_id}/…. Ещё в карточке: archived, deleted (флаги сети), registered, last_updated, blogname, blogdescription, site_icon, instance_realm (какой экземпляр API ответил) и counts.post_types — сколько записей каждого типа. Списка сайтов в v2 нет; все свои сайты с номерами отдаёт GET https://onpress.pro/wp-json/onpress/v1/sites с тем же токеном (data[].id).

Создать сайт

Новый сайт — клон сайта-донора. С empty: true из клона удаляется всё содержимое, остаётся «дизайн»: тема, языки, токены, собственный CSS и выбранные фреймы.

curl -s -X POST "$API/sites" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{
    "name": "pomelli",
    "title": "Pomelli",
    "donor": 233,
    "empty": true,
    "keep_frames": ["site__header", "site__footer", "article"],
    "copy_files": false,
    "public": false
  }' | jq '{site_id, blog_id, domain, realm, purged: .purged | {pages, menus, datasets, frames, frames_kept, frames_missing}}'
{
  "site_id": "LBmdCw6ri",
  "blog_id": 241,
  "domain": "pomelli.onpress.pro",
  "realm": "prod",
  "purged": { "pages": 21, "menus": 6, "datasets": 4, "frames": 20, "frames_kept": { "cb7ccee58078d1fb": "site__header" }, "frames_missing": [] }
}
ПолеСмысл
nameподдомен: латиница в нижнем регистре, цифры и дефисы, до 50 символов; нельзя www, api, admin, mail, ftp, cdn, static, app, apps, stage, test. Сайт получит <name>.onpress.pro
titleназвание; по умолчанию name
donorномер блога сайта-донора
emptyочистить содержимое после клона; по умолчанию false
keep_framesмассив слагов или id фреймов, которые сохранить при empty: true; одиночное значение или true — 400 invalid_keep_frames; без empty: true — тоже ошибка
copy_filesкопировать загрузки донора; по умолчанию true. С empty: true передавайте false — на файлы не останется ссылок
publicfalse — сразу закрыть от поисковиков; не указано — как у донора

Что удаляет empty (только в таблицах нового сайта): все записи любых типов с метой и связями, группы переводов, меню и их привязки, приложения, наборы данных, фреймы вне keep_frames с их копиями, служебные кэши, индексы Yoast, настройки и счётчики аналитики донора, состояние мастера домена; главная, страница блога, иконка и логотип обнуляются. Что остаётся: тема, языки и настройки Polylang, собственный CSS и токены, пользователи и роли, сохранённые фреймы.

Клон идёт синхронно, десятки секунд (ожидание до 300 с). Сайт с тем же доменом — 409 site_exists с его blog_id: повторять безопасно. Другие ответы: 400 invalid_name, 400 invalid_donor, 404 donor_not_found, 500 purge_failed (клон создан, blog_id в ответе, очистка остановилась, за пределы нового сайта ничего не вышло).

Сайт помечается контуром создавшего его экземпляра API (realm). После создания: страницы нового сайта собираются из исходников сохранённых фреймов, поэтому сразу показывают свои меню и данные; только статические копии остаются от донора до пересборки — после настройки меню и данных вызовите POST /frames/rebake {"all": true}.

Домен сайта

Эта ручка переводит сайт на домен, который сеть уже обслуживает, — например обменивает домены двух сайтов. Регистратор, DNS, веб-сервер и сертификаты она не трогает. Подключить к сети новый внешний домен — это раздел «Домен» дашборда (мастер: DNS, SSL, применение) или ручки первой версии /wp-json/onpress/v1/domain/*.

Назначить свободный домен:

curl -s -X POST "$API/sites/241/domain" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"domain": "pomelli.help", "dry_run": true}' | jq .

Обменять домены двух сайтов — сайт из пути забирает domain у swap_with, а тот получает нынешний домен сайта из пути, одним атомарным вызовом:

curl -s -X POST "$API/sites/241/domain" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"domain": "pomelli.help", "swap_with": 240}' | jq '{mode, changed, sites: [.sites[] | {blog_id, domain, home, stale}], warnings}'
ПолеПо умолчаниюСмысл
domain—только имя хоста, минимум два уровня, до 253 символов; схема, порт и путь отбрасываются
swap_with—второй сайт обмена (номер или site_id); должен владеть domain прямо сейчас
dry_runfalseвернуть план и ничего не менять
stale_reporttrueпосчитать, сколько строк ещё содержат старый домен (sites[].stale)
flushtrueсбросить кэши обоих сайтов
rebaketrueпересобрать все фреймы обоих сайтов — в копиях абсолютные адреса

Что делается с каждым сайтом: home и siteurl переписываются на новый хост, правила адресов и кэши языков сбрасываются, каталоги кэша страниц старого и нового хоста чистятся, затем на новом домене сайта SEO и языки перечитывают адреса, сбрасываются кэши и пересобираются фреймы. Настройка мастера домена (onpress_domain) переезжает вместе с доменом — поле domain_option. Тексты страниц не переписываются: картинки в v2 пишутся путями от корня, а остатки старого хоста посчитаны в stale.

Повтор того же вызова безопасен и доводит прерванный: домен уже на месте — changed: false, строки не двигаются, но адреса и кэши приводятся в порядок. Отката нет: обратный вызов с переставленными сайтами возвращает всё назад.

КодHTTPКогда
invalid_domain400не имя хоста
invalid_swap_with400не номер сайта или сам сайт
unknown_field400лишнее поле
site_not_found404нет такого сайта
site_deleted409сайт помечен удалённым
main_site_locked409главный сайт сети домен не меняет, домен сети не отдаётся сайту
domain_taken409домен у другого сайта, а swap_with не указан; владелец в blog_id
swap_domain_mismatch409swap_with сейчас не владеет domain
domain_busy409идёт другая смена домена
domain_changed_meanwhile409домен сдвинулся между планом и блокировкой
domain_move_failed500ядро отказало; сделанные шаги откачены (rolled_back, done)
internal_unavailable502исполнитель не ответил за 120 с

Снять с эфира и удалить

Два режима, безопасный — по умолчанию:

modeЧто происходит
archiveсайт снят с эфира, всё цело: флаги deleted и archived, закрыт от поисковиков, статические копии и кэш страниц убраны (иначе веб-сервер продолжал бы отдавать копии). Таблицы, файлы и запись сайта остаются. Возвращается POST /sites/{id}/restore
purgeвсё: таблицы сайта, файлы, приложения, статика, кэш, запись в реестре сети, ключи пользователей. Необратимо
# план архивации
curl -s -X DELETE "$API/sites/247" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"dry_run": true}' | jq '{mode, plan: .plan | {domain, tables_count, content, users, confirm_required, confirm_with}}'

# полное удаление: сначала план, потом с подтверждением доменом
curl -s -X DELETE "$API/sites/247" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"mode": "purge", "dry_run": true}' | jq '.plan.confirm_with'

curl -s -X DELETE "$API/sites/247" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"mode": "purge", "confirm": "agentdel1.onpress.pro"}' | jq '{mode, verify}'
ПолеСмысл
modearchive (по умолчанию) или purge
dry_runплан без изменений
confirmдомен сайта; обязателен для purge непустого сайта (точная строка — в plan.confirm_with)
drop_orphan_usersпри purge удалить учётные записи, которые состоят только в этом сайте (суперадмины и пользователь 1 не удаляются никогда)

Пустой сайт (нет страниц, записей, вложений, приложений и файлов) удаляется без confirm; иначе — 428 confirmation_required с планом. Главный сайт сети не удаляется никогда — 409 main_site_protected. Перед удалением таблиц каждое имя проверяется на принадлежность именно этому сайту; не прошедшие проверку перечислены в plan.tables_rejected и не трогаются. Ответ purge несёт verify — сверку после работы: сколько таблиц осталось, не задеты ли соседние сайты. Заказы и журналы оплат сети сохраняются.

Другие ответы: 400 invalid_mode, 400 unknown_field, 400 invalid_drop_orphan_users (без purge), 404 site_not_found, 409 site_already_gone (archive сайта без записи в реестре), 500 unsafe_table.

Вернуть на эфир

curl -s -X POST "$API/sites/248/restore" -H "Authorization: Bearer $OP_TOKEN" | jq '{blog_id, domain, archived, deleted, public, restored_from, rebake: .rebake.status}'

Снимает флаги архива, возвращает прежнюю видимость и пересобирает фреймы, чтобы вернулись статические копии. Неудачная пересборка не отменяет возврат — повторите вызов. После purge возвращать нечего — 404 site_not_found.

arrow_backНазад
Медиа
Далееarrow_forward
Пользователи и профиль
На этой странице
  • Карточка сайта
    • Создать сайт
      • Домен сайта
        • Снять с эфира и удалить
          • Вернуть на эфир
          OnPress
          OnPress
          ИП Зуев И.В. ИНН: 360408359441
          © 2026
          политика конфиденциальности публичная оферта
          • visa
          • mastercard
          • sber
          • tpay