При разработке сайтов на 1С-Битрикс часто требуется выводить SEO-метатеги (Title, Description, Keywords) для разделов каталога. Это важно для SEO-оптимизации и корректного отображения страниц в поисковых системах.
В этой статье разберём оптимальный способ получения SEO-данных из вкладки «SEO» раздела инфоблока, используя D7 API Битрикс, с кешированием и обработкой ошибок.
1. Получение SEO-данных раздела по ID
Для работы с SEO-свойствами раздела используется класс \Bitrix\Iblock\InheritedProperty\SectionValues.
Базовый код (без кеширования)
use Bitrix\Iblock\InheritedProperty\SectionValues;
$SECTION_ID = 123; // ID раздела
$IBLOCK_ID = 11; // ID инфоблока
try {
// Получаем SEO-данные раздела
$ipropSectionValues = new SectionValues($IBLOCK_ID, $SECTION_ID);
$arSEO = $ipropSectionValues->getValues();
// Устанавливаем метатеги
if (!empty($arSEO['SECTION_META_TITLE'])) {
$APPLICATION->SetPageProperty("title", $arSEO['SECTION_META_TITLE']);
}
if (!empty($arSEO['SECTION_META_DESCRIPTION'])) {
$APPLICATION->SetPageProperty("description", $arSEO['SECTION_META_DESCRIPTION']);
}
if (!empty($arSEO['SECTION_META_KEYWORDS'])) {
$APPLICATION->SetPageProperty("keywords", $arSEO['SECTION_META_KEYWORDS']);
}
// Можно также установить заголовок страницы
if (!empty($arSEO['SECTION_PAGE_TITLE'])) {
$APPLICATION->SetTitle($arSEO['SECTION_PAGE_TITLE']);
}
} catch (Exception $e) {
// Логируем ошибку (например, если раздела не существует)
\Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), "SEO error");
} Что возвращает getValues()?
Метод возвращает массив с SEO-данными, например:
[
'SECTION_META_TITLE' => 'Купить гвозди',
'SECTION_META_DESCRIPTION' => 'Отличные цены на гвозди в Москве',
'SECTION_META_KEYWORDS' => 'гвозди, купить гвозди',
'SECTION_PAGE_TITLE' => 'Гвозди строительные',
// ... и другие SEO-поля
]2. Оптимизация: Добавляем кеширование
Чтобы избежать лишних запросов к базе данных, кешируем SEO-данные на 1 час (3600 секунд):
use Bitrix\Main\Data\Cache;
$cache = Cache::createInstance();
$cacheId = "seo_section_{$IBLOCK_ID}_{$SECTION_ID}";
$cacheTime = 3600; // 1 час
$cacheDir = "/seo_sections/";
if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
$arSEO = $cache->getVars();
} elseif ($cache->startDataCache()) {
try {
$ipropValues = new SectionValues($IBLOCK_ID, $SECTION_ID);
$arSEO = $ipropValues->getValues();
$cache->endDataCache($arSEO);
} catch (Exception $e) {
$cache->abortDataCache();
\Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), "SEO cache error");
}
}3. Проверка существования раздела
Перед получением SEO-данных проверим, существует ли раздел:
use Bitrix\Iblock\SectionTable;
if (!SectionTable::getById($SECTION_ID)->fetch()) {
// Раздел не найден
$APPLICATION->ThrowException("Раздел #{$SECTION_ID} не существует");
return false;
}4. Мультиязычность (для мультирегиональных сайтов)
Если сайт поддерживает несколько языков, можно учитывать текущий язык:
use Bitrix\Main\Context;
$context = Context::getCurrent();
$languageId = $context->getLanguage();
// Пример для мультиязычного SEO (если используется модуль "Инфоблоки 2.0")
$arSEO = SectionValues($IBLOCK_ID, $SECTION_ID, $languageId)->getValues();5. Альтернативные способы
Через CIBlockSection::GetByID (устаревший, но рабочий метод)
$section = CIBlockSection::GetByID($SECTION_ID)->Fetch();
if ($section) {
$ipropValues = new SectionValues($section['IBLOCK_ID'], $section['ID']);
$arSEO = $ipropValues->getValues();
}Через D7-таблицы (современный способ)
use Bitrix\Iblock\SectionTable;
$section = SectionTable::getById($SECTION_ID)->fetch();
if ($section) {
$ipropValues = new SectionValues($section['IBLOCK_ID'], $section['ID']);
$arSEO = $ipropValues->getValues();
}Вывод
- Лучший способ – использовать
SectionValuesс кешированием (п. 1 + п. 2). - Дополнительно – проверять существование раздела (п. 3).
- Для мультиязычных сайтов – учитывать язык (п. 4).
Этот подход оптимизирует производительность и обеспечивает корректное отображение SEO-данных в любых компонентах.
Полезные ссылки: