Диагностика проблемы: зачем и когда нужно удалять неактивных клиентов в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается большое количество пользователей, которые зарегистрировались, но не сделали ни одного заказа или перестали совершать покупки давно. Это влияет на производительность базы данных, рассылки и аналитику. Автоматическое удаление таких неактивных клиентов помогает поддерживать чистоту базы и ускорять работу сайта.
Ключевой критерий — отсутствие заказов за заданный период времени. Часто бывает, что пользователи регистрируются, но не покупают, либо давно не активны и не планируют возвращаться.
Как определить неактивного клиента по истории заказов
Неактивный клиент — это пользователь, у которого нет заказов со статусами processing, completed или аналогичными, сделанных в последние N месяцев. В нашем примере возьмём 6 месяцев.
Для диагностики можно использовать SQL-запрос, чтобы понять, есть ли у пользователя заказы в нужный период:
SELECT COUNT(*) FROM wp_posts AS orders
JOIN wp_postmeta AS meta ON orders.ID = meta.post_id
WHERE orders.post_type = 'shop_order'
AND orders.post_status IN ('wc-processing', 'wc-completed')
AND meta.meta_key = '_customer_user'
AND meta.meta_value = USER_ID
AND orders.post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH);Замените USER_ID на ID пользователя. Если результат 0, значит заказов нет.
Пошаговое решение: скрипт для автоматического удаления неактивных клиентов
Реализуем функцию на PHP, которую можно запускать через WP-Cron или вручную для удаления пользователей без заказов за последние 6 месяцев.
function wc_delete_inactive_customers( $months = 6 ) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime("-{$months} months"));
// Получаем ID пользователей, у которых нет заказов за последние $months
$user_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN (
SELECT DISTINCT meta_value AS user_id FROM {$wpdb->postmeta} pm
JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE pm.meta_key = '_customer_user'
AND p.post_type = 'shop_order'
AND p.post_status IN ('wc-processing', 'wc-completed')
AND p.post_date > %s
) orders ON u.ID = orders.user_id
WHERE orders.user_id IS NULL
AND u.user_registered < %s
AND u.ID != 1", // исключаем администратора с ID=1
$date_limit,
$date_limit
)
);
if ( empty( $user_ids ) ) {
return 'Неактивных пользователей для удаления не найдено';
}
foreach ( $user_ids as $user_id ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
return sprintf('Удалено %d неактивных пользователей.', count( $user_ids ));
}Для запуска вручную:
add_action('admin_init', function() {
if ( current_user_can('manage_options') && isset($_GET['delete_inactive']) && $_GET['delete_inactive'] == '1' ) {
$result = wc_delete_inactive_customers(6);
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
}
});Зайдите в админку и добавьте в адресную строку ?delete_inactive=1 для запуска удаления.
Проверка результата после внедрения
- Проверьте количество пользователей в разделе «Пользователи» до и после запуска скрипта.
- Запустите SQL-запрос из раздела диагностики для случайных пользователей, чтобы убедиться, что отсутствуют заказы и что такие пользователи удалены.
- Проверьте логи ошибок и убедитесь, что не возникло сбоев при удалении.
Частые ошибки и как их исправить
- Удаляются администраторы или нужные пользователи. Решение: в скрипте исключён пользователь с ID=1, но если у вас несколько админов — добавьте дополнительные проверки по ролям через
get_userdata()и условиеuser_can( $user_id, 'administrator' ). - Пользователи с заказами удаляются. Проверьте правильность статусов заказов в запросе — WooCommerce может использовать кастомные статусы. Убедитесь, что статусы указаны верно.
- Большая нагрузка на базу при большом числе пользователей. Разбейте удаление на пакеты по 100 пользователей, вызывая функцию циклично.
- Скрипт не запускается через WP-Cron. Убедитесь, что WP-Cron включён и настроен, либо используйте системный cron для запуска WP-Cron.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Добавьте логирование удалённых пользователей в отдельный файл для аудита.
- Задавайте период удаления (например, 6 месяцев) с запасом — не удаляйте слишком свежих пользователей.
- Используйте WP-CLI для пакетного запуска и мониторинга процессов по расписанию.
- Если база большая — оптимизируйте SQL-запрос, индексируйте колонки
post_dateиmeta_key.
Сравнение вариантов автоматического удаления неактивных клиентов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Кастомный PHP-скрипт (как в статье) | Полный контроль, гибкость, без сторонних плагинов | Требует навыков, возможны ошибки при сложных условиях | Использовать для уникальных требований и при наличии разработчика |
| Плагин для очистки пользователей | Простота использования, готовые функции | Могут быть ресурсоёмкими, ограничены в настройках | Подходит для небольших сайтов, проверять совместимость с WooCommerce |
| WP-CLI команды для массового удаления | Быстро и эффективно для больших баз | Не подходит для новичков, требует SSH доступа | Использовать на больших проектах с доступом к серверу |