Перенести страницу
Адрес страницы — цепочка родителей и её слаг. Перенос под другого родителя или смена слага меняют адрес страницы и всех её потомков. Главная ловушка: публикация без 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 — прежние адреса страницы и всего её поддерева; API записывает их в страницы, и тема v2 отвечает с них перенаправлением 301 на новые адреса. Перенаправление срабатывает на любом сайте v2, со своей страницей 404 и без неё. Проверьте это сразу после переноса (шаг «Проверка» ниже).
Порядок среди новых соседей задают 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}'
{"updated":true,"id":6428,"url":"/company/tarify/","link":"https://example.onpress.pro/company/tarify/","warnings":[]}
updated: true и прежний id — страница та же, её адрес сменился. Если пришло updated: false и новый id — id во frontmatter не было, создан дубль: удалите его (DELETE /pages/{новый id}?force=true) и повторите с id.
Смена только слага — то же самое: id плюс новый slug и url. WordPress запоминает прежний слаг опубликованной страницы (_wp_old_slug); тема v2 по нему отвечает 301 для адресов из одного сегмента. Перенос через публикацию не записывает old_paths — прежние адреса вложенных страниц перенаправлением не закрываются.
Что происходит вокруг
| Что | Следует за страницей |
|---|---|
| Потомки | да: их адреса меняются вместе с родителем |
Пункты меню, ведущие на страницу ({"page": …}) | да: пункт хранит id и показывает новый адрес |
Пункты меню с {"url": …} на старый адрес | нет — перепишите |
| Ссылки в текстах других страниц | нет — перепишите |
Системные источники pages.*, хлебные крошки, дерево документации | да, считаются заново |
| Статическая копия | переписывается по новому адресу, старая снимается |
| Переводы | нет: у перевода свой адрес и свой родитель, переносите его отдельно |
Найти страницы, которые ссылаются на старый адрес, поиском 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 сбрасывает сам; проверяйте без кук.