Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Очистить брошенные корзины с помощью API 1С-Битрикс

Просмотров: 1121

Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их очистить. Включая и корзины зарегистрированных пользователей, которые просто не дооформили заказ. При этом используя API 1С-Битрикс, а не прямые запросы в базу данных.

Вообще, в модуле каталога есть такая настройка "Сохранять корзину (дней):" в которой можно указать количество дней, после которого брошенная корзина удаляется.

Очистить брошенные корзины с помощью API 1С-Битрикс

Но, по какой-то причине эта настройка не работает ни на одном сайте. И судя по тому, сколько тем создано на форуме, по данному вопросу, не работает настройка ни у кого.

На нескольких сайтах нашел способ удаления брошенных корзин с помощью прямого запроса в базу данных. Но этот способ мне не нравится, какой-то он не гибкий и монструзно не очевидный.

Получаем все корзины, всех пользователей через API и удаляем

Все просто: получаем все корзины всех пользователей (включая не зарегистрированных) методом \Bitrix\Sale\Basket::getList и очищаем.

use \Bitrix\Main\Loader;

Loader::includeModule('catalog');

$obBasket = \Bitrix\Sale\Basket::getList(
    array(
        'select'  => array(
            'FUSER_ID'
        ),
        'filter' => array(
            'ORDER_ID' => 'NULL',
        ),
    )
);
while($bItem = $obBasket->Fetch()){
    CSaleBasket::DeleteAll(
        $bItem['FUSER_ID'],
        False
    );
}
  • Для удаления корзин нам достаточно знать только FUSER_ID - ID пользователя владельца корзины (это не тоже самое что USER_ID).
  • Отбираем корзины не связанные с заказом 'ORDER_ID' => 'NULL', то есть не оформленные корзины.
  • C помощью CSaleBasket::DeleteAll, зная FUSER_ID владельца, удаляем корзину.
Этот способ более очевидный и более гибкий, нежели прямые запросы в БД: можно очищать корзины по параметрам, добавляя в фильтр нужные отборы.
Например: только корзины за определный период или корзины определенных пользователей.

Очистить брошенные корзины за заданный период

Что бы не запускать этот скрипт вручную, можно сделать консольный скприт и запускать его по расписанию.

И, наверное, не стоит очищать все корзины, пользователь может вернуться на сайт и дооформить заказ. Лучше очищать корзины старше определенного периода. Например: корзины которые не были оформлены за последние 15 дней оставляем, остальные удаляем.

$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
// скрипт для запуска по cron
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
@set_time_limit(0);

use \Bitrix\Main\Loader;

Loader::includeModule('catalog');

$date = date('d.m.Y', time() - 86400 * 15);
$obBasket = \Bitrix\Sale\Basket::getList(
    array(
        'select'  => array(
            'FUSER_ID'
        ),
        'filter' => array(
            'ORDER_ID' => 'NULL',
            '<=DATE_INSERT' => $date
        ),
    )
);
while($bItem = $obBasket->Fetch()){
    CSaleBasket::DeleteAll(
        $bItem['FUSER_ID'],
        False
    );
}

В переменной $date держим текущую дату за минусом 15-ти дней и используем в фильтре корзин '<=DATE_INSERT' => $date, получая корзины старше 15-ти дней.

Увеличить или уменьшить срок можно тут 86400 * 15, меняя цифру перемножения на 86400 секунд (это 1 день).

Михаил Базаров 06.11.2022
ORM  getList - шпаргалка

'select'  => ... // имена полей, которые необходимо получить в результате
'filter'  => ... // описание фильтра для WHERE и HAVING
'group'   => ... // явное указание полей, по которым нужно группировать результат
'order'   => ... // параметры сортировки
'limit'   => ... // количество записей
'offset'  => ... // смещение для limit
'runtime' => ... // динамически определенные поля
Максим 15.03.2023
Михайл, добрый день. Я так понимаю, что первый пример можно использовать в файле init.php или лучше создать всё таки отдельный файл и запускать?
Михаил Базаров 15.03.2023
Лучше на расписание повесить, ни к чему init.php засирать)

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Наличие на складах в умном фильтре 1С-Битрикс, с автоматическим обнов... Просмотров: 1116 Задача: добавить возможность фильтрации товаров по складам в умном фильтре. Данные должны ... Глобальные фильтры на всякие случаи жизни Просмотров: 47108 Глобальный фильтр, нужен чаще всего, для вывода определенных элементов, из общего массива... Установить цену товара из свойства инфоблока Просмотров: 10054 На одном из проектов, нужно было единоразово заполнить цены товаров из свойства инфоблока... Подключение SSL на Битрикс виртуальная машина Просмотров: 13280 С первого января 2017 года, наличие безопасного соединения HTTPS становится практически об... Ссылка и название раздела в списке новостей Битрикс Просмотров: 11470 Если нужно вывести название раздела инфоблока в котором находится конкретный элемент/новос... Вывести разделы инфоблока в которых находится элемент Битрикс Просмотров: 17017 Если нужно в карточке товара или новости, вывести структуру разделов в котором находится э... Если товар в корзине, поменять кнопку на "В корзине" в новом шаблоне ... Просмотров: 1769 Ранее я уже делал заметку на эту тему. Тогда, мы меняли значение input-а при добавлении то... Создание локальных уведомлений для приложения на Apache Cordova Просмотров: 233 Задача состоит в том, чтобы реализовать возможность локальных уведомлений в приложении на ... Вывести минимальную цену торговых предложений в Битрикс Просмотров: 28104 Если у товара несколько торговых предложений и у каждого предложения разные цены, иногда т... Простой WEB сервер на ubuntu, для Битрикс Просмотров: 35932 Расскажу как по быстрому сконфигурировать WEB сервер для работы с Битрикс. Безо всяких ngi... Пункты меню из разделов инфоблока Битрикс Просмотров: 93239 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Отфильтровать новости в Битрикс за заданный период Просмотров: 16693 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Создать pdf файл из элемента инфоблока, дать скачать пользователю, по... Просмотров: 5332 Задача: при каждом посещении статьи, на сайте, нужно создавать pdf файл с ее содержимым и ... Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс Просмотров: 9783 В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне кор... Вывести минимальную и максимальную цену в разделе каталога Битрикс. Просмотров: 3665 Что бы вывести минимальную и максимальную стоимость товаров, из каталога 1С-Битрикс, доста... Помечаем новинки лейблом в каталоге битрикс Просмотров: 20850 Достаточно часто, при разработке каталога товаров или интернет магазина на системе управле... Очистить брошенные корзины с помощью API 1С-Битрикс Просмотров: 1121 Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их оч... Отсортировать элементы в Битрикс по свойству привязка к разделам Просмотров: 28993 При создании достаточно сложных интернет-магазинов на Битрикс, иногда встает задача помимо... Фотогалерея на базе компонента новостей, с fancybox. Просмотров: 2906 Это заметка обновление к очень старой, уже имеющейся на сайте. Сделаем что-то типа фотогал... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 24495 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,...