Перейти к содержимому

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.php
  • backend/src/Service/Page/CreatePageService.php, UpdatePageService.php, PageLiveUrlService.php
  • backend/src/Controller/V1/Page/UpdatePagePublicAction.php, CreatePagePublicAction.php
  • backend/src/Publishing/LayoutRenderer.php
  • backend/src/Publishing/Provider/FourCmsProvider.php