Бывает ситуация, когда пользователь добавил товары в корзину, но по какой-то причине не оформил заказ. При этом корзина никуда не девается и продолжает висеть на сайте. В настройках можно задать время хранения брошенных корзин, но почему-то настройка не работает. Остается один выход - программное удаление брошенных корзин.
Скрипт удаления брошенных корзин можно реализовать через ajax либо создать какой-нибудь файл php и в него внести такой код:
use \Bitrix\Main\Loader;
Loader::includeModule('catalog');
Loader::includeModule('sale');
$basket = \Bitrix\Sale\Basket::getList(
array(
'select' => array('FUSER_ID'),
'filter' => array('ORDER_ID' => 'NULL',),
)
);
while($Item = $basket->Fetch()){
CSaleBasket::DeleteAll($Item['FUSER_ID'], false);
}
И конечно не забудьте в самом начале файла подключить пролог, иначе ничего не сработает. Далее, вводим адрес созданного файла в адресной строке и проверяем отсутствие брошенных корзин в админке по пути Админка - Магазин - Покупатели - Корзины.
А теперь все по порядку. Чтобы сделать выборку корзин, нужно обязательно подключить модуль торговый каталог (catalog) и модуль интернет-магазин (sale). Далее выбираем брошенные корзины - это корзины, которые не привязаны к заказу, т.е. в фильтре значение ORDER_ID устанавливаем в NULL. В выборке мы должны получить ID пользователей, которые создали брошенные корзины - это параметр FUSER_ID. Значение параметра FUSER_ID не всегда совпадает с ID пользователя на сайте. А именно, если в корзину товары добавлял авторизованный пользователь, то FUSER_ID = USER_ID (ID пользователя в системе). В противном случае в FUSER_ID попадает ID неавторизованного покупателя, который Битрикс генерирует автоматически.
И наконец в цикле while мы пробегаем по всем таким покупателям и удаляем корзины, которые к ним привязаны с помощью метода DeleteAll класса CSaleBasket модуля интернет-магазин.