Перенести страницу
Адрес страницы — цепочка родителей и её слаг. Перенос под другого родителя или смена слага меняют адрес страницы и всех её потомков. Главная ловушка: публикация без id ищет страницу под новым родителем, не находит и создаёт вторую, а старая остаётся на месте.
Страница документации: через сайдбар
Если страница — пункт сайдбара документации, переносите ручкой пункта:
curl -s -X PATCH "$API/site/$SITE/docs/sidebar/items/docs~nastrojka" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"parent": "/docs/rukovodstvo/", "position": 0}' | jq '{item, warnings}'
{
"item": {
"id": 6469,
"parent": { "from": 6183, "to": 6468 },
"url_before": "/docs/nastrojka/",
"old_paths": [ { "id": 6469, "path": "/docs/nastrojka/" }, { "id": 6470, "path": "/docs/nastrojka/dopolnitelno/" } ],
"url": "/docs/rukovodstvo/nastrojka/"
},
"warnings": ["page #6469 changes its parent: the address /docs/nastrojka/ answers 301 to the new one"]
}
old_paths — прежние адреса страницы и всего её поддерева. С каждого из них платформа сама заводит правило 301 на новый адрес — автоправила; заведённые правила приходят в ответе полем redirects_created, их видно в «Инструменты → Редиректы». Проверьте старые адреса сразу после переноса (шаг «Проверка» ниже).
Порядок среди новых соседей задают position, after или before в том же запросе.
Любая страница: публикация с id
# 1. id и текущий markdown
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/pages/tarify/markdown" | jq -r .markdown > tarify.md
head -12 tarify.md
Во frontmatter выгрузки уже есть id. Поменяйте url (новый родитель) и, если нужно, slug:
---
id: 6428
name: "Тарифы"
slug: "tarify"
url: "/company/tarify/"
lang: "ru"
frame: "article"
---
# 2. опубликовать
curl -s -X POST "$API/site/$SITE/pages/markdown" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d "$(jq -n --rawfile md tarify.md '{markdown: $md}')" | jq -c '{updated, id, url, link, warnings, redirects_created}'
{"updated":true,"id":6428,"url":"/company/tarify/","link":"https://example.onpress.pro/company/tarify/","warnings":[],"redirects_created":[{"id":237,"from":"/tarify/","to":"/company/tarify/"}]}
updated: true и прежний id — страница та же, её адрес сменился. Если пришло updated: false и новый id — id во frontmatter не было, создан дубль: удалите его (DELETE /pages/{новый id}?force=true) и повторите с id.
Смена только слага — то же самое: id плюс новый slug и url.
Старые адреса закрываются сами: у опубликованной страницы сменился путь — правило 301 со старого на новый заводится для неё и для каждого опубликованного потомка, правила, которые вели на старый адрес, переводятся на новый. Ответ публикации перечисляет их в redirects_created, сводка — в auto_redirects. Если на сайте автоправила выключены (PUT /site/{siteId}/redirects/auto), auto_redirects.enabled будет false — заведите правила вручную или импортом CSV, см. Редиректы.
Что происходит вокруг
| Что | Следует за страницей |
|---|---|
| Потомки | да: их адреса меняются вместе с родителем |
Пункты меню, ведущие на страницу ({"page": …}) | да: пункт хранит id и показывает новый адрес |
Пункты меню с {"url": …} на старый адрес | нет — перепишите |
| Ссылки в текстах других страниц | нет — перепишите |
Системные источники pages.*, хлебные крошки, дерево документации | да, считаются заново |
| Статическая копия | переписывается по новому адресу, старая снимается |
| Старый адрес и адреса потомков | правило 301 на новый адрес заводится само (автоправила) |
| Переводы | нет: у перевода свой адрес и свой родитель, переносите его отдельно |
Найти страницы, которые ссылаются на старый адрес, поиском API нельзя (поиск идёт по заголовку и слагу, не по телу). Выгрузите тексты (GET /pages/{ref}/markdown) и ищите локально.
Проверка
for u in /tarify/ /company/tarify/; do
curl -s -o /dev/null -w "%{http_code} %{redirect_url} $u\n" "https://ВАШ_ДОМЕН$u"
done
Новый адрес — 200. Старый — 301 с новым адресом в redirect_url. 404 на старом адресе значит, что правила нет (автоправила выключены или страница не была опубликована): заведите правило в Редиректах или перепишите ссылки. Кэш страниц API сбрасывает сам; проверяйте без кук.