Техническая справка: 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.txt | front/src/app/robots.ts | Закрывает /admin, /api/, /cart, /checkout; ссылается на sitemap |
sitemap.xml | front/src/app/sitemap.ts | Главная, статические, категории, активные теги с товарами, до 45k активных товаров |
manifest.webmanifest | front/src/app/manifest.ts | PWA-манифест |
| JSON-LD | components/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). Меняются только в коде/деплое,
не через админку.