Проблема: накопление неактивных пользователей с заказами в WooCommerce
На крупных интернет-магазинах, работающих на WooCommerce, часто возникает ситуация, когда база пользователей разрастается за счёт неактивных аккаунтов. Особенно это касается клиентов, которые сделали заказ, но давно не заходили в личный кабинет и не проявляют активности. Такие пользователи занимают место в базе данных, что может замедлять работу сайта и усложнять администрирование.
Диагностика проблемы
Как определить неактивных пользователей с заказами
Для начала необходимо понять, какие пользователи считаются неактивными. Обычно под этим понимают тех, кто:
- не заходил на сайт более 6 месяцев;
- имеет хотя бы один заказ в WooCommerce;
- не делал новых заказов и не обновлял данные за указанный период.
Для диагностики можно использовать следующий запрос в базе данных, чтобы проверить активность пользователей с заказами:
SELECT u.ID, u.user_login, MAX(p.post_date) AS last_order_date
FROM wp_users u
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);Этот запрос покажет пользователей с последним заказом более 6 месяцев назад.
Пошаговое решение для автоматического удаления
1. Создание пользовательской функции удаления
Добавьте следующий код в файл functions.php вашей темы или в собственный плагин для автоматизации удаления:
function wc_delete_inactive_users_with_orders() {
global $wpdb;
// Получаем ID пользователей с последним заказом старше 6 месяцев
$user_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT u.ID
FROM {$wpdb->users} u
JOIN {$wpdb->prefix}posts p ON p.post_author = u.ID
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY u.ID
HAVING MAX(p.post_date) < %s",
date('Y-m-d H:i:s', strtotime('-6 months'))
));
if ( empty($user_ids) ) {
return; // Нет пользователей для удаления
}
foreach ( $user_ids as $user_id ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
}2. Запуск функции по расписанию через WP-Cron
Чтобы автоматизировать удаление, зарегистрируйте событие WP-Cron, которое будет запускать функцию раз в месяц:
if ( ! wp_next_scheduled( 'wc_delete_inactive_users_cron' ) ) {
wp_schedule_event( time(), 'monthly', 'wc_delete_inactive_users_cron' );
}
add_action( 'wc_delete_inactive_users_cron', 'wc_delete_inactive_users_with_orders' );3. Опционально: уведомление администратора
Полезно получать уведомления о количестве удалённых пользователей. Измените функцию так:
function wc_delete_inactive_users_with_orders() {
global $wpdb;
$user_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT u.ID
FROM {$wpdb->users} u
JOIN {$wpdb->prefix}posts p ON p.post_author = u.ID
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY u.ID
HAVING MAX(p.post_date) < %s",
date('Y-m-d H:i:s', strtotime('-6 months'))
));
if ( empty($user_ids) ) {
return;
}
foreach ( $user_ids as $user_id ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
wp_mail( get_option('admin_email'), 'Удаление неактивных пользователей WooCommerce', 'Удалено пользователей: ' . count($user_ids) );
}Проверка результата после внедрения
- Запустите функцию вручную из консоли WP-CLI или временно вызвав её в коде, чтобы убедиться, что удаление происходит без ошибок.
- Проверьте таблицу пользователей в админке WordPress, количество пользователей должно уменьшаться.
- Проверьте почту администратора на наличие уведомлений об удалении.
- Убедитесь, что связанные заказы и данные пользователя корректно удалены (если требуется, настройте удаление заказов отдельно).
Частые ошибки и как их исправить
- Ошибка: Пользователи с активными заказами удаляются.
Причина: В запросе не учтены статусы заказов (например, ожидающие оплаты).
Решение: Убедитесь, что в запросе фильтруются только завершённые или обработанные заказы (wc-completed, wc-processing). - Ошибка: Ошибка безопасности при удалении пользователей.
Причина: Отсутствует подключение файлаwp-admin/includes/user.php.
Решение: Вызовrequire_once ABSPATH . 'wp-admin/includes/user.php';обязателен передwp_delete_user(). - Ошибка: Запуск WP-Cron не происходит.
Причина: WP-Cron запускается при посещении сайта, а трафика мало.
Решение: Настройте системный cron для вызоваwp-cron.phpили используйте внешние сервисы.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Добавьте проверку прав текущего пользователя, если запускаете функцию вручную из админки.
- Для больших баз данных разбивайте удаление на порции (batch deletion), чтобы избежать таймаутов.
- Внимательно проверяйте, какие данные удаляются вместе с пользователем — заказы, комментарии, метаданные.
- Для дополнительного контроля логируйте удалённые ID пользователей в отдельный файл или таблицу.
Сравнение подходов удаления неактивных пользователей
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через SQL-запросы | Быстро, без загрузки WordPress | Риск удаления неправильных данных, сложно автоматизировать |
| WP_Delete_User с WP-Cron | Безопасно, учитывает зависимости, автоматизация | Может требовать оптимизации для больших баз |
| Плагины очистки базы | Простота использования, GUI, дополнительные функции | Может не учитывать бизнес-логику, нагрузка на сайт |