Бывают случаи что после не правильного импорта или не правильной работы парсера, у товаров дублируются цены, а расширенное управление ценами не включено.
В моём случаи, этот косяк всплыл в поиске. Когда в поле поиска вводилась название товара, то поиск в выдаче, показывал один и тот же товар, с одной и той же ссылкой, но с разными ценами…
Анализ кода показал, что у одного товара есть несколько цен с разными id. При этом если зайти в админку и отредактировать товар и сохранить, то дубли у товара пропадают.
Но что делать, если таких товаров много?
Для этой цели и был написан этот скрипт
$arFilter = array( "IBLOCK_ID" => array(8) ); $arSelect = array("ID", "IBLOCK_ID", "NAME", "CODE", "CATALOG_GROUP_1"); $res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect); while($ob = $res->Fetch()){ $arResult["ITEMS"][] = $ob; } //массив для хранения, данных о повторах $ids = array(); //Заносим все ID в массив foreach ($arResult["ITEMS"] as $key => $item) { $ids[] = $item['ID']; } //Ищем дубли $dd = array_count_values($ids); //Перебираем дубли и создаём массив с id товара и ценами foreach ($dd as $key_dd => $value_dd) { if($value_dd > 1){ //echo $key_dd; foreach ($arResult["ITEMS"] as $n => $item2) { if($key_dd == $item2['ID']){ $dd_arr['item_' . $item2['ID']][] = $item2['CATALOG_PRICE_ID_1']; } } } } //Перебираем новый массив и удаляем все цены кроме 1 цены foreach ($dd_arr as $key => $dd) { $item_id = str_replace('item_', '', $key); $price_id = $dd[1]; echo 'Дубли у товара ID ' . $item_id . ' удалены
'; CPrice::DeleteByProduct($item_id,array($price_id)); }