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

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

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

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

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

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

SELECT u.ID, u.user_login, u.user_email, MAX(o.post_date) as last_order_date
FROM wp_users u
LEFT JOIN wp_posts o ON o.post_author = u.ID AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE u.ID IN (
  SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%customer%'
)
GROUP BY u.ID
HAVING last_order_date IS NULL OR last_order_date < DATE_SUB(NOW(), INTERVAL 12 MONTH);

Этот запрос выбирает клиентов без заказов или с последним заказом более года назад.

Пошаговое решение: автоматизация удаления неактивных клиентов

1. Создаем WP-Cron задачу для регулярной проверки

Для автоматизации добавим функцию в functions.php или в отдельный плагин.

if (!wp_next_scheduled('wc_delete_inactive_customers_cron')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_cron');
}

add_action('wc_delete_inactive_customers_cron', 'wc_delete_inactive_customers');

function wc_delete_inactive_customers() {
    global $wpdb;
    $interval = '12 MONTH'; // период неактивности

    // Получаем ID неактивных клиентов
    $user_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT u.ID FROM {$wpdb->users} u
         LEFT JOIN {$wpdb->posts} o ON o.post_author = u.ID AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
         WHERE EXISTS (
             SELECT 1 FROM {$wpdb->usermeta} um WHERE um.user_id = u.ID AND um.meta_key = '{$wpdb->prefix}capabilities' AND um.meta_value LIKE %s
         )
         GROUP BY u.ID
         HAVING MAX(o.post_date) IS NULL OR MAX(o.post_date) < DATE_SUB(NOW(), INTERVAL $interval)",
         '%customer%'
    ));

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

2. Запуск и проверка работы задачи

Для ручного запуска можно использовать WP-CLI:

wp cron event run wc_delete_inactive_customers_cron

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

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

  • Сравните количество пользователей с ролью customer до и после запуска:
    SELECT COUNT(*) FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%customer%';
  • Проверьте, что не осталось пользователей без заказов старше 12 месяцев.
  • Просмотрите логи сервера на предмет ошибок при выполнении WP-Cron.

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

  • Удаляются активные пользователи. Проверьте правильность условия в SQL, убедитесь, что учитываются только нужные статусы заказов.
  • WP-Cron не запускается. Проверьте, что ваш сайт получает трафик или настройте системный cron для wp-cron.php.
  • Ошибка прав доступа при удалении пользователя. Добавьте проверку прав или используйте функцию wp_delete_user с правильным контекстом.
  • Пользователи с ролью, отличной от customer, удаляются. Убедитесь, что условие фильтрации по роли корректно, используйте точное совпадение по мета-данным.

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

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

Сравнение вариантов удаления неактивных клиентов

МетодОписаниеПлюсыМинусы
WP-Cron + собственный кодАвтоматическая очистка через регулярную задачу с кастомным SQLГибкость, отсутствие доп. плагиновТребует навыков, возможны проблемы с производительностью на больших базах
Плагины очистки пользователейГотовые решения для удаления неактивных пользователейПростота установки, готовый интерфейсМогут быть избыточными, влияют на производительность, не всегда точны
Ручное удаление через админкуУдаление пользователей вручнуюКонтроль над процессомНевозможно для больших баз, трудозатратно
Как создать автоматический мониторинг сайта на WordPress для отслеживания доступности и ошибок
16.12.2025
Как избежать размытых изображений в WordPress: практическое руководство
29.01.2026
Жесткая фильтрация входящих данных в WordPress: практические методы и примеры
09.12.2025
WooCommerce: автоматическое удаление старых заказов и оптимизация базы данных
27.06.2026
WooCommerce: автоматическое удаление закрытых заказов
04.07.2026