Проблема: накопление неактивных клиентов в WooCommerce и нагрузка на базу данных
В крупных интернет-магазинах на WooCommerce часто накапливается большое количество учетных записей клиентов, которые давно не совершали покупок и не проявляли активности. Это ведет к росту базы данных, замедлению работы сайта и усложнению аналитики. Автоматическое удаление таких клиентов позволяет поддерживать базу в актуальном состоянии.
Диагностика: как определить неактивных клиентов в WooCommerce
Для начала нужно определить критерии «неактивности». Обычно это клиенты, которые:
- не совершали заказов за последние N месяцев;
- не заходили на сайт (по дате последнего входа);
- не обновляли профиль.
WooCommerce хранит заказы в таблице wp_posts с типом shop_order, а связь с клиентом — через мета-поле _customer_user. Логин пользователя — в таблице wp_users, последний вход — в поле user_last_login (если используется плагин для отслеживания логинов, иначе нужно внедрять свой код).
Пошаговое решение: автоматическое удаление неактивных клиентов
1. Определение неактивных пользователей по заказам
Напишем запрос, который ищет пользователей без заказов за последние 6 месяцев:
SELECT ID FROM wp_users WHERE ID NOT IN ( SELECT DISTINCT CAST(meta_value AS UNSIGNED) FROM wp_postmeta WHERE meta_key = '_customer_user' AND post_id IN ( SELECT ID FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH) ) );Этот запрос вернёт ID пользователей без заказов за последние 6 месяцев.
2. Удаление пользователей программно через WP_CLI
Реализуем WP_CLI команду для удаления таких пользователей (рекомендуется запускать из консоли сервера):
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc delete_inactive_customers', function() {
global $wpdb;
$query = "SELECT ID FROM {$wpdb->users} WHERE ID NOT IN (
SELECT DISTINCT CAST(pm.meta_value AS UNSIGNED) 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-completed', 'wc-processing')
AND p.post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH)
)";
$users = $wpdb->get_col($query);
foreach ($users as $user_id) {
wp_delete_user($user_id);
WP_CLI::log("Deleted user ID: $user_id");
}
});
}Команду можно запустить в терминале командой wp wc delete_inactive_customers.
3. Автоматизация через Cron
Чтобы не запускать команду вручную, добавим WP Cron задачу:
function schedule_inactive_customers_cleanup() {
if (!wp_next_scheduled('wc_cleanup_inactive_customers')) {
wp_schedule_event(time(), 'weekly', 'wc_cleanup_inactive_customers');
}
}
add_action('wp', 'schedule_inactive_customers_cleanup');
add_action('wc_cleanup_inactive_customers', function() {
global $wpdb;
$query = "SELECT ID FROM {$wpdb->users} WHERE ID NOT IN (
SELECT DISTINCT CAST(pm.meta_value AS UNSIGNED) 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-completed', 'wc-processing')
AND p.post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH)
)";
$users = $wpdb->get_col($query);
foreach ($users as $user_id) {
wp_delete_user($user_id);
}
});Этот код запустит удаление неактивных клиентов раз в неделю.
Проверка результата
- Перед запуском — сделайте резервную копию базы данных.
- Запустите код вручную или WP CLI команду и проверьте логи на удаление пользователей.
- Проверьте в админке WooCommerce список пользователей — неактивные должны исчезнуть.
- Для теста создайте тестовых пользователей с и без заказов и проверьте, что удаляются только неактивные.
Частые ошибки и как их исправить
- Удаление нужных пользователей: При неправильном запросе могут удалиться активные клиенты. Чтобы избежать, всегда проверяйте SQL-запрос на тестовой базе.
- Отсутствие учета статуса заказа: Не учитывайте статусы заказов, которые действительно считаются завершенными (wc-completed, wc-processing). Иначе удалите клиентов с текущими заказами.
- Проблемы с WP Cron: WP Cron запускается только при посещении сайта. Для надежности используйте системный cron или WP CLI.
- Отсутствие резервной копии: Удаление пользователей — необратимая операция. Обязательно делайте бэкап.
Практические советы по безопасности и производительности
- Запускайте удаление неактивных клиентов в низкую нагрузку на сервер время (ночь или раннее утро).
- Ограничьте количество удаляемых пользователей за один прогон (например, по 50), чтобы избежать таймаутов и нагрузок.
- Используйте WP CLI для большей надежности и контроля.
- Если у вас есть плагин для управления пользователями (например, User Insights), интегрируйте логику удаления с его отчетами.
- При большом количестве пользователей используйте прямые SQL-запросы с осторожностью и тестируйте на копии сайта.
Сравнение подходов удаления неактивных клиентов
| Способ | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP CLI команда | Надежно, быстро, можно запускать вручную | Требует доступа к серверу и командной строке | Подходит для опытных админов и разработчиков |
| WP Cron с PHP кодом | Автоматизация без внешних инструментов | Зависит от посещаемости сайта, может пропустить запуск | Используйте системный cron для вызова wp-cron.php |
| Плагин с UI | Удобство управления через админку | Может быть тяжелым и ненастраиваемым | Используйте только проверенные плагины |