WooCommerce: автоматическое удаление заблокированных и неактивных пользователей без плагинов

Почему важно удалять заблокированных и неактивных пользователей в WooCommerce

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

Поэтому регулярное удаление таких пользователей позволяет:

  • Оптимизировать базу данных и повысить производительность сайта.
  • Уменьшить риски безопасности, связанные с заблокированными аккаунтами.
  • Упростить управление клиентской базой.

Диагностика: как определить заблокированных и неактивных пользователей

В WooCommerce обычно не предусмотрено поле «заблокирован» по умолчанию. Чаще всего блокировка реализуется через изменение роли пользователя на, например, blocked или добавление специального пользовательского мета-поля, например account_status со значением blocked.

Неактивных пользователей можно определять по дате последнего входа — например, если пользователь не заходил на сайт более 6 месяцев. Чтобы хранить дату последнего входа, часто добавляют хук, который обновляет пользовательское мета поле last_login.

Проверка наличия мета-полей для блокировки и последнего входа

SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE meta_key IN ('account_status', 'last_login') LIMIT 10;

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

Пошаговое решение: как автоматически удалять заблокированных и неактивных пользователей

1. Добавляем фиксацию даты последнего входа пользователя

В файл functions.php темы или в кастомный плагин добавьте следующий код:

add_action('wp_login', 'update_last_login_meta', 10, 2);
function update_last_login_meta($user_login, $user) {
    update_user_meta($user->ID, 'last_login', current_time('mysql'));
}

Этот хук обновляет дату последнего входа при каждом успешном входе.

2. Определяем, как помечаются заблокированные пользователи

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

3. Создаем функцию для удаления пользователей

function delete_blocked_and_inactive_users() {
    global $wpdb;
    // Устанавливаем дату 6 месяцев назад
    $date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    // Получаем ID пользователей с ролью blocked
    $blocked_users = get_users(array(
        'role' => 'blocked',
        'fields' => 'ID'
    ));

    // Получаем ID пользователей, не заходивших более 6 месяцев
    $inactive_users = $wpdb->get_col($wpdb->prepare(
        "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %s",
        $date_threshold
    ));

    // Объединяем ID, убираем дубли
    $users_to_delete = array_unique(array_merge($blocked_users, $inactive_users));

    foreach ($users_to_delete as $user_id) {
        require_once(ABSPATH . 'wp-admin/includes/user.php');
        wp_delete_user($user_id);
    }
}

4. Запускаем функцию по расписанию (WP-Cron)

Добавьте планировщик, чтобы удалять пользователей автоматически, например, раз в месяц:

if (!wp_next_scheduled('delete_blocked_and_inactive_users_hook')) {
    wp_schedule_event(time(), 'monthly', 'delete_blocked_and_inactive_users_hook');
}

add_action('delete_blocked_and_inactive_users_hook', 'delete_blocked_and_inactive_users');

Проверка результата после внедрения решения

  • Зайдите в БД и проверьте, что пользователи с ролью blocked и с датой последнего входа старше 6 месяцев удалены.
  • Проверьте, что функция update_last_login_meta корректно обновляет мета-поле, войдя под разными пользователями.
  • Выполните вручную вызов delete_blocked_and_inactive_users() через консоль WP-CLI для проверки без ожидания cron.

Частые ошибки и как их исправить

  • Отсутствие мета-поля last_login: функция фильтрации не работает. Решение: добавьте хук wp_login для записи даты входа.
  • Неправильные роли для блокировки: если блокировка реализована через пользовательское поле, а не роль, необходимо изменить код выборки пользователей.
  • Крон не срабатывает: проверьте, активен ли WP-Cron, и нет ли конфликтов с другими плагинами.
  • Удаление пользователей с важными заказами: перед удалением проверьте, что пользователи без активных заказов, чтобы не нарушить логику WooCommerce.

Практические советы по безопасности и производительности

  • Перед массовым удалением пользователей сделайте резервную копию базы данных.
  • Добавьте проверку наличия заказов у пользователей перед удалением, например:
function can_delete_user($user_id) {
    $orders = wc_get_orders(array('customer_id' => $user_id, 'limit' => 1));
    return empty($orders);
}
  • Регулярно проверяйте и очищайте базу данных от устаревших данных, включая мета-поля пользователей.
  • Для более надежного планирования задач используйте системный cron вместо WP-Cron, если позволяет хостинг.

Сравнение способов удаления пользователей

МетодПлюсыМинусы
Удаление через плагин (например, WP Bulk Delete)Простота настройки, интерфейсНагрузка на сайт, зависимость от стороннего кода
Ручное удаление через SQL запросыБыстро, без нагрузки на WPРиск ошибок, сложность для непрофессионалов
Автоматизация через WP-Cron и кастомный кодГибкость, интеграция с бизнес-логикойНеобходимы навыки, настройка cron
Автоматическое удаление старого метаданных в WordPress
10.04.2026
WooCommerce: как добавить автоподсказки в поиск товаров
29.06.2026
Как автоматически удалять неиспользуемые типы записей в WordPress
23.02.2026
WooCommerce: автоматическое отслеживание и удаление товаров без наличия на складе
17.06.2026
Как исправить проблему с не обновляющейся ценой вариаций товаров в WooCommerce
30.04.2026