Меню
Меню — это пункты навигации в шапке и подвале сайта. Это системные данные: с ними работают через один эндпоинт /data/menu.{область}, где область — header для шапки или footer_1, footer_2, footer_3 для колонок подвала. Кроме них можно завести собственное меню, например для сайдбара документации: это пользовательские данные с любым именем, например menu.docs.
Меню хранится как JSON-список пунктов, поэтому AI-агенту не нужна консоль: он читает список, правит его и записывает обратно, и новое меню сразу появляется на всех страницах сайта.
Во всех примерах API — https://onpress.pro/api/v2, SITE — id сайта (SITE_ID), OP_TOKEN — токен op_XXXX. Полный перечень эндпоинтов — в справочнике API.
Прочитать
GET /data/menu.{область} отдаёт пункты меню деревом. Например, меню шапки:
curl -s "$API/site/$SITE/data/menu.header" -H "Authorization: Bearer $OP_TOKEN"
| Поле | Что это |
|---|---|
title | подпись пункта |
url | адрес пункта |
object_id | id страницы, если пункт ведёт на страницу сайта |
children | вложенные пункты |
Изменить
PUT /data/menu.{область} заменяет меню целиком, поэтому в запросе передают весь список пунктов. Пункт на страницу сайта задают как {"page": id или путь}: он следует за страницей, даже если её адрес изменится. Внешнюю ссылку задают как {"url": …}, подпись — в title, вложенные пункты — в children. Например, меню шапки с вложенным пунктом и внешней ссылкой:
curl -s -X PUT "$API/site/$SITE/data/menu.header" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"items": [
{"page": "/docs/", "title": "Документация", "children": [{"page": "/docs/v2/ru/guides/quickstart/"}]},
{"url": "https://example.com", "title": "Партнёры", "target": "_blank"}
]}'
Создать меню
Если в области ещё нет меню, запись отвечает 404 menu_not_assigned. Тогда меню создают через POST /menus: с location оно сразу встаёт в нужную область. Например, меню шапки из двух пунктов:
curl -s -X POST "$API/site/$SITE/menus" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "Шапка", "location": "header", "items": [
{"page": "/docs/", "title": "Документация"},
{"url": "https://example.com", "title": "Партнёры"}
]}'
Поставить готовое меню в другую область можно через PUT /menus/{id}/location, снять — через DELETE /menus/{id}/location. Правка отдельных пунктов, порядок и удаление меню описаны в справочнике API.
Языки
У каждого языка своё меню. Чтобы сделать меню на другом языке, прочитайте исходное меню с параметром lang, например ?lang=ru, переведите подписи, замените страницы на их переводы и запишите меню с параметром lang нового языка. Например, английское меню из русского:
curl -s "$API/site/$SITE/data/menu.header?lang=ru" -H "Authorization: Bearer $OP_TOKEN"
curl -s -X PUT "$API/site/$SITE/data/menu.header" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"lang": "en", "items": [
{"page": "/en/docs/", "title": "Docs"},
{"url": "https://example.com", "title": "Партнёры", "target": "_blank"}
]}'
Вывести на странице
Меню на странице выводит системный фрейм menu. Поставьте его во фрейм или в текст страницы и укажите область параметром place. Без place фрейм выводит меню шапки. Например, меню первой колонки подвала:
<!-- frame/menu {"place":"footer_1"} /-->
Верстку меню можно менять. Внутри фрейма стоит повторитель по menu.header и вложенный повторитель по item.children. Теги, классы и глубину задает разметка фрейма, а не платформа. Если фрейма на сайте нет, поставьте его из библиотеки через POST /site/{site_id}/frames/system/menu/install. Затем правьте разметку через PUT /frames/menu, как у любого фрейма. Параметр depth со значением 1 оставляет только верхний уровень. Свернутое меню выводит фрейм menu--dropdown, подпись задает параметр label. Колонки подвала с заголовками выводит фрейм footer-columns. Все системные фреймы — в разделе Готовые фреймы.
Вопросы и ответы
Почему после записи у пунктов новые id?
PUT удаляет прежние пункты и создаёт их заново, поэтому id пунктов меняются. Пункт на страницу находят по object_id: он остаётся прежним.
Почему пункт на страницу стал обычной ссылкой?
При записи пункт передали с url, а не с page. Такой пункт сломается, если адрес страницы изменится. Пункты на страницы переносите как {"page": object_id}.
Почему пункт не виден на сайте?
Пункт ведёт на страницу, которую посетитель не увидит: она в черновике, приватная или удалена. При чтении такие пункты отбрасываются, их число — в meta.invalid_items. Опубликуйте страницу или уберите пункт.
Почему API не записал меню?
В меню есть пункт на неопубликованную страницу — 409 menu_items_invalid — или на страницу, которой нет, — 409 menu_items_unresolved. В обоих случаях меню не меняется: опубликуйте страницу или уберите пункт и запишите меню ещё раз.
Где коды ошибок?
В справочнике API. Ответ с ошибкой сам называет причину.