Налаштування автогенерації SEO-тегів для Bitrix CMS
Автогенерація 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# | Блог |
#PREVIEW_TEXT# |
Користувацька генерація через подій
Коли шаблонів недостатньо (потрібна складна логіка: різні шаблони залежно від властивості, додавання даних з пов'язаних елементів), використовується обробник подій 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 годин.







