Меню

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

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

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

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

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

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

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

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

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

use \Bitrix\Main\Loader;

Loader::includeModule('catalog');
Loader::includeModule('sale');

$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');
Loader::includeModule('sale');

$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' => ... // динамически определенные поля
Михаил Базаров 24.03.2023
Цитата
Гость написал:
Ещё заметил, что после удачного выполнения скрипта, таблица b_sale_fuser оказалось такой же полной. А в админке нет не одной брощенной корзины. Очень странно!

Проверил на одном проекте, все в порядке, таблица почти пустая. Проверьте что в ней за записи, возможно там очень много пустых корзин. Могут плодиться компонентом bitrix.basket.basket.small
При каждом заходе пользователей или ботов (хоть поисковиков) создается пустая корзина готовая к наполнению.
Вообще, проверю позже на другом проекте, допишу в заметку как и их грохать периодически.
Александр 12.12.2024
Небольшая тонкость:

Указанная настройка модуля магазина, работает не совсем так, как от нее многие ожидают. Просто не все внимательно читают документацию. Вот описание данного параметра
Цитата
Указывается период времени (в днях), в течение которого корзина, сформированная неавторизованным покупателем, будет сохраняться в системе. Неверно подобранное значение этого поля может сказаться на размере базы данных. При больших объемах продаж, либо большом числе пользователей рекомендуется уменьшать число дней.

Корзины авторизованных покупателей не очищаются, а специально сохраняются

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 350 000 руб.
от 4-х недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

Готовое решение — вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Запускается на одном из 200-та (на ваш выбор) готовых решений.

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.