Проблема: накопление неактивных клиентов и заказов в WooCommerce
При длительной работе интернет-магазина на WooCommerce база данных может заметно разрастаться за счет клиентов, которые не совершали покупок или не заходили в личный кабинет длительное время. Это влияет на производительность сайта и усложняет администрирование. Как автоматически удалять таких неактивных пользователей и связанные с ними заказы — задача, требующая аккуратного подхода.
Диагностика проблемы
Для начала нужно определить критерии неактивности. Обычно используют комбинацию следующих факторов:
- Дата последнего заказа;
- Дата последнего входа на сайт (login);
- Отсутствие активности в течение определенного времени (например, 12 месяцев).
Для диагностики можно использовать SQL-запросы к базе данных или плагины с отчетностью, например Clearfy Pro для мониторинга и очистки.
Пошаговое решение: автоматическое удаление неактивных клиентов и их заказов
1. Определяем неактивных пользователей по дате последнего заказа
WooCommerce хранит заказы как тип записи shop_order, а связь с пользователем — через метаполе _customer_user. Чтобы найти пользователей без заказов за последний год, воспользуемся SQL-запросом:
SELECT u.ID FROM wp_users u LEFT JOIN wp_posts p ON u.ID = p.post_author AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing') WHERE (p.post_date IS NULL OR p.post_date < DATE_SUB(NOW(), INTERVAL 12 MONTH));Но в WooCommerce чаще заказы привязаны через метаполе, поэтому более точный способ — использовать WP_Query и метазапросы.
2. Скрипт для удаления пользователей и заказов
Ниже пример кода для файла functions.php или отдельного плагина, который удалит пользователей без заказов или с заказами старше 12 месяцев, а также их заказы:
function wc_delete_inactive_customers() {
$args = [
'role' => 'customer',
'fields' => 'ID',
];
$user_ids = get_users($args);
$now = current_time('mysql');
$date_limit = date('Y-m-d H:i:s', strtotime('-12 months', strtotime($now)));
foreach ($user_ids as $user_id) {
$orders = wc_get_orders([
'customer' => $user_id,
'limit' => -1,
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids',
]);
$has_recent_order = false;
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order->get_date_created() && $order->get_date_created()->date('Y-m-d H:i:s') >= $date_limit) {
$has_recent_order = true;
break;
}
}
if (!$has_recent_order) {
// Удаляем заказы пользователя
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
// Удаляем пользователя
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}
// Запускаем функцию по крону или вручную
// wc_delete_inactive_customers();Важно: запускать эту функцию лучше в фоне (через WP-Cron или внешний cron), чтобы избежать таймаутов.
3. Настройка задания WP-Cron
Добавьте расписание для регулярного запуска:
add_action('wc_delete_inactive_customers_event', 'wc_delete_inactive_customers');
if (!wp_next_scheduled('wc_delete_inactive_customers_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_event');
}Проверка результата после внедрения
- Проверьте в админке WooCommerce список пользователей — неактивные должны удалиться;
- Проверьте базу заказов — заказы этих пользователей тоже должны исчезнуть;
- Для теста можете временно изменить период на 1 месяц и проверить на тестовом сайте;
- Логи ошибок PHP должны быть пусты, функция не должна вызывать замедлений.
Частые ошибки и их исправление
- Удаление не тех пользователей: убедитесь, что критерии отбора корректны, особенно по дате последнего заказа.
- Таймауты при удалении большого количества данных: разбивайте процесс на партии (batch processing) или используйте WP-CLI для запуска скрипта.
- Удаление пользователей с админскими правами: фильтруйте по роли
customerчтобы не затронуть админов. - Отсутствие резервного копирования: обязательно делайте бэкап базы перед массовым удалением.
Практические советы по безопасности и производительности
- Используйте транзакции SQL при удалении, если работаете напрямую с базой, чтобы избежать частичных удалений;
- Обязательно проверяйте роль пользователя перед удалением, чтобы не повредить администраторам;
- Для крупных магазинов лучше выполнять удаление партиями с помощью WP-CLI или очередей;
- Оптимизируйте базу данных после удаления:
OPTIMIZE TABLE wp_users, wp_usermeta, wp_posts, wp_postmeta; - Если нужна точечная очистка, рассмотрите использование Clearfy Pro для безопасной очистки без риска.
Сравнение вариантов реализации автоматического удаления
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код в functions.php | Гибкость, без сторонних плагинов | Риск ошибок, требует тестирования | Использовать на малых и средних сайтах |
| WP-CLI скрипт | Быстро, подходит для больших баз | Требует доступа к серверу | Для опытных админов и разработчиков |
| Плагин Clearfy Pro | Безопасность, готовые инструменты | Платный, менее гибкий | Для тех, кто хочет готовое решение с поддержкой |