1С-Битрикс: привязка товара к категории по значению атрибута


Приведенный ниже код позволяет осуществить автоматическую привязку товаров каталога к определенной категории по значению (VALUE_ID) свойства товара.

В данном примере необходимо указать параметры:
$IBLOCK_ID – id инфблока с товарами; 
$ACTION_PROMO_ATTR – id значения (VALUE_ID) атрибута, по которому ищутся товары; 
$ACTION_SECTION – id категории к которой необходимо привязать товары.

// конфиг 

$IBLOCK_ID = 2; // id инфблока с товарами 

$ACTION_PROMO_ATTR = 325; // id значения (value_id) атрибута, по которому ищутся товары 

$ACTION_SECTION = 172; // if категории, к которой нужно привязать товары 

 

CModule::IncludeModule('iblock'); 
 

// при необходимости - очищаем категорию 
 
/* 
$arSelect = Array('ID', 'NAME'); 

$arFilter = Array('IBLOCK_ID' => $IBLOCK_ID, 'SECTION_ID' => $ACTION_SECTION); 

$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
*/

 

while ($ob = $res->GetNextElement()) { 

        $arElement = $ob->GetFields(); 

        $groups = array(); 

        $arGroups = CIBlockElement::GetElementGroups($arElement['ID'], true); 

        while ($group = $arGroups->Fetch()) { 

            if ($group['ID'] != $ACTION_SECTION) $groups[] = $group['ID']; 

        } 

        CIBlockElement::SetElementSection($arElement['ID'], $groups); 

        \Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex($IBLOCK_ID, $arElement['ID']); 

} 

 

// добавляем товары в категорию 

 

$arSelect = Array('ID', 'NAME'); 

$arFilter = Array('IBLOCK_ID' => $IBLOCK_ID, 'PROPERTY_PROMO' => $ACTION_PROMO_ATTR); 

$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect); 

  

while ($ob = $res->GetNextElement()) { 

        $arElement = $ob->GetFields(); 

        $groups = array(); 

        $arGroups = CIBlockElement::GetElementGroups($arElement['ID'], true); 

        while ($group = $arGroups->Fetch()) { 

            $groups[] = $group['ID']; 

} 

if (!in_array($ACTION_SECTION, $groups)) $groups[] = $ACTION_SECTION; 

CIBlockElement::SetElementSection($arElement['ID'], $groups); 

\Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex($IBLOCK_ID, $arElement['ID']); 

}