Страницы¶
Эндпоинты для управления страницами Grav: список, создание, обновление, удаление, копирование, перемещение и изменение порядка, а также переводы страниц, пакетные операции, токены предпросмотра черновиков, таксономия и список языков сайта.
Список страниц¶
GET /pages
Выводит страницы с фильтрацией, сортировкой и постраничной разбивкой. Использует директорию страниц Flex, когда она доступна (с индексацией и кэшированием), а в остальных случаях — стандартную службу Pages. При translations=true каждый элемент содержит has_default_file и explicit_language_files, чтобы клиенты могли отличить настоящие файлы переводов от подстановки языка по умолчанию.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
page |
integer | Нет | Номер страницы для постраничной разбивки (по умолчанию 1). |
per_page |
integer | Нет | Число результатов на странице (по умолчанию 20, не больше plugins.api.pagination.max_per_page, по умолчанию 1000). |
sort |
string | Нет | Поле сортировки: date, title, slug, modified, order или default. Если не указано, страницы сортируются по date по убыванию. default вместе с children_of использует собственный порядок страниц родителя; без children_of сортирует по order по возрастанию. Неизвестное поле возвращает 422. |
order |
string | Нет | Направление сортировки: asc (по умолчанию) или desc. Игнорируется, если sort не указан. |
search |
string | Нет | Полнотекстовый поиск по индексируемым полям страниц (только при использовании Flex). |
published |
boolean | Нет | Фильтр по состоянию публикации. |
visible |
boolean | Нет | Фильтр по видимости. |
routable |
boolean | Нет | Фильтр по маршрутизируемости. |
template |
string | Нет | Фильтр по имени шаблона страницы. |
parent |
string | Нет | Фильтр по потомкам, маршрут которых начинается с этого родительского пути (например, /blog вернёт /blog/post-1, /blog/sub/post-2). |
children_of |
string | Нет | Фильтр по прямым дочерним страницам заданного маршрута. |
root |
boolean | Нет | true возвращает только страницы верхнего уровня (прямых потомков корня страниц, поэтому дочерние страницы главной не учитываются). false возвращает все страницы, кроме страниц верхнего уровня. |
locate |
string | Нет | Маршрут страницы, к которой нужно перейти. Если он есть в отфильтрованных и отсортированных результатах, сервер возвращает часть результатов, содержащую его (переопределяя page), и сообщает его позицию в meta.pagination.located_at_index. |
lang |
string | Нет | Выводит страницы на определённом языке. Код, не являющийся настроенным языком, возвращает 422. |
translations |
boolean | Нет | Включать в каждый элемент метаданные переводов: translated_languages, untranslated_languages, has_default_file, explicit_language_files. |
Ответ
{"data": [{"route": "/blog", "slug": "blog", "title": "Blog", "template": "blog", "published": true, "visible": true, "routable": true, "has_children": true, "permissions": {"create": true, "read": true, "update": true, "delete": true, "publish": true, "list": true}}], "meta": {"pagination": {"page": 1, "per_page": 20, "total": 42, "total_pages": 3}}, "links": {"self": "/api/v1/pages?page=1&per_page=20", "next": "/api/v1/pages?page=2&per_page=20", "last": "/api/v1/pages?page=3&per_page=20"}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read. |
422 |
Неизвестное поле сортировки или неверный код языка. |
Получение страницы¶
GET /pages/{route}
Возвращает одну страницу с полным содержимым, метаданными и медиафайлами, а также объект permissions с возможностями вызывающей стороны для этой страницы. Возвращает ETag; используйте If-None-Match для условных запросов. Требуется api.pages.read с учётом собственного правила read страницы. Для страницы с process.twig: true также нужно разрешение на Twig в контенте.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (например, /blog/my-post). |
summary |
boolean | Нет | Не возвращать необработанный content, а вместо него вернуть простой текст summary (отрендеренный, без тегов, обрезанный). |
summary_size |
integer | Нет | Максимальная длина summary в символах (по умолчанию 300). Используется только с summary=true. |
render |
boolean | Нет | Дополнительно вернуть отрендеренный HTML в content_html. |
children |
boolean | Нет | Включить в ответ дочерние страницы. |
children_depth |
integer | Нет | Сколько уровней дочерних страниц включать (по умолчанию 1). Используется только с children=true. |
translations |
boolean | Нет | Включить метаданные переводов: translated_languages, untranslated_languages, has_default_file (есть ли файл {template}.md без языкового суффикса), explicit_language_files (подмножество языков, для которых на диске есть настоящий файл {template}.{lang}.md). |
lang |
string | Нет | Вернуть страницу на определённом языке (переопределяет активный язык запроса). |
Ответ
{"data": {"route": "/blog/my-post", "slug": "my-post", "title": "My Post", "template": "post", "content": "# Hello World", "header": {"published": true}, "media": [], "has_default_file": true, "explicit_language_files": ["fr"]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех. |
304 |
Не изменено (совпадение ETag). |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read, доступ запрещён собственными правилами страницы, либо страница использует Twig в контенте, а у вызывающей стороны нет этого разрешения. |
404 |
Страница не найдена. |
422 |
Неверный код языка. |
Создание страницы¶
POST /pages
Создаёт новую страницу. Родительская страница должна уже существовать (кроме страниц верхнего уровня), а целевая папка должна быть свободна. Метаданные страницы формируются из значений по умолчанию схемы шаблона, затем из title, затем из переданного header. Возвращает 201 с новой страницей и заголовком Location. Требуется api.pages.write с учётом собственного правила create родительской страницы; установка process.twig: true также требует разрешения на Twig в контенте.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут, по которому будет создана страница |
title |
string | Да | Заголовок страницы |
template |
string | Нет | Используемый шаблон страницы |
content |
string | Нет | Содержимое Markdown для тела страницы |
header |
object | Нет | Значения заголовка/метаданных страницы |
order |
integer | Нет | Числовой префикс порядка для папки страницы. Передайте "auto", чтобы использовать следующий свободный номер среди соседних страниц (или не использовать префикс, если ни у одной соседней страницы его нет). |
kind |
string | Нет | Одно из значений: page (по умолчанию), folder (папка без файла .md) или module (модульная секция, её slug получает префикс _). Для folder ответ может содержать только route и kind. |
lang |
string | Нет | Код языка для многоязычных сайтов (поле тела запроса или параметр запроса ?lang=). Записывает файл {template}.{lang}.md. |
Запрос
{"route": "/blog/new-post", "title": "New Post", "template": "post", "content": "# New Post\nContent here"}
Ответ
{"data": {"route": "/blog/new-post", "slug": "new-post", "title": "New Post", "template": "post", "published": true, "content": "# New Post\nContent here", "media": [], "permissions": {"create": true, "read": true, "update": true, "delete": true, "publish": true, "list": true}}}
Коды ответов
| Код | Описание |
|---|---|
201 |
Страница создана |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.write, доступ запрещён правилами родительской страницы, либо Twig в контенте не разрешён |
422 |
Не передан route или title, неверный kind, родительская страница не найдена, страница по этому маршруту уже существует, неверный код языка или не пройдена валидация по схеме |
Обновление страницы¶
PATCH /pages/{route}
Частичное обновление страницы. Меняются только переданные поля, а результат валидируется по схеме страницы. Возвращает обновлённую страницу с новым ETag. Требуется api.pages.write с учётом собственного правила update страницы; включение process.twig или редактирование страницы, где он уже включён, также требует разрешения на Twig в контенте.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути) |
title |
string | Нет | Новый заголовок страницы |
content |
string | Нет | Новое содержимое Markdown |
header |
object | Нет | Значения заголовка, которые нужно слить с существующими метаданными страницы. Значение null удаляет соответствующий ключ. |
header_mode |
string | Нет | Установите replace, чтобы заменить все метаданные страницы значением header вместо слияния (используется редакторами необработанных метаданных). |
template |
string | Нет | Изменить шаблон страницы |
published |
boolean | Нет | Установить состояние публикации |
visible |
boolean | Нет | Установить видимость |
lang |
string | Нет | Параметр запроса. Обновить версию на определённом языке; этот перевод должен уже существовать (создайте его через POST /pages/{route}/translate). |
Запрос
Ответ
{"data": {"route": "/blog/my-post", "slug": "my-post", "title": "Updated Title", "template": "post", "header": {"title": "Updated Title", "subtitle": "New subtitle"}, "content": "# Hello World", "media": [], "permissions": {"create": true, "read": true, "update": true, "delete": true, "publish": true, "list": true}}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.write, доступ запрещён правилами страницы, либо Twig в контенте не разрешён |
404 |
Страница не найдена |
409 |
Конфликт (If-Match не совпадает с текущим ETag) |
422 |
Не пройдена валидация по схеме, неверный код языка или запрошенный перевод не существует |
Поддерживает оптимистичный контроль конкурентного доступа через заголовок If-Match. Передавайте ETag из последнего GET-запроса, чтобы не перезаписать параллельные изменения.
Удаление страницы¶
DELETE /pages/{route}
Удаляет страницу и её папку. Дочерние страницы тоже удаляются, если не указано children=false; в этом случае страница с дочерними страницами отклоняется с кодом 422. С ?lang= на многоязычном сайте удаляется только файл этого языка; если это единственный перевод страницы, удаляется вся папка, и children=false действует так же. Требуется api.pages.write с учётом собственного правила delete страницы.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут удаляемой страницы |
children |
boolean | Нет | Также удалить дочерние страницы. false запрещает удалять страницу, у которой есть дочерние. |
lang |
string | Нет | Удалить только версию на определённом языке (404, если у страницы нет такого перевода) |
Коды ответов
| Код | Описание |
|---|---|
204 |
Страница удалена |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.write или доступ запрещён правилами страницы |
404 |
Страница не найдена или нет перевода для запрошенного языка |
422 |
У страницы есть дочерние страницы, а указано children=false, либо неверный код языка |
Перемещение страницы¶
POST /pages/{route}/move
Перемещает страницу к новому родителю, при необходимости переименовывая её slug или меняя префикс порядка. Возвращает перемещённую страницу с ETag; если страницу не удаётся получить по новому маршруту, возвращаются только route и slug. Требуется api.pages.write с учётом собственного правила update страницы и правила create целевого родителя.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Текущий маршрут страницы (параметр пути) |
parent |
string | Да | Маршрут целевого родителя (/ для верхнего уровня) |
slug |
string | Нет | При необходимости переименовать slug во время перемещения. Должен быть одним сегментом пути. |
order |
integer | Нет | Числовой префикс порядка на новом месте. По умолчанию используется текущий префикс; null удаляет его. |
Запрос
Ответ
{"data": {"route": "/blog/moved-post", "slug": "moved-post", "title": "My Post", "template": "post", "content": "# Hello World", "media": []}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Страница перемещена |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.write или доступ запрещён правилами страницы |
404 |
Страница не найдена |
422 |
Не передан parent, неверный slug, целевой родитель не найден, место назначения уже занято или страница уже находится там |
Изменение порядка страниц¶
POST /pages/{route}/reorder
Меняет порядок дочерних страниц под родителем. Перечисленные slug'и получают числовые префиксы папок 1, 2, 3 в указанном порядке с сохранением самой широкой ширины префикса, уже используемой соседними страницами. Дочерние страницы, которых нет в списке, сохраняют текущее имя папки. Возвращает всех потомков страницы в новом порядке. Требуется api.pages.write с учётом собственного правила update родительской страницы.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут родительской страницы (параметр пути) |
order |
array | Да | Массив slug'ов дочерних страниц в нужном порядке |
Запрос
Ответ
{"data": [{"route": "/blog/first-post", "slug": "first-post", "title": "First Post", "order": "01."}, {"route": "/blog/second-post", "slug": "second-post", "title": "Second Post", "order": "02."}, {"route": "/blog/third-post", "slug": "third-post", "title": "Third Post", "order": "03."}]}
Коды ответов
| Код | Описание |
|---|---|
200 |
Порядок страниц изменён |
401 |
Не авторизован |
403 |
Нет разрешения api.pages.write или доступ запрещён правилами родительской страницы |
404 |
Родительская страница не найдена |
422 |
order отсутствует или не является массивом, либо slug не является дочерней страницей этой страницы |
Копирование страницы¶
POST /pages/{route}/copy
Дублирует страницу (включая всё содержимое и медиафайлы) по новому маршруту. Целевой родитель должен существовать, а целевой путь должен быть свободен. Если в метаданных источника задан slug:, у копии он переписывается на новое имя папки. Возвращает 201 с новой страницей (только route и slug, если копию потом не удаётся получить). Добавляет теги инвалидации кэша pages:create:<dest> и pages:list. Требуется api.pages.write с учётом правила read исходной страницы и правила create целевого родителя.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут исходной страницы (параметр пути). |
route |
string | Да | Целевой маршрут для копии (поле тела запроса). |
Запрос
Ответ
{"data": {"route": "/blog/my-post-copy", "slug": "my-post-copy", "title": "My Post", "template": "post"}}
Коды ответов
| Код | Описание |
|---|---|
201 |
Страница скопирована; заголовок Location указывает на новую страницу. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.write или доступ запрещён правилами исходной либо целевой страницы. |
404 |
Исходная страница не найдена. |
422 |
Не передан целевой route, целевой родитель не найден или место назначения уже занято. |
Список языков страницы¶
GET /pages/{route}/languages
Выводит переведённые и непереведённые языки страницы. Используется для переключателя языков в редакторах страниц: translated — языки, для которых есть содержимое, untranslated — языки, настроенные для сайта, но отсутствующие у этой страницы. translated сопоставляет каждый код языка с маршрутом страницы на этом языке. На одноязычном сайте оба списка пусты. Требуется api.pages.read с учётом собственного правила read страницы.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути). |
Ответ
{"data": {"route": "/blog/my-post", "default_language": "en", "translated": {"en": "/blog/my-post", "fr": "/blog/mon-article"}, "untranslated": ["de", "es"]}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Статус языков возвращён. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read или доступ запрещён правилами страницы. |
404 |
Страница не найдена. |
Примечание
Если на сайте есть только простой default.md (без языкового суффикса) и включена многоязычность, Grav сообщит язык по умолчанию в translated как подстановку. Используйте GET /pages/{route}?translations=true, чтобы получить поля has_default_file / explicit_language_files, которые показывают, какие языки обеспечены настоящим файлом на диске.
Создание перевода¶
POST /pages/{route}/translate
Создаёт новый перевод страницы на указанном языке. Записывает новый файл {template}.{lang}.md рядом с существующей страницей. Результат валидируется по схеме страницы. Вызывает onApiBeforePageTranslate (изменяемое), onAdminSave/onAdminAfterSave и onApiPageTranslated. Возвращает 201 со страницей на новом языке; в заголовке Location нет параметра lang, поэтому добавьте ?lang=<code>, чтобы получить перевод. Требуется включённая многоязычность и api.pages.write с учётом собственного правила update страницы. Включение process.twig в header также требует разрешения на Twig в контенте.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути). |
lang |
string | Да | Код целевого языка (должен совпадать с настроенным языком сайта). |
title |
string | Нет | Заголовок перевода (по умолчанию — заголовок исходной страницы). |
content |
string | Нет | Необработанное содержимое Markdown (по умолчанию — содержимое исходной страницы). |
header |
object | Нет | Объект метаданных страницы (по умолчанию — копия заголовка исходной страницы со слитым в неё title). Отсутствующие значения заполняются значениями по умолчанию из схемы шаблона. |
Запрос
Ответ
{"data": {"route": "/blog/my-post", "slug": "my-post", "title": "Mon article", "template": "post", "language": "fr", "header": {"title": "Mon article"}, "content": "# Bonjour", "media": []}}
Коды ответов
| Код | Описание |
|---|---|
201 |
Перевод создан. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.write, доступ запрещён правилами страницы или Twig в контенте не разрешён. |
404 |
Исходная страница не найдена. |
422 |
Не передан lang, код языка не является строкой или не настроен, многоязычность не включена, перевод для этого языка уже существует (для обновления используйте PATCH) или не пройдена валидация по схеме. |
Принятие языка¶
POST /pages/{route}/adopt-language
Объявляет базовый файл страницы без языкового суффикса (например, default.md) определённым языком, переименовывая его на месте в {template}.{lang}.md. Это чисто переименование в файловой системе плюс сброс кэша — содержимое не затрагивается. Предназначено для сайтов, которые начинали как одноязычные, а позже включили многоязычность: позволяет администратору объявить «этот существующий контент — английская версия», не редактируя YAML. Вызывает onApiBeforePageAdoptLanguage и onApiPageLanguageAdopted. Возвращает страницу в том виде, в каком она загружается на принятом языке. Требуется api.pages.write с учётом собственного правила update страницы.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути). |
lang |
string | Да | Код языка, который нужно назначить базовому файлу. |
Запрос
Ответ
{"data": {"route": "/blog/my-post", "slug": "my-post", "title": "My Post", "template": "default", "language": "en", "content": "# Hello", "media": []}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Базовый файл переименован в имя файла с языковым суффиксом. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.write или доступ запрещён правилами страницы. |
404 |
Страница не найдена. |
422 |
lang отсутствует или неверен (в том числе если код не является строкой), многоязычность не включена, базового файла без суффикса нет (страница уже использует файлы с языковыми суффиксами — используйте /translate), файл перевода для этого языка уже существует или имя целевого файла совпадает с именем базового. |
500 |
Не удалось переименовать файл в файловой системе. |
Синхронизация перевода¶
POST /pages/{route}/sync
Перезаписывает содержимое и заголовок одного языка содержимым и заголовком другого. Удобно для сценариев «вернуть эту французскую страницу к английской версии». Файлы перевода источника и цели должны уже существовать. Действуют те же проверки Twig в контенте и валидация по схеме, что и при обычном сохранении страницы. Вызывает onApiBeforePageSync (изменяемые заголовок и содержимое) и onApiPageSynced. Возвращает обновлённую целевую страницу. Требуется включённая многоязычность и api.pages.write с учётом собственного правила update страницы.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути). |
source_lang |
string | Да | Код языка, из которого копируется содержимое. |
target_lang |
string | Да | Код языка, который перезаписывается. |
Запрос
Ответ
{"data": {"route": "/blog/my-post", "slug": "my-post", "title": "My Post", "template": "post", "language": "fr", "content": "# Hello", "media": []}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Целевой перевод перезаписан содержимым источника. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.write, доступ запрещён правилами страницы или Twig в контенте не разрешён. |
404 |
Страница не найдена для одного из переданных языков. |
422 |
Отсутствуют поля, источник и цель совпадают, файла целевого перевода нет (сначала создайте его через /translate), код языка не является строкой или не настроен, многоязычность не включена или не пройдена валидация по схеме. |
Сравнение переводов¶
GET /pages/{route}/compare
Возвращает параллельно заголовок, содержимое, метаданные и дату изменения для двух языковых версий страницы. Используется интерфейсами сравнения переводов в Admin2. Сторона равна null, если страница не существует на этом языке, а exists равно false, если она находится только через подстановку языка по умолчанию, а не через собственный файл, — так клиенты всё равно могут показывать состояние «цель отсутствует». Требуется включённая многоязычность и api.pages.read, причём ни исходная, ни целевая версия не должны запрещать вызывающей стороне чтение.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути). |
source |
string | Да | Код исходного языка (параметр запроса). |
target |
string | Да | Код целевого языка (параметр запроса). |
Ответ
{"data": {"route": "/blog/my-post", "source": {"lang": "en", "exists": true, "title": "My Post", "content": "# Hello", "header": {"title": "My Post"}, "modified": "2026-04-17T10:00:00+00:00"}, "target": {"lang": "fr", "exists": false, "title": "My Post", "content": "# Hello", "header": {"title": "My Post"}, "modified": null}}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Сравнение возвращено (источник или цель могут быть null или иметь exists: false). |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read или исходная либо целевая версия запрещает чтение. |
422 |
Не передан параметр запроса source / target, код языка не является строкой (например, source[]=) или не настроен, либо многоязычность не включена. |
Пакетные операции со страницами¶
POST /pages/batch
Выполняет одну и ту же операцию (publish, unpublish, delete или copy) над несколькими страницами за один запрос. Результаты по каждой странице возвращаются отдельно, поэтому один сбой не прерывает пакет; страница, правила которой запрещают действие, возвращается как результат с error. До запуска любой операции каждый маршрут должен указывать на существующую страницу. Ограничено plugins.api.batch.max_items (по умолчанию 50). Добавляет теги инвалидации кэша по каждой странице в соответствии с операцией. Требуется api.pages.write.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
operation |
string | Да | Одно из значений: publish, unpublish, delete, copy. |
routes |
array | Да | Непустой массив маршрутов страниц. |
options |
object | Нет | Используется только для copy: destination (родительский маршрут для копирования, / для верхнего уровня, по умолчанию — текущий родитель каждой страницы) и suffix (добавляется к каждому slug, по умолчанию -copy, должен быть одним сегментом пути). |
Запрос
Ответ
{"data": {"operation": "publish", "results": [{"route": "/blog/post-1", "status": "success"}, {"route": "/blog/post-2", "status": "error", "message": "Page permissions deny 'publish' on this page."}], "total": 2, "successful": 1, "failed": 1}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Пакет обработан; результаты по отдельным страницам в results[]. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.write. |
422 |
Неверная операция, пустой массив маршрутов, превышен лимит пакета или маршрут не существует. |
Реорганизация страниц¶
POST /pages/reorganize
Атомарно перемещает и/или изменяет порядок нескольких страниц за один запрос. Все операции проверяются до внесения изменений в файловую систему, а затем выполняются по двухфазной стратегии с временным переименованием и откатом по возможности при сбое. Нельзя переместить страницу в её собственное поддерево или в родителя, который сам перемещается в этом же запросе. Ограничено plugins.api.batch.max_items (по умолчанию 50). Вызывает onApiBeforePagesReorganize, onApiPagesReorganized и onApiPageMoved для каждой фактически перемещённой страницы. Требуется api.pages.write; если правила страницы запрещают update или целевой родитель запрещает create, весь запрос завершается с 403.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
operations |
array | Да | Непустой массив объектов операций. У каждого должен быть route; необязательные поля: parent (маршрут нового родителя, / для верхнего уровня; не указывайте, чтобы остаться под текущим родителем) и position (целое число от 1, задаёт числовой префикс папки). |
Запрос
{"operations": [{"route": "/blog/post-1", "parent": "/archive", "position": 1}, {"route": "/blog/post-2", "position": 3}]}
Ответ
{"data": [{"route": "/archive/post-1", "slug": "post-1", "title": "Post 1", "order": 1, "parent": "/archive"}, {"route": "/blog/post-2", "slug": "post-2", "title": "Post 2", "order": 3, "parent": "/blog"}]}
Коды ответов
| Код | Описание |
|---|---|
200 |
Все операции выполнены; ответ перечисляет всех потомков каждого затронутого родителя. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.write или страница либо целевой родитель запрещает действие. |
422 |
Не пройдена валидация (пустой список операций, слишком много операций, повторяющиеся маршруты, отсутствует страница или родитель, конфликт позиций, перемещение в собственное поддерево страницы или целевой родитель, который сам перемещается), либо ошибка файловой системы при выполнении (предпринята попытка отката). |
Список таксономии¶
GET /taxonomy
Возвращает каждый тип таксономии (например, category, tag) с полным списком значений, используемых на всех страницах. Включается каждый тип, объявленный в site.taxonomies, с пустым списком, если его пока не использует ни одна страница. Внутренние пути к файлам удаляются, поэтому возвращаются только значения терминов.
Ответ
Коды ответов
| Код | Описание |
|---|---|
200 |
Карта таксономии возвращена. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read. |
Список языков сайта¶
GET /languages
Возвращает настроенные языки сайта с отображаемыми названиями, флагами RTL и кодами по умолчанию и активного языка. Если многоязычность выключена, возвращает enabled: false, пустой список languages и null для default/active. Используется переключателями языков и интерфейсами переводов.
Ответ
{"data": {"enabled": true, "languages": [{"code": "en", "name": "English", "native_name": "English", "rtl": false, "is_default": true}, {"code": "fr", "name": "French", "native_name": "Français", "rtl": false, "is_default": false}], "default": "en", "active": "en"}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Языки возвращены. |
401 |
Не авторизован. |
403 |
Нет разрешения api.pages.read. |
Получение токена предпросмотра¶
POST /pages/{route}/preview-token
Выдаёт кратковременный подписанный токен, который позволяет фронтенду отрендерить эту страницу, даже если она не опубликована, — для предпросмотра черновиков. Загрузите фронтенд-URL страницы с ?admin_preview=1&preview_token=<token>; токен открывает доступ только к этой странице. Для модульной секции route — это родительская страница, которую нужно загрузить, а anchor предлагает идентификатор элемента для прокрутки (в остальных случаях он равен null). Токен действует plugins.api.preview_token_ttl секунд (по умолчанию 300, минимум 30). Требуется api.pages.read и доступ на чтение страницы, а при предпросмотре модуля — и её родительской страницы.
Параметры
| Имя | Тип | Обязательный | Описание |
|---|---|---|---|
route |
string | Да | Маршрут страницы (параметр пути). |
lang |
string | Нет | Получить страницу на определённом языке (параметр запроса). |
Ответ
{"data": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_in": 300, "route": "/blog/my-post", "anchor": null}}
Коды ответов
| Код | Описание |
|---|---|
200 |
Токен предпросмотра возвращён. |
401 |
Не авторизован. |
403 |
Предпросмотр черновиков отключён (plugins.api.allow_draft_preview: false), нет разрешения api.pages.read или доступ запрещён правилами страницы. |
404 |
Страница не найдена. |
422 |
Неверный код языка. |