Просмотров: 653
Задача: сайт проработал 7 лет и все время на нем была открытая регистрация, создано много мертых учетных записей (боты, просто фантомные регистрации и.т.д.). Необходимо удалить всех пользователей, у которых нет заказов в интернет магазине.

Получаем список пользователей и заказ пользователя
Сначала нужно получить список всех пользователей и определитть есть ли у пользователя хотя бы один заказ. Если ни одного заказа нет, удаляем пользователя.
CModule::IncludeModule('sale');
global $USER;
$rsUsers = CUser::GetList(
($by = "ID"),
($order = "desc"),
false
);
while ($arUser = $rsUsers->Fetch()) {
$dbOrders = CSaleOrder::GetList(
false,
array(
'USER_ID' => $arUser['ID']
)
false,
array (
nTopCount => '1'
)
);
while ($arOrder = $dbOrders->Fetch()){
$userHasOrder = $arOrder['ID'];
}
if (!$userHasOrder) {
CUser::Delete($arUser['ID']);
}
unset($userHasOrder);
}
- CModule::IncludeModule('sale'); - подключили модуль sale
- С помощью CUser::GetList получили список всех пользователей
- Внутри цикла перебора пользователей использовали CSaleOrder::GetList, что бы получить список заказов пользователя (фильтр 'USER_ID' => $arUser['ID']).
- Достачтоно знать хотя бы об одном заказе, что бы скрипт отрабатал быстрее, поэтому используем ограничение выборки nTopCount => '1'
- Если у пользователя есть заказ, в переменную $userHasOrder передаем ID заказа (не обязательно, можно просто создать эту переменную $userHasOrder = true)
- Если переменная $userHasOrder не существует, значит у пользователя нет заказов, удаляем пользователя методом CUser::Delete
- Удаляем переменную $userHasOrder с помощью unset, что бы не передалась дальше по циклу перебора пользователей.
Таким образом, после отработки скрипта, на сайте осталось всего 5 000 пользователей вместо 360 000 мертвых душ.
Все комментарии:
Оставить комментарий

Михаил Базаров 05.04.2023
Можно повесить этот скрипт на cron расписание, если хотите периодически подчищать пользователей без заказов.
Код скрипта:
Код скрипта:
Код |
---|
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__) . '/../..'); define('NO_KEEP_STATISTIC', true); define('NOT_CHECK_PERMISSIONS', true); define('BX_NO_ACCELERATOR_RESET', true); require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'); @set_time_limit(0); @ignore_user_abort(true); CModule::IncludeModule('sale'); global $USER; $rsUsers = CUser::GetList( ($by = "ID"), ($order = "desc"), false ); while ($arUser = $rsUsers->Fetch()) { $dbOrders = CSaleOrder::GetList( false, array( 'USER_ID' => $arUser['ID'] ) false, array ( nTopCount => '1' ) ); while ($arOrder = $dbOrders->Fetch()){ $userHasOrder = $arOrder['ID']; } if (!$userHasOrder) { CUser::Delete($arUser['ID']); } unset($userHasOrder); } |