• Быстрый старт
    • Доступ и токен
  • СУЩНОСТИ
    • Страницы
      • Markdown
      • Аналитика страниц
    • Фреймы
      • Блоки
      • Бинды data-op-bind
      • Повторитель onpress/repeat
      • Сборка и копии
      • Фреймы в Markdown
      • Фреймы с данными
      • Готовые фреймы
    • Данные
    • Медиа
  • УСТРОЙСТВО САЙТА
    • Сайты
    • Настройки сайта
    • Меню
    • Языки и переводы
    • Стили и оформление
  • УПРАВЛЕНИЕ
    • Домены
    • Соцсети и контакты
    • SEO
    • Аналитика
    • Кэш
    • Дашборд и вход
    • Пользователи и профиль
    • Сайдбар документации
    • Ошибки и проблемы
  • КЕЙСЫ
    • Создание сайтов
    • Работа с контентом
    • Фреймы и данные
    • Настройка сайта
    • Перевод страницы
  • ПРИЛОЖЕНИЯ
    • Приложения
      • Закрытый доступ
      • Данные приложения
      • Внешние данные
      • Демо
    • Быстрый старт
    • Доступ и токен
  • СУЩНОСТИ
    • Страницы
    • Фреймы
    • Данные
    • Медиа
  • УСТРОЙСТВО САЙТА
    • Сайты
    • Настройки сайта
    • Меню
    • Языки и переводы
    • Стили и оформление
  • УПРАВЛЕНИЕ
    • Домены
    • Соцсети и контакты
    • SEO
    • Аналитика
    • Кэш
    • Дашборд и вход
    • Пользователи и профиль
    • Сайдбар документации
    • Ошибки и проблемы
    • Редиректы
    • Кредиты и автоматизация
    • Входящие
    • Кросспостинг
OnPress OnPress
  • Документация
  • Контакты
Войти
Обзор Справочник API
    • Быстрый старт
    • Доступ и токен
  • СУЩНОСТИ
    • Страницы
      • Markdown
      • Аналитика страниц
    • Фреймы
      • Блоки
      • Бинды data-op-bind
      • Повторитель onpress/repeat
      • Сборка и копии
      • Фреймы в Markdown
      • Фреймы с данными
      • Готовые фреймы
    • Данные
    • Медиа
  • УСТРОЙСТВО САЙТА
    • Сайты
    • Настройки сайта
    • Меню
    • Языки и переводы
    • Стили и оформление
  • УПРАВЛЕНИЕ
    • Домены
    • Соцсети и контакты
    • SEO
    • Аналитика
    • Кэш
    • Дашборд и вход
    • Пользователи и профиль
    • Сайдбар документации
    • Ошибки и проблемы
  • КЕЙСЫ
    • Создание сайтов
    • Работа с контентом
    • Фреймы и данные
    • Настройка сайта
    • Перевод страницы
  • ПРИЛОЖЕНИЯ
    • Приложения
      • Закрытый доступ
      • Данные приложения
      • Внешние данные
      • Демо
    • Быстрый старт
    • Доступ и токен
  • СУЩНОСТИ
    • Страницы
    • Фреймы
    • Данные
    • Медиа
  • УСТРОЙСТВО САЙТА
    • Сайты
    • Настройки сайта
    • Меню
    • Языки и переводы
    • Стили и оформление
  • УПРАВЛЕНИЕ
    • Домены
    • Соцсети и контакты
    • SEO
    • Аналитика
    • Кэш
    • Дашборд и вход
    • Пользователи и профиль
    • Сайдбар документации
    • Ошибки и проблемы
    • Редиректы
    • Кредиты и автоматизация
    • Входящие
    • Кросспостинг
Markdown
Открыть в ИИ
  • Открыть в ChatGPT
  • Открыть в Claude
  • Открыть в Gemini
  • Открыть в Perplexity
  • Открыть в Grok
  • Открыть в DeepSeek

Сборка страницы и статическая копия

У страницы с фреймом два способа попасть к посетителю: сборка на запросе (PHP собирает фрейм по шаблону для этой страницы) и статическая копия (готовый HTML лежит файлом, веб-сервер отдаёт его без PHP за миллисекунды). Какой способ выбран, решает не страница и не вы, а содержимое фрейма.

Сборка на запросе

  1. По адресу находится страница и её язык.
  2. Тема берёт фрейм страницы (_onpress_frame) и собирает его из исходника: выполняет каждый блок onpress/… для этой страницы и этого языка, подставляет data-op-bind. Вложенные вызовом frame/… фреймы собираются так же, в том же контексте.
  3. Результат оборачивается в документ темы — <head> с SEO, иконками, стилями темы, CSS-переменными, собственным CSS и счётчиками. Если фрейм сам является документом (<!doctype html>), обвязка встраивается в его <head> и <body>.
  4. Ответ кладётся в кэш страниц.

Всё, что меняется через API (меню, наборы, языки, настройки, вложенные фреймы), попадает на такие страницы на следующем же запросе — API сам сбрасывает кэш затронутых страниц.

Статическая копия

Страница становится файлом, когда выполнены все условия:

УсловиеПричина отказа (reason)
страница опубликована и без пароляnot_public
у неё есть фреймno_frame
ни фрейм, ни тело страницы, ни секции, которые тело зовёт, не зависят от запроса (зависимость от самой страницы — тела и её полей — копии не мешает, см. ниже)renders_on_request, причины — в request_reasons
страница не отвечает 404 по замыслу (страница 404)answers_404
адрес ложится в дерево файлов: латиница без процентов, первый сегмент не зарезервирован платформой, адрес не занят другим приложениемbad_path

Когда условие перестаёт выполняться, копия снимается, а не остаётся устаревшей. Копия — это ответ сайта, снятый целиком, вместе с обвязкой <head>, поэтому SEO и счётчики в ней те же, что при сборке на запросе.

Состояние копии видно в трёх местах:

  • в ответе публикации — printed: {"how": "static", "url": "/promo/", "published_by": "php", …};
  • в списке и карточке страницы — static: {"published": true, "url": "/promo/", "app_key": "page-6432"};
  • в ответах PATCH /pages/{ref} и POST /frames/{ref}/assign — static с полями published, url, path, bytes, reason, was_published, was_url, removed, changed.
printed.howЧто значит
staticстраница отдаётся копией; per_page: true — фрейм зависит от страницы, но у каждой его страницы своя копия
on_requestфрейм, тело или вызванная секция зависят от запроса — собирается на каждом запросе, причины в request_reasons
not_publishedу страницы пока нет адреса: черновик, отложена или неопубликованный родитель
themeу страницы нет фрейма. На сайте v2 это 404 — см. ниже

Когда фрейм зависит от страницы

Фрейм получает renders_on_request: true, если в нём есть хоть одно из:

ПризнакКак выглядит в live_reasons
блоки onpress/content, onpress/pager, onpress/docs-nav, onpress/outline, onpress/share-ai, onpress/featured-image, onpress/terms, onpress/assistant, onpress/faq-schema, onpress/assistant-welcomeinserts: op/content, …
data-op-bind с токеном page.* или атрибут блока, целиком равный токену page.*data-op-bind uses page.* tokens
onpress/repeat с match от page.*op/repeat match uses page.* tokens
onpress/repeat с limit или offset от page.*op/repeat limit/offset uses page.* tokens
повторитель по контекстному источнику: pages.children, pages.siblings, pages.adjacent, pages.translations, breadcrumbscontextual sources: breadcrumbs
вложенный вызовом frame/… зависимый фрейм— (правило транзитивное)

Фрейм с параметрами вызова (<!-- frame/… {"agent":"…"} /-->) и фрейм со слотом собираются на месте вызова из исходника: своей копии с чужими параметрами или чужим содержимым у них нет.

Вызов фрейма в теле страницы собирается вместе с телом. Оглавление onpress/outline в теле собирается после всего тела, поэтому видит те же заголовки и якоря, что и оглавление во фрейме страницы. Если FAQ-фреймов в теле несколько, их схемы FAQPage при сборке тела сливаются в первую, остальные снимаются.

Общей копии у такого фрейма нет: она показала бы на всех страницах текст одной. Не делают фрейм зависимым: onpress/faq (вопросы внутри блока), onpress/repeat по набору без page.*, onpress/repeat {"empty":"frame"}, вложенный повторитель item.<поле>, фреймы menu, footer-columns, socials и copyright.

Зависимость от страницы и статика

Зависимость бывает двух видов, и статику отменяет только второй.

Известна при сборке. Тело страницы через onpress/content, вопросы onpress/faq-schema и токены page.id, page.title, page.url, page.slug, page.data.<ключ>, page.meta.<ключ> — в привязках, атрибутах блоков и match повторителя. На каждом запросе одного адреса они одинаковы, поэтому страница всё равно становится файлом: копия снимается с ответа именно этой страницы. Такой фрейм помечен static_per_page: true в списке и карточке фрейма. Так устроены лендинги на вызовах: оболочка с onpress/content, тело — вызовы секционных фреймов. Так же site__cta, который показывается по флагу страницы {"match": {"show": "page.data.cta"}}, и подвал, который его вкладывает.

Зависит от запроса. Разбивка по номеру страницы (page.paged, limit/offset от page.*), контекстные списки (pages.children, pages.siblings, pages.adjacent, pages.translations, breadcrumbs), прочие блоки из таблицы выше и остальные токены page.* (дата, автор). Это проверяется у фрейма страницы, у вложенных в него фреймов, у тела страницы и у секций, которые тело зовёт, — в том числе названных данными вызова ({"name": "item.art"}): их видно только при сборке, и если среди собранных попался такой фрейм, копия снимается. Причины видны в request_reasons ответа публикации.

Как сделать страницу файлом. Держите во фрейме, теле и секциях только то, что известно при сборке. Лендинг с телом из вызовов секций, флагами страницы и подвалом станет файлом; лента с разбивкой на страницы, оболочка документации с навигацией по разделу или статья с оглавлением onpress/outline собираются на запросе — и это правильно.

Копии по языкам

Фрейм с языкозависимыми блоками (onpress/repeat, вызов frame/…, onpress/content, onpress/docs-nav, onpress/outline, onpress/share-ai, onpress/pager, onpress/partial) собирается отдельно на каждый язык сайта: копия основного языка и копии остальных. Фрейм без таких блоков собирается один раз. Страница получает копию своего языка.

Пересборка

Копии обновляются, когда меняется то, из чего они собраны. API делает это сам после каждой записи и сообщает результат полем rebaked:

ЗаписьКого пересобирает
POST/PUT/PATCH/DELETE /frames/…фреймы, вкладывающие изменённый, транзитивно, и копии страниц, чьё тело зовёт его по имени — в том числе иллюстрации art__*, названные в данных вызова
любая запись менюфреймы с повторителями и биндами по menu.*, например menu и footer-columns
запись набора данных (PUT, PATCH, DELETE /data/{name})фреймы, читающие этот набор, вкладывающие их и копии страниц, чьё тело зовёт такую секцию
правка тела страницыкопия этой страницы
запись системного источника через /data/…зависимых от этого источника
"rebaked": {
  "status": "ok",
  "total": 2,
  "baked": 0,
  "not_needed": 2,
  "frames": [
    { "id": "838a082b034be249", "slug": "article__faq", "because": ["datasets: faq"], "bake": "not_needed", "detail": "renders on request from the source, has no baked copy" },
    { "id": "e627bf4dbefcc374", "slug": "article", "because": ["contains article__faq"], "bake": "not_needed", "detail": "renders on request from the source, has no baked copy" }
  ],
  "cache": { "status": "ok", "scope": "pages", "pages": [6428], "flushed": { "urls": { "status": "flushed", "urls": ["https://example.onpress.pro/tarify/"] } } }
}
ПолеСмысл
statusok — всё нужное собрано; partial — часть; failed — ничего; nothing — от изменения никто не зависит
totalсколько фреймов найдено
bakedсколько сборок сделано: языкозависимый фрейм собирается по разу на язык
not_neededфреймы на запросе — копии у них нет, собирать нечего. У фрейма с static_per_page вместо этого bake: "ok", static: "per_page" и pages — копии его страниц собраны заново
framesпо записи на сборку: slug, lang, because (почему попал), bake (ok, not_needed, ошибка), pages (страницы фрейма)
pagesстраницы, у которых зависимый блок стоит прямо в теле: id и because (datasets: faq, nested frames: …, contains …); есть, только если такие нашлись
staticкопии страниц из pages, собранные заново: status и по странице id, published, url, reason (renders_on_request — страница собирается на запросе, ей хватает сброса кэша)
cacheсброс кэша страниц, которые собираются этими фреймами, включая фреймы на запросе, и страниц из pages. scope: "pages" — точечно по адресам; scope: "site" — весь кэш сайта, если зависимых страниц больше 400
skipped, capза один вызов пересобирается не больше 25 фреймов, остальные перечислены здесь

Неудачная пересборка никогда не отменяет запись: данные уже сохранены, копию можно пересобрать повтором или вручную.

Зависимые страницы находятся по фрейму страницы и цепочке вызовов frame/… внутри фреймов, а также по блокам в теле страницы: onpress/repeat по набору, вызов frame/… (и все, что вложено в этот фрейм), привязки и прочие блоки тела разбираются так же, как во фрейме. Такие страницы приходят в pages, их кэш сбрасывается вместе с остальными.

Ручная пересборка

Нужна, когда изменение прошло мимо API или копии надо обновить после обновления платформы:

# всё
curl -s -X POST "$API/site/$SITE/frames/rebake" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"all": true}' | jq '.rebaked | {status, total, baked, not_needed}'

# только то, что зависит от меню и от набора faq
curl -s -X POST "$API/site/$SITE/frames/rebake" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"menus": true, "datasets": ["faq"]}' | jq '.rebaked.frames[] | {slug, because, bake}'
Поле телаКого пересобирает
allвсе фреймы сайта
menusфреймы с меню: повторители и бинды по menu.*
pagesфреймы, выводящие страницы, их заголовки и адреса: меню, зависимые от страницы блоки, повторители по pages.*, breadcrumbs, site.front_page, бинды page.*
languagesфреймы с языкозависимыми блоками, повторителями по site.languages, биндом site.lang
settingsфреймы с повторителями по site.settings и site.front_page, биндами site.* и option.*
datasetsмассив имён наборов
framesмассив слагов или id — фреймы, вкладывающие эти

Пустое тело — 400 nothing_to_rebake. Изменения мимо API платформа ловит и сама (правка меню, сохранение страницы, изменение опций ставят в очередь тех же зависимых), ручной вызов — для уверенности.

Кэш страниц

Готовые ответы лежат в кэше страниц, и отдаёт их веб-сервер. Все записи API сбрасывают кэш сами: запись фрейма, меню и набора — кэш зависимых страниц, запись CSS и CSS-переменных — весь кэш сайта, настройки, языки и SEO — весь кэш сайта и объектный кэш. Если правка не видна:

# точечно по адресам или id страниц
curl -s -X POST "$API/site/$SITE/cache/flush" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"urls": ["/tarify/"]}' | jq .flushed

# весь кэш страниц сайта
curl -s -X POST "$API/site/$SITE/cache/flush" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"supercache": true}' | jq .flushed

Подробно — настройки, главная и кэш. Проверяйте результат запросом без кук (curl по адресу страницы): запрос с куками входа видит страницы мимо кэша.

Страница без фрейма и страница 404

На сайте v2 страницу выводит только её фрейм. Опубликованная страница без фрейма (или с удалённым фреймом) отвечает 404, не попадает в кэш и помечается noindex — чтобы по адресу не жила пустая или чужая разметка.

Ответ «не найдено» собирает страница сайта со слагом 404, если она опубликована и у неё есть фрейм: такой же страницей, как остальные, со своим текстом и оболочкой. Её собственный адрес тоже отвечает 404, чтобы поисковик не принял её за обычную страницу. Нет такой страницы — ответ пустой с кодом 404. Опубликуйте страницу 404 на каждом языке сайта — и все несуществующие адреса получат оформленный ответ.

Отчёт сборки

Ответ записи фрейма несёт bake.response — отчёт сборки на стороне сайта:

ПолеСмысл
bakedсобрано
bytes, source_bytesразмер результата и исходника
renders_on_requestфрейм зависит от страницы — общей копии не хранится
static_per_pageзависимость только от того, что известно при сборке: копии получают его страницы
lang, default_langязык сборки
inserts, unknown_insertsсколько блоков выполнено; блоки, которых платформа не знает
binds, bind_tagsподставленных значений и помеченных тегов
unresolvedтокены без значения
repeatsчто вывели повторители: источник, откуда взят, сколько элементов
framesвложенные фреймы: выведен ли, глубина, свои unresolved
publishedкопии страниц этого фрейма: pages[] с id, url, published, path, bytes, reason

bake.status: ok — собрано; unavailable — исполнитель на сайте не установлен, исходник сохранён; failed — исполнитель ответил ошибкой или не ответил (reason); skipped — сборка выключена ("bake": false).

arrow_backНазад
Бинды data-op-bind
Далееarrow_forward
Фреймы в markdown
На этой странице
  • Сборка на запросе
    • Статическая копия
      • Когда фрейм зависит от страницы
        • Зависимость от страницы и статика
      • Копии по языкам
        • Пересборка
          • Ручная пересборка
        • Кэш страниц
          • Страница без фрейма и страница 404
            • Отчёт сборки
            1. Главная
            2. Docs
            3. Документация OnPress v2
            4. Обзор
            5. Фреймы
            6. Сборка страницы и статическая копия
            OnPress
            OnPress
            ИП Зуев И.В. ИНН: 360408359441
            info@onpress.pro
            © 2026
            политика конфиденциальности публичная оферта
            • visa
            • mastercard
            • sber
            • tpay