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

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

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

Признаки проблемы:

  • База пользователей растёт при отсутствии реальной активности;
  • Высокий процент пользователей без заказов;
  • Увеличение времени отклика сайта из-за тяжёлых запросов к таблице wp_users и метаданным;
  • Сложности с рассылками и сегментацией клиентов.

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

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

1. Определение критериев неактивности

В нашем примере неактивный пользователь — тот, кто не входил в систему и не совершал заказов более 180 дней.

2. Создание WP-Cron задачи для периодической очистки

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

function wpmy_schedule_inactive_users_cleanup() {
    if ( ! wp_next_scheduled( 'wpmy_clean_inactive_users_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpmy_clean_inactive_users_hook' );
    }
}
add_action( 'wp', 'wpmy_schedule_inactive_users_cleanup' );

function wpmy_clean_inactive_users_callback() {
    global $wpdb;

    $cutoff = strtotime( '-180 days' );
    $cutoff_mysql = date( 'Y-m-d H:i:s', $cutoff );

    // Получаем ID пользователей, которые не заходили в систему 180+ дней
    $inactive_users = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->users} u
        LEFT JOIN {$wpdb->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)",
        $cutoff_mysql
    ) );

    if ( empty( $inactive_users ) ) {
        return;
    }

    // Фильтруем пользователей, у которых нет заказов WooCommerce
    $users_to_delete = [];
    foreach ( $inactive_users as $user_id ) {
        $orders = wc_get_orders( [
            'customer_id' => $user_id,
            'limit' => 1,
        ] );
        if ( empty( $orders ) ) {
            $users_to_delete[] = $user_id;
        }
    }

    // Удаляем пользователей
    foreach ( $users_to_delete as $uid ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user( $uid );
    }
}
add_action( 'wpmy_clean_inactive_users_hook', 'wpmy_clean_inactive_users_callback' );

3. Отслеживание последнего входа пользователя

WordPress по умолчанию не хранит дату последнего входа. Чтобы это сделать, добавьте следующий код:

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

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

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

  • Убедитесь, что CRON событие wpmy_clean_inactive_users_hook запланировано. Для этого можно использовать плагин WP Crontrol или выполнить:
print_r( wp_next_scheduled( 'wpmy_clean_inactive_users_hook' ) );
  • Проверьте в базе данных, что у пользователей с датой последнего входа старше 180 дней и без заказов пользователей удаляют.
  • Можно вручную вызвать функцию wpmy_clean_inactive_users_callback() для теста.

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

  • Отсутствие данных о последнем входе: Если мета last_login не обновляется, убедитесь, что хук wp_login активен и код добавлен корректно.
  • Ошибки при удалении пользователей: Проверьте, что функция wp_delete_user вызывается с корректным ID, и у пользователя нет связанных данных, которые блокируют удаление.
  • CRON задача не запускается: На некоторых хостингах WP-Cron не работает без внешних вызовов. Настройте реальный системный cron или используйте плагин для управления cron.

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

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

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

МетодПлагинКодКомпромисс
Использование плагинаWP User Manager, Cleanup PluginsНетПростота настройки, но может нагружать сайт и иметь лишний функционал
Собственный код с WP-CronНетДаГибкость и точность, требует навыков, можно оптимизировать под конкретные задачи
Внешний скрипт + WP REST APIНетДаВысокая нагрузка на сервер при больших базах, требует настройки безопасности
Как удалить вредоносные плагины в WordPress: пошаговое руководство
13.11.2025
WooCommerce: решение проблемы с неотображением вариаций товаров
02.06.2026
WooCommerce: как решить проблему с неотображением вариаций товаров
25.05.2026
WooCommerce: автоматическое удаление отменённых заказов
11.06.2026
Как избежать конфликтов между WooCommerce и другими плагинами WordPress
27.04.2026