Полностью перестроим фасетный индекс для указанного инфоблока, корректно получая базовые цены товаров и обрабатывая числовые свойства активных элементов.
Код |
---|
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
Bitrix\Main\Loader::includeModule('iblock');
Bitrix\Main\Loader::includeModule('catalog');
$iblockId = 1; // ID вашего инфоблока
$storage = new Bitrix\Iblock\PropertyIndex\Storage($iblockId);
// Пересоздаем индекс
if ($storage->isExists()) {
$storage->drop();
}
$storage->create();
// Выбираем активные элементы
$elements = CIBlockElement::GetList(
[],
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'IBLOCK_SECTION_ID']
);
while ($element = $elements->Fetch()) {
$elementId = (int)$element['ID'];
$sectionId = (int)$element['IBLOCK_SECTION_ID'];
// Индексируем базовую цену (правильный метод)
$price = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $elementId,
"CATALOG_GROUP_ID" => 1 // ID базового типа цены
)
)->Fetch();
if ($price && isset($price['PRICE'])) {
$storage->queueIndexEntry(
$sectionId,
$elementId,
$storage::priceIdToFacetId(1),
0,
(float)$price['PRICE'],
true
);
}
// Индексируем только числовые свойства
$properties = CIBlockElement::GetProperty($iblockId, $elementId, [], []);
while ($prop = $properties->Fetch()) {
if ($prop['PROPERTY_TYPE'] === 'N' && !empty($prop['VALUE'])) {
$storage->queueIndexEntry(
$sectionId,
$elementId,
$storage::propertyIdToFacetId($prop['ID']),
0,
(float)$prop['VALUE'],
true
);
}
}
}
$storage->flushIndexEntries();
echo "Индекс перестроен для числовых свойств и цен"; |