Bitrix
PHP разработка

Как добавить поиск по свойствам в bitrix:catalog.search

Как включить поиск по свойству инфоблока (например, Артикулу) в bitrix:catalog.search через обработчик события BeforeIndex в init.php.

Киселев Александр
Киселев Александр
Разработчик SiteVisor.Cloud5 окт 2023· 2 мин
Читать автора

Задача была настроить поиск по свойству типа "Строка", но через настройки свойства в инфоблоке, а именно чекбокса "Значения свойства участвуют в поиске" не удалось запустить поиск по Артикулу. Решить эту проблему можно очень просто, используя следующий код: В вашей файле /local/php_interface/init.php необходимо добавить обработчик для события "BeforeIndex", который будет отрабатывать перед индексаций каждого элемента инфоблока. Делаем это с помощью следующего кода:

use \Bitrix\Main\EventManager;

$eventManagerInstance = EventManager::getInstance();
$eventManagerInstance->addEventHandler(
    "search",
    "BeforeIndex",
    [
        "Handlers", // Название класса
        "beforeIndex" // Название статичного метода
    ]
);

class Handlers
{
 public static function beforeIndex($arFields)
    {

        if (!$arFields["MODULE_ID"] == "iblock" && $arFields['PARAM2'] == CATALOG_IBLOCK_ID) {
            return $arFields;
        }
        
        \Bitrix\Main\Loader::includeModule('iblock');
        $product = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($arFields['ITEM_ID'], [
            'select' => ['ID', 'SKU' => 'VENDOR_CODE.VALUE'],
        ])->fetch();

        $arFields['TITLE'] .= ' ['.$product['SKU'].']';

        return $arFields;
    }
}

В этом коде на каждом товаре, который сейчас будет индексироваться, получаем его с помощью getList и записывает в $arFields['TITLE'] наш Артикул или другое значение, по которому вы хотите, чтобы работал поиск. Большой текст можно записать в начало или конец $arFields['BODY']

Просмотров: 1105

Комментарии (3)

l
lamer20079 июл 2026

а если у товара несколько SKU (торговых предложений), то getByPrimary по ID элемента же вернет только один VENDOR_CODE? или там как раз через ElementCatalogTable агрегация идет, я не до конца понял этот момент

k
kesha9 фев 2026

спасибо, помогло, но у меня почему-то $arFields['PARAM2'] сравнение вообще не срабатывало как ожидалось - там странная логика с !$arFields[...] == ..., по факту условие всегда true получалось из-за приоритета операторов. переписал через if ($arFields['MODULE_ID'] == 'iblock' && $arFields['PARAM2'] == CATALOG_IBLOCK_ID) и стало норм

О
Оксана17 июн 2025

делал похожим образом года три назад, только через CIBlockElement::GetList доставал артикул, а не D7. работает, но после апдейта ядра индексация стала в разы медленнее на 50к товарах - подозреваю что именно из-за доп запроса на каждый элемент в BeforeIndex. может у кого есть вариант с батчевой подгрузкой, чтобы не дергать бд на каждый item?

Похожие материалы

Проверьте это на своём сайте

Бесплатные инструменты SiteVisor разбирают индексацию, robots.txt, редиректы и микроразметку — без регистрации и настройки.