В этой статье разберем, как правильно работать с SEO-свойствами разделов в Битрикс, включая нестандартные методы через API. Вы узнаете:
-
Где хранятся SEO-данные в Битрикс.
-
Как избежать ошибок в коде.
-
Как получить SEO-свойства раздела через D7.
-
Как добавить название раздела в хлебные крошки.
Где хранятся SEO-настройки в Битрикс?
SEO-свойства в Битрикс могут храниться в разных местах:
-
В дополнительных свойствах инфоблока.
-
В файле component_epilog.php.
-
Иногда разработчики ошибочно прописывают мета-теги прямо в header.php, что усложняет поддержку.
❌ Пример плохого кода (так делать не надо!):
$SEO_TITLES = array(
"/catalog/filtry_k_elektoerozionike/" => "Купить фильтр недорого",
"/catalog/bloki/" => "Купить осевые блоки в магазине"
);<?if ($SEO_TITLES[$APPLICATION->GetCurPage()]) :?>
<title><?=$SEO_TITLES[$APPLICATION->GetCurPage()]?></title>
<?else :?>
<title><?$APPLICATION->ShowTitle();?></title>
<?endif;?>Такой подход неудобен для редактирования и масштабирования.
Правильный способ: получение SEO-свойств через API Битрикс
Допустим, у нас есть компонент, который не передает ID раздела в $arResult. Решение — получить ID раздела через его символьный код.
1. Получаем символьный код раздела
global $APPLICATION;
$SECTION_CODE = $APPLICATION->GetCurDir(); // Текущий URL2. Очищаем URL от лишних частей
if ($SECTION_CODE != '/articles/') {
$SECTION_CODE = str_replace('/articles/', '', $SECTION_CODE);
$SECTION_CODE = str_replace('/', '', $SECTION_CODE); // Получаем символьный код (например, "tehnika")
}3. Получаем ID раздела по его коду
if (CModule::IncludeModule("iblock")) {
$iblock_id = 9; // ID инфоблока
$section = CIBlockSection::GetList(
["ID" => "ASC"],
["IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y", "CODE" => $SECTION_CODE],
false,
["ID", "NAME"]
);
if ($ar_fields = $section->GetNext()) {
$sectionId = $ar_fields['ID']; // ID текущего раздела
}
}4. Получаем SEO-свойства через D7
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($iblock_id, $sectionId);
$IPROPERTY = $ipropValues->getValues();5. Устанавливаем мета-теги
if ($IPROPERTY['SECTION_META_TITLE']) {
$APPLICATION->SetPageProperty("title", $IPROPERTY['SECTION_META_TITLE']);
$APPLICATION->SetTitle($IPROPERTY['SECTION_META_TITLE']);
}
if ($IPROPERTY['SECTION_META_KEYWORDS']) {
$APPLICATION->SetPageProperty("keywords", $IPROPERTY['SECTION_META_KEYWORDS']);
}
if ($IPROPERTY['SECTION_META_DESCRIPTION']) {
$APPLICATION->SetPageProperty("description", $IPROPERTY['SECTION_META_DESCRIPTION']);
}6. Добавляем раздел в хлебные крошки
Если компонент не выводит название раздела в навигации:
$APPLICATION->AddChainItem($ar_fields['NAME']);Полный код решения
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
$SECTION_CODE = $APPLICATION->GetCurDir();
if ($SECTION_CODE != '/articles/') {
$SECTION_CODE = str_replace('/articles/', '', $SECTION_CODE);
$SECTION_CODE = str_replace('/', '', $SECTION_CODE);
if (CModule::IncludeModule("iblock")) {
$iblock_id = 9;
$section = CIBlockSection::GetList(
["ID" => "ASC"],
["IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y", "CODE" => $SECTION_CODE],
false,
["ID", "NAME"]
);
if ($ar_fields = $section->GetNext()) {
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($iblock_id, $ar_fields['ID']);
$IPROPERTY = $ipropValues->getValues();
if ($IPROPERTY['SECTION_META_TITLE']) {
$APPLICATION->SetPageProperty("title", $IPROPERTY['SECTION_META_TITLE']);
$APPLICATION->SetTitle($IPROPERTY['SECTION_META_TITLE']);
}
if ($IPROPERTY['SECTION_META_KEYWORDS']) {
$APPLICATION->SetPageProperty("keywords", $IPROPERTY['SECTION_META_KEYWORDS']);
}
if ($IPROPERTY['SECTION_META_DESCRIPTION']) {
$APPLICATION->SetPageProperty("description", $IPROPERTY['SECTION_META_DESCRIPTION']);
}
$APPLICATION->AddChainItem($ar_fields['NAME']);
}
}
} else {
// Настройки для главной страницы раздела (/articles/)
$APPLICATION->SetPageProperty("title", 'Статьи');
$APPLICATION->SetTitle('Статьи');
}
?>