Почему важно удалять неактивных клиентов в 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-скриптом | Полностью автоматизировано, работает на стандартном хостинге | Может быть ненадёжным при низком трафике, возможны таймауты |
| Плагины очистки базы | Простота использования, готовые решения | Могут не учитывать бизнес-логику, риск удаления нужных пользователей |