Назад

Как получить SEO-данные раздела инфоблока в Битрикс по ID

Главная
Блог
Как получить SEO-данные раздела инфоблока в Битрикс по ID

При разработке сайтов на 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-данных в любых компонентах.

Полезные ссылки:

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи