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

Техническая справка: SEO

Документ для разработчиков. Где в коде живут SEO-механизмы и как они связаны.

Принцип «шаблон + переопределение»

Для каждой сущности (товар/категория/тег) есть собственные metaTitle / metaDescription. Если они пусты — подставляется глобальный шаблон из app_config. Движок подстановки — front/src/lib/seo.ts (renderSeoTemplate): заменяет плейсхолдеры и убирает «висячие» разделители, если значение пустое.

Шаблоны в app_config

Ключи (сиды: 080-add-seo-config.xml, 081-create-tags.xml), редактируются в /admin/settings (admin/settings/page.tsx, категория seo):

КлючПлейсхолдеры
seo_site_title
seo_site_description
seo_product_title_template{name} {category} {brand} {price} {siteName}
seo_product_description_templateте же
seo_category_title_template{name} {siteName}
seo_category_description_template{name} {siteName}
seo_tag_title_template{name} {siteName}
seo_tag_description_template{name} {siteName}

{siteName} резолвится из отдельного ключа site_name (см. lib/fetchConfig.ts, app/layout.tsx). Публичные ключи отдаёт GET /api/v1/config/public.

Переопределения на уровне сущностей

  • ТоварmetaTitle / metaDescription в ProductEntity; правка через PATCH /api/v1/products/{id} (PatchProductRequest с парами value + clear*). Пустое значение → clear*=true → возврат к шаблону. Также заполняются генерацией (см. техсправку по генерации).
  • Категория — те же поля + блочный seoTextDoc (JSONB), выводится под листингом (/admin/categories/[id] и /seo-text).
  • ТегTagEntity: metaTitle, metaDescription, seoTextDoc, enabled; тег — посадочная страница /tags/{slug} (/admin/tags).

Slug и редиректы

  • SlugService + таблица истории слагов (075-create-slug-history.xml).
  • Товары и категории: смена slug пишет историю и даёт 301 со старого URL (GET /products/by-slug/{slug} резолвит через историю; фронт 301-редиректит). Эндпоинты: PUT /{id}/slug, POST /{id}/slug/regenerate.
  • Теги: 301-редиректов нет — смена слага ломает старый URL.
  • Массовое заполнение — SlugBackfillSection в /admin/settings.

Технические файлы (автоматические)

ФайлИсточникПримечание
robots.txtfront/src/app/robots.tsЗакрывает /admin, /api/, /cart, /checkout; ссылается на sitemap
sitemap.xmlfront/src/app/sitemap.tsГлавная, статические, категории, активные теги с товарами, до 45k активных товаров
manifest.webmanifestfront/src/app/manifest.tsPWA-манифест
JSON-LDcomponents/Common/JsonLd.tsx (из layout.tsx, страниц товара/каталога/тега)Organization + Product/Breadcrumb; данные из товара + констант lib/seo.ts

Ни один из них не редактируется из админки.

YML-фид

  • Отдаётся бэкендом: GET /api/v1/yml-catalog и /api/v1/yml-catalog.xml (публичные GET/HEAD в SecurityConfig).
  • Админ-экран /admin/yml-feed: статус, метрики, кнопка ручной генерации.
  • Пересобирается автоматически после синхронизации и изменения цен доставки.

Не редактируется из UI

Константы сайта (URL сайта, SITE_NAME, гео-координаты, телефон) — в front/src/lib/seo.ts (BUSINESS, GEO, SITE_NAME). Меняются только в коде/деплое, не через админку.