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

Что считается неактивным пользователем в WooCommerce?

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

Критерии неактивности могут быть разные, например:

  • Отсутствие заказов за последние 12 месяцев;
  • Отсутствие входа в аккаунт в течение 6 месяцев;
  • Нет активности в профиле или взаимодействий с сайтом.

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

Для начала нужно собрать данные о пользователях и их активности. WooCommerce хранит заказы в таблице wp_posts с типом shop_order, а данные пользователей — в wp_users и метаданных wp_usermeta.

Для проверки, кто из пользователей неактивен, можно использовать SQL-запросы:

SELECT u.ID, u.user_login, MAX(p.post_date) AS last_order_date
FROM wp_users u
LEFT JOIN wp_posts p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY u.ID
ORDER BY last_order_date ASC;

Этот запрос покажет дату последнего заказа каждого пользователя. Если у пользователя нет заказов, last_order_date будет NULL.

Для проверки последнего входа можно использовать метаданные, если плагин или тема записывают это время. По умолчанию WordPress не хранит дату последнего входа, поэтому ее нужно реализовать отдельно.

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

Реализуем cron-задачу, которая будет каждый месяц удалять пользователей, не сделавших заказ более 12 месяцев и не заходивших на сайт больше 6 месяцев (если есть данные последнего входа).

1. Сохраняем дату последнего входа пользователя

Добавьте в functions.php вашей темы или в кастомный плагин следующий код, чтобы фиксировать последний вход:

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

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

function delete_inactive_woocommerce_users() {
    global $wpdb;
    $date_12_months_ago = date('Y-m-d H:i:s', strtotime('-12 months'));
    $date_6_months_ago = date('Y-m-d H:i:s', strtotime('-6 months'));

    // Получаем ID пользователей, у которых нет заказов за последние 12 месяцев
    $users = $wpdb->get_results(
        "SELECT u.ID FROM {$wpdb->users} u
         LEFT JOIN {$wpdb->posts} p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing') AND p.post_date >= %s
         WHERE p.ID IS NULL",
         $date_12_months_ago
    );

    foreach ($users as $user) {
        $last_login = get_user_meta($user->ID, 'last_login', true);
        if (!$last_login || $last_login <= $date_6_months_ago) {
            require_once(ABSPATH . 'wp-admin/includes/user.php');
            wp_delete_user($user->ID);
        }
    }
}

3. Регистрируем WP-Cron для запуска функции раз в месяц

if (!wp_next_scheduled('delete_inactive_users_monthly')) {
    wp_schedule_event(time(), 'monthly', 'delete_inactive_users_monthly');
}
add_action('delete_inactive_users_monthly', 'delete_inactive_woocommerce_users');

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

После добавления кода:

  • Проверьте, что в пользовательских метаданных появляется ключ last_login при входе пользователя.
  • Запустите функцию вручную для теста, например, вызвав delete_inactive_woocommerce_users() в консоли WP CLI или временно через add_action('init', 'delete_inactive_woocommerce_users');.
  • Проверьте, что неактивные пользователи удаляются из базы.
  • Отслеживайте журнал ошибок и уведомления сервера, чтобы убедиться в отсутствии сбоев.

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

  • Отсутствие данных о последнем входе: Если вы не реализовали сохранение даты последнего входа, фильтр на этот параметр работать не будет. В таком случае удалять пользователей только по дате заказов.
  • Неправильный формат дат в SQL-запросах: Убедитесь, что даты передаются корректно, используйте $wpdb->prepare() для безопасного формирования запросов.
  • Удаление администраторов и важных пользователей: Добавьте проверку ролей, чтобы не удалять админов и менеджеров.
  • WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron отключен. Настройте системный cron или запускайте вручную.

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

  • Перед удалением пользователей создавайте резервные копии базы данных.
  • Ограничьте права на выполнение удаления только для суперадминистраторов (если сайт мультисайт).
  • Используйте wp_delete_user() для корректного удаления с очисткой связанных данных.
  • Для больших баз данных обрабатывайте пользователей пакетами, чтобы не перегружать сервер.
  • Мониторьте логи ошибок и создайте уведомления на email при выполнении очистки.

Таблица сравнения вариантов реализации

МетодОписаниеПлюсыМинусы
Ручное удаление через SQLПрямой запрос к базе для удаленияБыстро, без загрузки PHPРиск удаления важных данных, минус вызова хуков
PHP-скрипт с wp_delete_user()Использование WP APIБезопасно, удаляет всю связанную информациюНагрузка на сервер при большом количестве пользователей
Плагины очисткиГотовые решения (Clearfy Pro и др.)Простота, дополнительные функцииЗависимость от стороннего кода, стоимость
WooCommerce: автоматическое удаление неактивных пользователей по дате последнего заказа
11.05.2026
Автоматическое создание категорий в WordPress с помощью кода
20.03.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров с помощью кода
01.07.2026
WooCommerce: автоматическое изменение статусов заказов по условиям
23.06.2026
Как автоматически создавать контент на основе GPT в WordPress
07.01.2026