Переименовать фрейм
Перевести фрейм со старого транслитерированного слага на имя вида block__element одним вызовом. Фреймы, которые его подключают, переписываются и перепекаются, страницы продолжают работать, потому что держат id.
Первые фреймы называли транслитерацией человеческого имени: shapka-sajta, vrezka-voprosy-i-otvety. Слаг проходит проверку, но ничего не говорит о том, куда фрейм встаёт: block, element и modifier выводятся из слага, так что такой фрейм оказывается отдельным блоком, и GET /frames?block=site его не находит. Переименование переводит его на имя вида block__element — site__header, article__faq — без повторной заливки.
1. Посмотреть на фрейм и на тех, кто его использует
GET /frames/{ref} возвращает фрейм с разметкой, а если другие фреймы вставляют его через op/frame, — их слаги в referenced_by.
curl -s -H "Authorization: Bearer $OP_TOKEN" "$BASE/frames/shapka-sajta?blog_id=233"
{
"success": true,
"blog_id": 233,
"frame": {
"id": "cb7ccee58078d1fb",
"name": "Шапка сайта",
"slug": "shapka-sajta",
"block": "shapka-sajta",
"element": null,
"modifier": null,
"inserts": { "op/lang-switcher": 2, "op/menu": 1 },
"frame_refs": [],
"binds": 8,
"option": "onpress_frame_cb7ccee58078d1fb",
"html": "…",
"…": "…"
}
}
referenced_by нет: по имени эту шапку не подключает ни один фрейм, так что переименование не затронет ничего, кроме самого фрейма. Фрейм, который подключают, выглядит так:
{
"success": true,
"blog_id": 233,
"frame": {
"id": "35552939b0ea754f",
"name": "Врезка: вопросы и ответы",
"slug": "vrezka-voprosy-i-otvety",
"sources": ["faq"],
"renders_on_request": true,
"referenced_by": ["obolochka-so-vstavkoj"],
"…": "…"
}
}
2. Убедиться, что новый слаг свободен
Слаг уникален в пределах сайта. Если GET /frames/site__header отвечает 404, слаг свободен:
{
"success": false,
"error": "frame_not_found",
"message": "there is no frame \"site__header\" on this site",
"ref": "site__header"
}
Если занят, переименование отклоняется с 409 slug_taken и ничего не меняется; ответ называет фрейм, у которого этот слаг:
{
"success": false,
"error": "slug_taken",
"message": "slug \"site__header\" is already used by frame 164ec859ae2d9cfa; to replace its markup use PUT /frames/site__header",
"slug": "site__header",
"id": "164ec859ae2d9cfa"
}
Тогда решите, какой из двух фреймов настоящая шапка: либо удалите второй, либо сначала переименуйте его в сторону.
3. Переименовать
PATCH /frames/{ref} меняет slug и name, не трогая разметку (поля url у фрейма нет — адрес принадлежит странице). Передайте и name, чтобы человеческое имя шло в ногу со слагом.
curl -s -X PATCH -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
"$BASE/frames/shapka-sajta" -d '{"blog_id": 233, "slug": "site__header", "name": "Site: header"}'
Если переименованный фрейм подключают другие, ответ перечисляет, что переписано. Вот переименование faq в article__faq на стенде, где его подключали две оболочки:
{
"success": true,
"blog_id": 235,
"frame": { "id": "4b0e7c21d9a3f610", "slug": "article__faq", "name": "Статья: FAQ", "block": "article", "element": "faq", "modifier": null },
"renamed": {
"from": "faq",
"to": "article__faq",
"frames_updated": ["article", "landing"],
"details": [
{ "id": "91399e3637b7aa2b", "slug": "article", "replaced": 1 },
{ "id": "…", "slug": "landing", "replaced": 1 }
]
},
"bake": { "status": "ok" },
"rebaked": { "status": "ok", "frames": ["…"] }
}
dry_run у переименования нет; предпросмотр frames_updated — это referenced_by из первого шага. PATCH без slug и name — 400 nothing_to_update, новый слаг вне схемы block__element--modifier — 400 invalid_slug.
4. Что меняется, а что нет
| Где | Что происходит |
|---|---|
| сам фрейм | новые slug и name; block, element, modifier выводятся заново; id и разметка остаются |
| фреймы, подключающие его по слагу | <!-- wp:op/frame {"ref":"<старый>"} /--> получает новый слаг в исходнике; запись в реестре обновляется; фрейм перепекается в том же вызове |
| остальная их разметка | не меняется ни на байт |
| фреймы, подключающие его по id | переписывать нечего |
| привязанные страницы | не трогаются: _onpress_frame хранит id, а не слаг |
старые ссылки op/frame {"type":…} | не переписываются: они идут через легаси-дефолты, а не по имени |
Переписывание и обновление реестра идут одной транзакцией. Печать после неё отражена в bake (сам фрейм) и rebaked (фреймы, которые его подключают); если фрейм никто не подключает, поля rebaked нет. Неудачная печать переименование не отменяет — перепеките через POST /frames/rebake: {"frames": ["site__header"]} перепекает подключающих, {"all": true} — все фреймы сайта.
Проверка
GET /frames/site__header отвечает с "block": "site", "element": "header" и прежним id. GET /frames/shapka-sajta теперь 404 frame_not_found. У каждого слага из прежнего referenced_by в frame_refs стоит новое имя, а GET /frames/<подключающий> показывает в разметке op/frame {"ref":"site__header"}. Привязанные к фрейму страницы открываются как раньше.
См. также
- Фреймы — правила имён,
PATCH,PUT,DELETEи печать. - Вставки —
op/frameи легаси-псевдонимop/partial. - Оболочка со шапкой и подвалом — фреймы, для которых эти имена задуманы.