Настройка автогенерации SEO-тегов 1С-Битрикс
Автогенерация SEO-тегов — это заполнение <title>, <meta name="description"> и <h1> по правилам на основе данных элемента или раздела инфоблока. Нужна, когда каталог содержит тысячи позиций: ручное заполнение нецелесообразно, а пустые мета-теги критичны для индексирования.
Стандартные шаблоны в SEO-модуле
Базовый инструмент — правила мета-тегов в разделе Маркетинг → Поисковая оптимизация → Мета-теги. Для инфоблока задаётся шаблон с подстановками #NAME#, #SECTION_NAME#, #PROPERTY_{CODE}#. Это покрывает большинство случаев без программирования.
Для интернет-магазина типовой набор шаблонов:
| Объект | Title | Description |
|---|---|---|
| Элемент каталога | #NAME# — цена, характеристики |
Купите #NAME#. #PROPERTY_SHORT_DESC# Доставка от 1 дня. |
| Раздел каталога | #NAME# — каталог товаров |
Широкий выбор в разделе #NAME#. #PROPERTY_SECTION_DESC# |
| Детальная страница статьи | `#NAME# | Блог` |
Кастомная генерация через события
Когда шаблонов недостаточно (нужна сложная логика: разные шаблоны в зависимости от свойства, добавление данных из связанных элементов), используется обработчик события OnPageStart или OnBeforeProlog в init.php:
AddEventHandler('main', 'OnBeforeProlog', function() {
global $APPLICATION;
// Только для детальных страниц каталога
if (!preg_match('#^/catalog/([^/]+)/([^/]+)/#', $_SERVER['REQUEST_URI'])) {
return;
}
// Получаем текущий элемент из компонента нельзя напрямую,
// поэтому используем данные из URL или запрашиваем отдельно
$elementId = (int)$_REQUEST['ELEMENT_ID'];
if (!$elementId) return;
$el = \CIBlockElement::GetByID($elementId)->GetNext();
if (!$el) return;
$brand = $el['PROPERTIES']['BRAND']['VALUE'] ?? '';
$model = $el['NAME'];
$price = \CCatalogProduct::GetByID($elementId)['PRICE'] ?? '';
$APPLICATION->SetPageProperty('title',
"{$brand} {$model} — купить за {$price} ₽ | Интернет-магазин"
);
$APPLICATION->SetPageProperty('description',
"Купить {$brand} {$model} за {$price} ₽ с доставкой по всей России. " .
($el['PROPERTIES']['SHORT_DESC']['VALUE'] ?? '')
);
});
Вызов SetPageProperty в OnBeforeProlog выполняется раньше, чем компоненты на странице, поэтому значение успевает попасть в <head>.
Генерация H1 независимо от title
<title> и <h1> должны отличаться — это хорошая практика. <h1> задаётся через свойство страницы h1:
$APPLICATION->SetPageProperty('h1', $el['NAME']);
В шаблоне страницы:
<h1><?= $APPLICATION->GetPageProperty('h1') ?: $APPLICATION->GetTitle() ?></h1>
Массовое обновление SEO-полей существующих элементов
Если нужно заполнить SEO-поля для тысяч существующих товаров по шаблону — делается через скрипт:
$res = \CIBlockElement::GetList(
[],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'IBLOCK_ID']
);
while ($el = $res->GetNextElement()) {
$fields = $el->GetFields();
$props = $el->GetProperties();
$seoTitle = $fields['NAME'] . ' — купить в интернет-магазине';
$seoDesc = 'Купите ' . $fields['NAME'] . ' с доставкой. ' .
($props['SHORT_DESC']['VALUE'] ?? '');
\CIBlockElement::SetPropertyValuesEx($fields['ID'], $fields['IBLOCK_ID'], [
'SEO_TITLE' => $seoTitle,
'SEO_DESCRIPTION' => $seoDesc,
]);
}
Скрипт запускается разово. После выполнения элементы получат заполненные SEO-поля, которые перекрывают шаблон из модуля.
Сроки выполнения
Настройка шаблонов автогенерации через SEO-модуль — 1–2 часа. Кастомная генерация с логикой через события + массовое обновление существующих элементов — 4–6 часов.







