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

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

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

Как определить неактивных пользователей в WooCommerce

Под неактивными пользователями обычно понимаются те, кто:

  • Не заходил на сайт более N дней (например, 180 дней)
  • Не совершал заказов за этот период
  • Не имеет открытых подписок или активных ролей

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

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

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

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

function wc_delete_inactive_users() {
    $days_inactive = 180; // Порог неактивности
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));

    global $wpdb;

    // Получаем ID пользователей, у которых последний вход старше порога
    $user_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT u.ID FROM {$wpdb->users} u
         LEFT JOIN {$wpdb->prefix}usermeta um ON u.ID = um.user_id AND um.meta_key = 'last_login'
         WHERE (um.meta_value IS NULL OR um.meta_value < %s)",
        $date_threshold
    ));

    if (empty($user_ids)) {
        return; // Нет подходящих пользователей
    }

    foreach ($user_ids as $user_id) {
        // Проверяем, есть ли у пользователя заказы
        $orders = wc_get_orders(array(
            'customer_id' => $user_id,
            'limit' => 1
        ));

        if (empty($orders)) {
            // Удаляем пользователя
            require_once ABSPATH . 'wp-admin/includes/user.php';
            wp_delete_user($user_id);
        }
    }
}

2. Добавляем хук WP-Cron для регулярного запуска

function wc_schedule_inactive_users_deletion() {
    if (!wp_next_scheduled('wc_delete_inactive_users_event')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_inactive_users_event');
    }
}
add_action('wp', 'wc_schedule_inactive_users_deletion');
add_action('wc_delete_inactive_users_event', 'wc_delete_inactive_users');

3. Записываем дату последнего входа пользователя

WooCommerce по умолчанию не сохраняет дату последнего входа. Нужно добавить:

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

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

  • Выполнить ручной запуск функции wc_delete_inactive_users() через консоль WP-CLI или временно добавить вызов в functions.php и проверить удаление пользователей.
  • Просмотреть список пользователей в админке до и после запуска, убедиться, что удаляются только те, у кого нет заказов и дата последнего входа превышает порог.
  • Проверить логи сервера и базы данных на ошибки.

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

  • Проблема: Пользователи не удаляются, хотя должны.
    Причина: Мета поле last_login не сохраняется или сохраняется в неверном формате.
    Решение: Проверьте, что хук wp_login с функцией wc_save_last_login подключен и работает. Используйте error_log для отладки.
  • Проблема: Ошибка при удалении пользователя.
    Причина: Функция wp_delete_user вызывается без подключения необходимых файлов.
    Решение: Добавьте require_once ABSPATH . 'wp-admin/includes/user.php'; перед вызовом.
  • Проблема: WP-Cron не запускается.
    Решение: Проверьте, что на сайте посещения или внешние триггеры выполняют WP-Cron. При необходимости настройте системный cron для wp-cron.php.

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

  • Безопасность: Перед удалением пользователей сделайте резервную копию базы данных, чтобы избежать потери данных.
  • Производительность: Если база пользователей большая, делайте выборку и удаление партиями, чтобы избежать таймаутов.
  • Логирование: Добавьте логирование удаляемых пользователей для аудита:
function wc_delete_inactive_users() {
    $days_inactive = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
    global $wpdb;
    $user_ids = $wpdb->get_col($wpdb->prepare("SELECT u.ID FROM {$wpdb->users} u
         LEFT JOIN {$wpdb->prefix}usermeta um ON u.ID = um.user_id AND um.meta_key = 'last_login'
         WHERE (um.meta_value IS NULL OR um.meta_value < %s)", $date_threshold));
    if (empty($user_ids)) {
        return;
    }
    foreach ($user_ids as $user_id) {
        $orders = wc_get_orders(array('customer_id' => $user_id, 'limit' => 1));
        if (empty($orders)) {
            require_once ABSPATH . 'wp-admin/includes/user.php';
            if (wp_delete_user($user_id)) {
                error_log("WooCommerce: User $user_id deleted due to inactivity");
            }
        }
    }
}

Сравнение способов реализации

МетодПлюсыМинусыПримечание
Ручное удаление через SQL Быстрое выполнение, без нагрузки на WP Опасно, можно удалить нужных пользователей Требует знаний SQL и создания сложных запросов
Автоматизация на WP-Cron с PHP Безопасно, можно добавить логику проверки Зависит от работы WP-Cron, может быть медленнее Рекомендуется для большинства сайтов
Плагины очистки пользователей Удобный интерфейс, часто с дополнительными настройками Может влиять на производительность, лишние зависимости Использовать если нужна расширенная функциональность
WooCommerce: как автоматически исключать товары из определённых категорий из корзины
15.05.2026
WooCommerce: автоматическое изменение цены товара по ролям пользователей
28.06.2026
WooCommerce: как автоматически удалять товары из корзины при изменении категории
17.06.2026
Автоматическое удаление старого контента в WordPress: эффективные методы и примеры
11.01.2026
WooCommerce: исключение товаров из определённых категорий из поиска
21.04.2026