Удалить всех пользователей которые не делали заказов в магазине 1С-Битрикс

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

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

Удалить всех пользователей которые не делали заказов в магазине 1С-Битрикс

Получаем список пользователей и заказ пользователя

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


$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);
}
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');
Гость 12.10.2023
Кроме группы кто админы и менеджеры магазина - так верней.
Евгения 22.04.2024
Доброго времение, Михаил.
Подскажите, куда вставить этот код, чтобы произвести удаление? в init.php?
И да, обработка идет по всем группам пользователей или же только обычные пользователи, без доп прав?
Михаил Базаров 22.04.2024
Можно вставить просто на любой странице сайта и открыть ее в браузере, только потом не забудте удалить из этой страницы.
Можно в админке, в "Командная php строка" и выполнить.
Проверки на группы нет, удалятся все пользователи которые не делали заказов.
Единственное не удалится пользователь с ID 1 (самый первый, главный Администратор) - даже если у него нет заказов.