Битрикс: какого х*я ты ищешь в неактивных разделах
Столкнулся с проблемой что если родительский раздел не активен а элементы активны битрикс все равно индексирует их.
Чтоб исправить этот казус вешаем обработчик и запускаем переиндексацию. После в результатах поиска элементы неактивного раздела исчезнут.
Чтоб исправить этот казус вешаем обработчик и запускаем переиндексацию. После в результатах поиска элементы неактивного раздела исчезнут.
<? AddEventHandler('search', 'BeforeIndex', "onBeforeIndexHandler"); function onBeforeIndexHandler($arFields) { if ($arFields["MODULE_ID"] == "iblock") { $check = substr($arFields["ITEM_ID"], 0, 1); if ($check == "S") { $res = CIBlockSection::GetList( Array('SORT' => 'ASC') , Array("IBLOCK_ID" => $arFields["PARAM2"], "ACTIVE" => "Y", "ID" => substr($arFields["ITEM_ID"], 1), "GLOBAL_ACTIVE" => "Y") , false , Array("ID") ); } else { $res = CIBlockElement::GetList( Array("SORT" => "ASC") , Array("IBLOCK_ID" => $arFields["PARAM2"], "ACTIVE" => "Y", "ID" => $arFields["ITEM_ID"], "SECTION_GLOBAL_ACTIVE" => "Y") , false , false , Array("ID") ); } if (!$res->Fetch()) { unset($arFields["BODY"]); unset($arFields["TITLE"]); } } return $arFields; }
У меня не сработало решение сначала. НО, я заменил
ОтветитьУдалитьunset($arFields["BODY"])';
unset($arFields["TITLE"]);
на
$arFields["BODY"]='';
$arFields["TITLE"]='';
и заработало. Очень благодарю :)
Правда, это не решает такую проблему: товар привязан к двум категориям, одна из них деактивируется, но она была для него основной. В таком случае, при поиске товар будет находится (он же привязан в т.ч. активной категории), но с адресом в неактивной категории. На этот случай нужно дорабатывать этот обработчик чтобы заменялось $arFields['URL']
После данной процедуры поиск вообще не работает - ничего не находит
ОтветитьУдалить