Проблема: накопление неактивных клиентов в WooCommerce
С течением времени база WooCommerce может содержать большое количество клиентов, которые давно не совершали покупок и не взаимодействовали с сайтом. Это увеличивает размер базы данных, замедляет запросы и затрудняет аналитику и маркетинг. Простого способа автоматической очистки таких клиентов в WooCommerce нет, поэтому приходится создавать кастомные решения.
Диагностика: как определить неактивных клиентов
В WooCommerce клиенты — это пользователи с ролью customer. Неактивными считаются те, кто не совершал заказов и не был авторизован давно. Для оценки активности можно использовать следующие критерии:
- Отсутствие заказов за последние N месяцев
- Дата последнего логина пользователя
- Дата регистрации пользователя (если он неактивен с регистрации)
Для проверки активности можно использовать SQL-запросы или WP_User_Query с мета-полями. Например, чтобы вывести пользователей-customer, которые не делали заказов за последний год:
SELECT u.ID, u.user_login FROM wp_users u
LEFT JOIN wp_wc_customer_lookup c ON u.ID = c.user_id
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') AND p.post_date > DATE_SUB(NOW(), INTERVAL 12 MONTH)
WHERE u.ID NOT IN (SELECT post_author FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND post_date > DATE_SUB(NOW(), INTERVAL 12 MONTH))
AND u.ID = c.user_id
AND c.user_id IS NOT NULL
AND u.user_registered < DATE_SUB(NOW(), INTERVAL 12 MONTH);Пошаговое решение: автоматическое удаление неактивных клиентов
1. Создаем кастомный скрипт на PHP
Добавьте следующий код в файл functions.php вашей темы или создайте небольшой плагин для автоматизации:
function wc_delete_inactive_customers() {
$months_inactive = 12; // период неактивности в месяцах
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$months_inactive} months"));
// Получаем пользователей с ролью customer, зарегистрированных до $date_threshold
$args = array(
'role' => 'customer',
'date_query' => array(
'before' => $date_threshold,
),
'fields' => 'ID',
'meta_query' => array(
'relation' => 'OR',
// Пользователи без заказов
array(
'key' => '_last_order',
'compare' => 'NOT EXISTS'
),
// Пользователи, у которых последний заказ старше $date_threshold
array(
'key' => '_last_order',
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME'
),
),
);
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
if (empty($users_to_delete)) {
error_log('WooCommerce: Нет неактивных клиентов для удаления');
return;
}
foreach ($users_to_delete as $user_id) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
error_log("WooCommerce: Удален неактивный клиент ID {$user_id}");
}
}
// Добавляем хук для запуска по крону
add_action('wc_cron_delete_inactive_customers', 'wc_delete_inactive_customers');
// Регистрируем задание, если еще не зарегистрировано
if (!wp_next_scheduled('wc_cron_delete_inactive_customers')) {
wp_schedule_event(time(), 'weekly', 'wc_cron_delete_inactive_customers');
}2. Обновляем мета-данные о последнем заказе клиента
Чтобы корректно работать с последним заказом, добавьте обновление мета-поля _last_order при каждом успешном заказе:
add_action('woocommerce_order_status_completed', function($order_id) {
$order = wc_get_order($order_id);
$user_id = $order->get_user_id();
if ($user_id) {
update_user_meta($user_id, '_last_order', current_time('mysql'));
}
});3. Тестируем выполнение
Выполните вручную задание WP-Cron:
do_action('wc_cron_delete_inactive_customers');Проверьте логи ошибок или добавьте временно error_log для контроля. Убедитесь, что неактивные клиенты удаляются.
Проверка результата после внедрения
- Запустите скрипт вручную через консоль WP-CLI или вызов функции.
- Проверьте наличие клиентов в базе через админку WooCommerce (раздел «Клиенты»).
- Сделайте заказ от нового пользователя и проверьте, что он не удаляется.
- Отслеживайте логи ошибок для выявления проблем.
Частые ошибки и способы их исправления
- Не удаляются пользователи: Проверьте, правильно ли обновляется мета-поле
_last_order. Без него скрипт не сможет определить активность. - Удаляются активные клиенты: Проверьте логику даты и правильность временной зоны сервера.
- WP-Cron не запускается: Настройте системный cron или проверьте доступность вызова
wp-cron.php. - Пользователи с другими ролями удаляются: В запросе WP_User_Query укажите строго роль
customer.
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервные копии базы или экспортируйте список удаляемых клиентов.
- Добавьте в скрипт ограничение на количество удаляемых клиентов за один запуск, чтобы избежать таймаутов.
- Используйте транзакции базы данных при массовом удалении, если это возможно.
- Регулярно пересматривайте период неактивности, чтобы не удалять потенциальных клиентов.
Сравнение методов автоматического удаления неактивных клиентов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин очистки клиентов | Простота, готовый UI, поддержка | Может быть платным, нагрузка, ограниченная кастомизация |
| Кастомный WP-Cron скрипт | Полный контроль, тонкая настройка, бесплатный | Нужны навыки разработки, возможны ошибки при реализации |
| Ручное удаление через базу данных | Быстро, без дополнительного кода | Риск ошибок, отсутствие автоматизации, сложность для новичков |