SEO-поля
У страницы есть адрес (slug) и четыре мета-поля. Все они необязательные
и заполняются вручную.
Поля этого раздела есть только у документа вида article. У шаблона и макета
адрес и SEO ведёт витрина, поэтому такие поля у них отвергаются с 400 —
см. Вид документа.
| Поле | Ограничение длины | Назначение |
|---|---|---|
slug |
255 | адрес страницы, уникален в пределах сайта |
meta_title |
255 | заголовок для поисковых систем |
meta_description |
без ограничения | описание |
meta_keywords |
512 | ключевые слова через запятую |
meta_robots |
64 | правила индексации, например INDEX, FOLLOW |
Задаются при создании страницы и меняются точечно:
PUT /api/v1/pages/42
{ "slug": "about", "meta_title": "О компании | Мой сайт", "meta_description": "Команда, ценности, история.", "meta_robots": "INDEX, FOLLOW"}Обновление частичное: передаются только те поля, которые нужно изменить.
Пустая строка очищает поле — "meta_title": "" эквивалентно null,
у «не заполнено» одно представление, а не два. Поле, которого нет в запросе,
не меняется.
Адрес: что важно знать
Заголовок раздела «Адрес: что важно знать»Slug не генерируется из названия. Пока вы не задали его явно, поле пустое, и это нормальное состояние страницы. Автоматическая транслитерация кириллицы ненадёжна: неожиданный адрес хуже отсутствующего, особенно после того, как на страницу поставили ссылки.
Формат не проверяется. Пробелы, кириллицу и заглавные буквы API не отсекает — корректность адреса на вашей стороне.
Уникальность — в пределах сайта, и она защищена уникальным индексом базы, а не только проверкой перед сохранением: две одновременные записи с одним адресом не пройдут обе. Пустой адрес под ограничение не попадает — поэтому шаблонов без адреса может быть сколько угодно. При конфликте приходит 409 с машиночитаемым телом:
{ "error": "Slug уже занят", "errors": [{ "path": "slug", "message": "slug «about» уже занят другой страницей этого сайта" }]}Такой формат сделан для тех, кто создаёт страницы пачками: по path видно,
какое именно поле виновато, и можно подобрать другой адрес, не разбирая текст.
Наш адрес и адрес витрины
Заголовок раздела «Наш адрес и адрес витрины»После публикации у страницы появляется вторая пара значений — то, чем она стала во внешней системе:
| Поле | Кто заполняет |
|---|---|
slug, meta_* |
вы |
external_id |
витрина при первой публикации |
external_slug |
витрина при публикации |
Витрина вправе выдать свой адрес — например, если запрошенный уже занят. Поэтому
external_slug хранится отдельно и может не совпадать с вашим slug. Запрос
публичного URL (GET /api/pages/{id}/live-url) заодно подтягивает актуальный
адрес витрины: если его поменяли там вручную, PageCraft подстроится, а не
перезапишет.
Подробнее про то, как поля попадают на витрину, — в разделе Публикация и обновление.
Мета-поля в макете
Заголовок раздела «Мета-поля в макете»Если у страницы задан макет, его шаблону доступны:
{{ page.title }} {# название страницы в PageCraft #}{{ page.slug }}{{ page.meta_title }}{{ page.meta_description }}Незаполненное поле подставится пустой строкой. meta_keywords и meta_robots
в контекст макета не передаются — их использует провайдер публикации напрямую.
Чего нет
Заголовок раздела «Чего нет»- Канонических ссылок и Open Graph — только четыре классических мета-поля.
- Проверки длины мета-полей по практическим пределам поисковых систем: ограничения из таблицы выше — это ограничения хранилища, а не рекомендации SEO.
- Отдельного признака «опубликовано»: фактический признак — заполненный
external_id.
Источники
Заголовок раздела «Источники»backend/src/Entity/Page.phpbackend/src/Service/Page/CreatePageService.php,UpdatePageService.php,PageLiveUrlService.phpbackend/src/Controller/V1/Page/UpdatePagePublicAction.php,CreatePagePublicAction.phpbackend/src/Publishing/LayoutRenderer.phpbackend/src/Publishing/Provider/FourCmsProvider.php