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

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

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

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

Для начала нужно чётко определить критерии неактивности. Обычно это пользователи с ролью customer или subscriber, которые:

  • Не заходили на сайт более 6 месяцев (по дате последнего входа);
  • Не совершали заказов за тот же период.

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

SELECT u.ID, u.user_login, u.user_email, MAX(p.post_date) AS last_order<br>FROM wp_users u<br>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')<br>WHERE u.ID IN (SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%customer%')<br>GROUP BY u.ID<br>HAVING (MAX(p.post_date) IS NULL OR MAX(p.post_date) < DATE_SUB(NOW(), INTERVAL 6 MONTH))<br>AND u.user_registered < DATE_SUB(NOW(), INTERVAL 6 MONTH);

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

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

1. Создание кастомной WP-CLI команды для удаления

Для безопасного выполнения удаления создадим WP-CLI команду, чтобы запускать процесс вручную и по крону:

if ( defined('WP_CLI') && WP_CLI ) {<br>    WP_CLI::add_command('wc-delete-inactive-customers', function() {<br>        $args = [<br>            'role' => 'customer',<br>            'meta_query' => [],<br>            'fields' => ['ID', 'user_email'],<br>            'number' => -1,<br>        ];<br><br>        $users = get_users($args);<br>        $count = 0;<br>        $threshold_date = strtotime('-6 months');<br><br>        foreach ($users as $user) {<br>            $last_order_date = wc_get_customer_last_order_date($user->ID);<br>            $user_registered = strtotime(get_userdata($user->ID)->user_registered);<br><br>            if (($last_order_date === false || strtotime($last_order_date) < $threshold_date) && $user_registered < $threshold_date) {<br>                require_once ABSPATH . 'wp-admin/includes/user.php';<br>                wp_delete_user($user->ID);<br>                $count++;<br>            }<br>        }<br><br>        WP_CLI::success("Удалено неактивных клиентов: $count");<br>    });<br>}<br><br>/**<br> * Получение даты последнего заказа клиента<br> */<br>function wc_get_customer_last_order_date($user_id) {<br>    $orders = wc_get_orders([<br>        'customer' => $user_id,<br>        'limit' => 1,<br>        'orderby' => 'date',<br>        'order' => 'DESC',<br>        'status' => ['wc-completed', 'wc-processing'],<br>    ]);<br>    if (empty($orders)) {<br>        return false;<br>    }<br>    return $orders[0]->get_date_created()->date('Y-m-d H:i:s');<br>}

2. Настройка WP-Cron для регулярного выполнения

Добавим планировщик для запуска команды раз в месяц.

add_action('wc_delete_inactive_customers_cron', function() {<br>    if (defined('WP_CLI') && WP_CLI) {<br>        WP_CLI::runcommand('wc-delete-inactive-customers');<br>    }<br>});<br><br>if (!wp_next_scheduled('wc_delete_inactive_customers_cron')) {<br>    wp_schedule_event(time(), 'monthly', 'wc_delete_inactive_customers_cron');<br>}

Примечание: WP-CLI из крона может не работать без дополнительной настройки. Для надёжности можно сделать отдельный PHP-скрипт или использовать серверный cron для вызова WP-CLI.

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

  • Запустите WP-CLI команду вручную: wp wc-delete-inactive-customers. В консоли увидите количество удалённых клиентов.
  • Проверьте в админке WooCommerce в разделе «Пользователи», что неактивные клиенты отсутствуют.
  • Сделайте выборочный SQL-запрос, аналогичный тому, что использовался для диагностики, чтобы убедиться в отсутствии старых записей.

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

  • Удаляются неправильные пользователи: Проверьте фильтр по роли и дату регистрации. В коде важно правильно учитывать роли и даты.
  • WP-CLI команда не запускается из крона: Настройте вызов WP-CLI через системный cron с полным путём к PHP и WP-CLI, либо реализуйте удаление через отдельный PHP-скрипт.
  • Пользователи с заказами удаляются: Проверьте логику получения даты последнего заказа, возможно, используются неверные статусы заказов.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Добавьте логирование удалений в отдельный файл для последующего аудита.
  • При большом количестве пользователей разбивайте удаление на партии (batch processing), чтобы избежать таймаутов.
  • Используйте транзакции в базе, если планируете сложные операции с зависимостями.
  • Ограничьте права запуска WP-CLI, чтобы избежать случайного удаления.

Сравнение вариантов реализации автоматического удаления

Метод Плюсы Минусы
WP-CLI команда Безопасное управление, легко запускать вручную, гибко Не всегда удобно запускать из крона, требует доступа к консоли
WP-Cron с PHP-скриптом Полностью автоматизировано, работает на стандартном хостинге Может быть ненадёжным при низком трафике, возможны таймауты
Плагины очистки базы Простота использования, готовые решения Могут не учитывать бизнес-логику, риск удаления нужных пользователей
Как использовать хук WooCommerce 'woocommerce_order_status_changed' для отправки дополнительных уведомлений
21.04.2026
Как автоматизировать создание и обновление sitemap в WordPress
07.04.2026
Как использовать WooCommerce хуки для автоматизации управления заказами
10.05.2026
Создать и использовать собственный тип записи (Custom Post Type) в WordPress с примерами кода
14.01.2026
Как создать автоматический бэкап в WordPress с помощью плагинов и кода
28.12.2025