Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливаются пользователи, которые зарегистрировались, но не совершали покупки или не заходили в личный кабинет долгое время. Это увеличивает размер базы данных, замедляет работу сайта и усложняет аналитику. Кроме того, может негативно сказаться на рассылках и маркетинге, если рассылать письма неактивным клиентам. Удаление таких пользователей помогает оптимизировать работу магазина.
Как определить неактивных клиентов в WooCommerce
Ключевые признаки неактивности:
- Отсутствие заказов за длительный период (например, 6 месяцев и более)
- Отсутствие входов в аккаунт (последний логин более 6 месяцев назад)
WooCommerce хранит историю заказов, а WordPress — дату последнего входа пользователя можно получить либо через плагины, либо с помощью пользовательского поля, если оно настроено.
Пример SQL-запроса для проверки неактивных клиентов (без последнего логина):
SELECT u.ID, u.user_login, MAX(p.post_date) AS last_order_date
FROM wp_users u
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')
GROUP BY u.ID
HAVING last_order_date < DATE_SUB(NOW(), INTERVAL 6 MONTH) OR last_order_date IS NULL;Пошаговое решение: автоматическое удаление неактивных клиентов через код
Реализуем PHP-функцию, которая по крону будет удалять пользователей, не совершавших заказов более 6 месяцев. Для безопасности удаление будет происходить только для пользователей с ролью customer.
Шаг 1. Создаем функцию для выборки и удаления неактивных пользователей
function wprus_delete_inactive_customers() {
$args = array(
'role' => 'customer',
'fields' => array('ID'),
'number' => -1,
);
$users = get_users($args);
$threshold = strtotime('-6 months');
foreach ($users as $user) {
$last_order = get_last_order_date($user->ID);
if (!$last_order || strtotime($last_order) < $threshold) {
wp_delete_user($user->ID);
}
}
}
function get_last_order_date($user_id) {
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
'status' => array('completed', 'processing'),
));
if (!empty($orders)) {
return $orders[0]->get_date_created()->date('Y-m-d H:i:s');
}
return false;
}Шаг 2. Добавляем WP-Cron задачу для регулярного запуска
add_action('wprus_daily_delete_inactive_customers', 'wprus_delete_inactive_customers');
if (!wp_next_scheduled('wprus_daily_delete_inactive_customers')) {
wp_schedule_event(time(), 'daily', 'wprus_daily_delete_inactive_customers');
}Шаг 3. Отменяем задачу при деактивации темы/плагина (опционально)
function wprus_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wprus_daily_delete_inactive_customers');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wprus_daily_delete_inactive_customers');
}
}
register_deactivation_hook(__FILE__, 'wprus_deactivate_cleanup');Проверка результата после внедрения
Чтобы проверить, что решение работает:
- Запустите функцию вручную через
do_action('wprus_daily_delete_inactive_customers');вfunctions.phpили через WP-CLIwp eval 'do_action("wprus_daily_delete_inactive_customers");'. - Проверьте, что пользователи с отсутствием заказов более 6 месяцев удалились (через админку или SQL запрос).
- Мониторьте логи ошибок и работу WP-Cron с помощью плагина Cron Manager или WP-CLI.
Частые ошибки и как их исправить
- Удаляются не те пользователи: проверьте роль пользователя и условия выборки заказов.
- Функция не запускается по расписанию: убедитесь, что WP-Cron работает, нет проблем с посещаемостью сайта или используйте системный cron для вызова wp-cron.php.
- Пользователи с активными заказами удаляются: проверьте правильность статусов заказов в фильтре
wc_get_orders. - Ошибки при удалении пользователей: убедитесь, что нет ограничений на удаление, и что пользователь не является администратором.
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте резервную копию базы данных.
- Добавьте логирование удаленных пользователей для аудита.
- Ограничьте количество пользователей, удаляемых за один запуск, чтобы не создавать нагрузку.
- Используйте транзакции, если база поддерживает, для отката при ошибках.
- Проверяйте наличие плагинов, которые могут блокировать удаление пользователей.
Таблица сравнения методов удаления неактивных клиентов
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
| Ручное удаление | Простота, контроль | Затратно по времени, риск ошибок | Через админку WordPress |
| Плагин для очистки | Удобство, интерфейс | Зависимость от сторонних разработчиков, нагрузка | Плагины типа WP Sweep |
| Код с WP-Cron | Автоматизация, гибкость, контроль | Требует навыков программирования | Приведенный код выше |