Введение
Что такое OnPress v2, из каких сущностей она собрана, главное правило разработки и как API v2 соотносится с API v1.
OnPress v2 — платформа сайтов на мультисайтовом WordPress, у которой рабочее место не админка, а API. Человек ставит задачу, агент публикует страницы, заливает разметку и меняет оформление запросами. Вторая версия так и проектировалась: ожидаемый потребитель API v2 — агент, а wp-admin — легаси, из которого уходит всё, для чего появилась ручка.
Три сущности и данные
Страница — это markdown. Frontmatter несёт то, что в первой версии набивали в метабоксах: имя, слаг, путь в дереве, язык, SEO-поля, лид, фрейм страницы; тело конвертируется в блоки Гутенберга. Редактор при этом никто не открывает, и открывать его не нужно. Подробно — Страницы и markdown и Синтаксис markdown.
Внешний вид — это фрейм. Готовая разметка, залитая как есть: оболочка статьи, шапка, подвал, блок FAQ, целый лендинг из конструктора. Внутри ничего не переписывается и не санируется — инлайновый <script> переживает заливку байт в байт. Страница привязана ровно к одному фрейму, фреймы подтягивают друг друга по имени через op/frame. Живые части — вставки (op/menu, op/content, op/repeat и остальные) и бинды (data-op-bind). Подробно — Фреймы.
Оформление — это токены дизайна и произвольный CSS. Закрытый набор именованных значений с дефолтами из темы плюс один свободный стилевой файл поверх. И то и другое читается и переписывается запросом. Подробно — Стили.
Данные — это то, что печатают повторители. Свои наборы (FAQ, колонки подвала, список ссылок) с языковыми вариантами и системные источники, которые платформа считает сама: меню, языки, дочерние страницы, хлебные крошки. Фрейм не держит список внутри себя, он повторяет источник. Подробно — Данные.
Всё остальное — ручная вёрстка в редакторе, произвольные ACF-макеты, конструкторы меню — во вторую версию не входит и остаётся легаси первой.
Правило: только через ручку
Любая операция с платформой выполняется через ручку API, а не руками. Нет ручки — сначала пишется ручка, потом ею делается работа. Результат задачи — ручка плюс её вызов, а не изменённое состояние сайта: состояние, созданное мимо API, невоспроизводимо, не повторяется на другом сайте и не проверяется тем же API, которым было бы создано.
Для читателя из этого следует одно: если где-то здесь написано «зайдите в админку», это дыра, которую ещё предстоит закрыть, а не способ работы.
Два API рядом
В OnPress одновременно работают два контура API. Задачи у них разные, а с переходом на токен доступ у них общий.
| API v1 | API v2 | |
|---|---|---|
| Адрес | https://<сайт>/wp-json/onpress/v1/ | https://stagepress.bond/api/v2/ |
| На чём | PHP внутри WordPress | Node.js, пишет в базу, не поднимая WordPress |
| Авторизация | Application Password (Basic) или токен op_ | только токен op_ |
| Сайт сети | домен сайта в адресе | blog_id или domain в запросе |
| Что умеет | легаси: аппы, почта, список сайтов, дерево страниц для дашборда, выпуск токена | фреймы и перепечка, данные, токены дизайна, CSS, меню, сайдбар документации, публикация markdown, язык страниц, переводы, медиа, сайты и настройки |
Токен op_ открывает оба: v1 принимает его через адаптер в mu-плагине onpress-api-keys, а дашборд ходит в v1 и v2 одним токеном. Application Password остаётся для v1 и ещё для одного — выпустить первый токен без браузера. Подробно — Аутентификация.
Где всё хранится
Фреймы, наборы данных, произвольный CSS и токены дизайна лежат в опциях того сайта сети, к которому относятся. Сетевых опций нет сознательно: стенд делит базу с боевыми сайтами, и сетевая опция выкатилась бы сразу на всю сеть. Этим же объясняется, почему каждый запрос называет свой сайт: без blog_id или domain запрос уходит в блог 1, главный боевой сайт. Подробнее — Как это устроено.
Куда дальше
Быстрый старт доводит от пустых рук до опубликованной страницы. Как это устроено объясняет печать, перепечку и разделение работы между Node и PHP. Справочник API перечисляет все ручки, а рецепты проводят типовые задачи от начала до конца.