О web-разработке
и даже немного больше...

Удаление «брошенных» корзин в системе Битрикс

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

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

Если вы не знакомы с агентами в системе битрикс, то можно кратко рассказать о том, что это такое. Агентами в системе битрикс называют функции или методы, которые созданы для выполнения каких-либо задач, по расписанию. За одно, мы посмотрим простой пример, как мы можем создать своего агента в системе битрикс.

Нашу функцию, которая будет заниматься удалением старых корзин мы символически назовем deleteOldBaskets () и разместим её в файле /bitrix/php_interface/init.php.

function deleteOldBaskets(){
	if ( CModule::IncludeModule("sale") && CModule::IncludeModule("catalog") ){
		global $DB;
		$nDays = 1; // сроком старше одного дня
		$nDays = IntVal($nDays);
		$strSql =
			"SELECT f.ID ".
			"FROM b_sale_fuser f ".
			"LEFT JOIN b_sale_order o ON (o.USER_ID = f.USER_ID) ".
			"WHERE ".
			"   TO_DAYS(f.DATE_UPDATE)<(TO_DAYS(NOW())-".$nDays.") ".
			"   AND o.ID is null ".
			"   AND f.USER_ID is null ".
			"LIMIT 3000";
		$db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		while ($ar_res = $db_res->Fetch()){
			CSaleBasket::DeleteAll($ar_res["ID"], false);
			CSaleUser::Delete($ar_res["ID"]);
		}
	}
	return "deleteOldBaskets();";
}

Обратите на один важный момент, агенты в системе битрикс должны возвращать имя функции, без этого запускаться агент не будет. Итак, после того как мы прописали функцию в скрипте init.php, теперь необходимо в администраторской части создать сам агент, и задать ему интервал, с которым будет запускаться данная функция.
Переходим на страницу: Настройки > Настройки продукта > Агенты
Жмем на кнопку «Добавить агента», появиться форма:

Выставляем дату первого запуска, флажок активности, в поле «Функция агента» прописываем имя функции, в нашем случае это deleteOldBaskets();. Кроме того выставляем флажок на поле «Периодический», и выставляем интервал времени, через который агент будет запускаться.

Вы можете при необходимости создавать свои функции для обработки данных по расписанию. Агенты в моем случае срабатывают по крону, вам так же следует убедиться, в как запускаются ваши агенты в системе.

Опубликован: 28.02.2017 г.

См. также:

«Не удалось установить соединение с сервером. Проверьте …».
Получение Email-адреса покупателя в заказе (Bitrix D7)
Работа с URL-адресами в Bitrix D7
Работа с купонами в Bitrix API
Добавляем пункт меню для списков в админке Битрикс
Диалоговые окна в Bitrix API
Создание инфоблока при установке модуля
Создание копии корзины из заказа на Bitrix D7

Комментарии

  1. Илья пишет:

    Здравствуйте.

    Как я понимаю данная функция удаляет только корзины неавторизированных пользователь? Но мне нужно удалить все корзины старше 3х месяцев.
    Если удалить из WHERE "o.ID is null " и "f.USER_ID is null " то будут удалятся все поля?
    Я работаю через инфоблоки, и если честно с трудом представляю структуру БД Битрикс.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта