Диагностика проблемы: зачем удалять неактивных пользователей WooCommerce
В интернет-магазинах на WooCommerce база клиентов со временем растёт, но часть пользователей перестаёт заходить на сайт и становится неактивной. Такие аккаунты создают дополнительную нагрузку на базу данных, замедляют работу сайта и усложняют аналитику. Регулярное удаление неактивных пользователей по дате последнего входа помогает поддерживать базу в актуальном состоянии и улучшать производительность.
Как проверить, есть ли неактивные пользователи и как определить их количество
Для начала нужно узнать, сколько пользователей не заходило на сайт длительное время. В WooCommerce и WordPress дату последнего входа можно хранить в метаполях пользователей, если вы заранее реализовали такую функциональность, либо добавить её сейчас.
Если вы не отслеживали дату последнего входа, можно временно подключить плагин WP Last Login — он сохраняет время последнего входа в метаполе last_login. После установки и активации плагина подождите несколько дней для сбора данных.
Чтобы определить количество неактивных пользователей с последним входом более 180 дней назад, выполните SQL-запрос через phpMyAdmin или аналог:
SELECT COUNT(*) FROM wp_usermeta um
JOIN wp_users u ON um.user_id = u.ID
WHERE um.meta_key = 'last_login'
AND um.meta_value < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));Пошаговое решение: автоматическое удаление неактивных пользователей по дате входа
1. Добавляем функцию для удаления неактивных пользователей
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин. Он будет искать пользователей, у которых последний вход старше заданного количества дней, и удалять их:
function wpmoney_delete_inactive_users($days = 180) {
global $wpdb;
$threshold = time() - ($days * 24 * 60 * 60);
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %d",
$threshold
));
if (empty($user_ids)) {
return 0; // Нет пользователей для удаления
}
foreach ($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
return count($user_ids);
}2. Автоматизация через WP-Cron
Добавим планировщик задач, который будет запускать удаление раз в неделю:
function wpmoney_schedule_delete_inactive_users() {
if (!wp_next_scheduled('wpmoney_weekly_delete_inactive_users')) {
wp_schedule_event(time(), 'weekly', 'wpmoney_weekly_delete_inactive_users');
}
}
add_action('wp', 'wpmoney_schedule_delete_inactive_users');
add_action('wpmoney_weekly_delete_inactive_users', function() {
$deleted_count = wpmoney_delete_inactive_users(180); // 180 дней
if ($deleted_count) {
error_log("Удалено {$deleted_count} неактивных пользователей WooCommerce.");
}
});Проверка результата после внедрения
1. Проверьте лог ошибок PHP (error_log) на наличие сообщений об удалении пользователей.
2. Выполните SQL-запрос, показанный в блоке диагностики, чтобы убедиться, что количество пользователей с устаревшим last_login уменьшилось.
3. В админке WordPress в разделе «Пользователи» проверьте, что неактивные пользователи исчезли.
4. Для теста можно изменить условие на меньший период (например, 1 день), чтобы проверить, что код работает корректно, а затем вернуть 180 дней.
Частые ошибки и как их исправить
- Отсутствует метаполе
last_login— без него скрипт не сможет определить дату последнего входа. Решение: установить плагин WP Last Login или реализовать собственное сохранение даты входа через хукwp_login. - Удаление пользователей не происходит — проверьте права пользователя, под которым запускается скрипт, и убедитесь, что нет ошибок в логе.
Проверьте, что функцияwp_delete_user()вызывается корректно, и что нет конфликтов с другими плагинами безопасности. - Удаляются не те пользователи — проверьте корректность расчёта порога времени и формат хранения даты в метаполе (Unix timestamp). Можно добавить логирование IDs пользователей для отладки.
Практические советы по безопасности и производительности
- Перед удалением пользователей обязательно создавайте резервные копии базы данных.
- Удаление пользователей массово может нагружать сервер — запускайте задачу во время низкой нагрузки.
- Если у вас много пользователей, подумайте об удалении пакетами по 50-100 за один запуск, чтобы избежать таймаутов:
foreach (array_chunk($user_ids, 50) as $batch) { foreach ($batch as $user_id) { wp_delete_user($user_id); } sleep(1); // пауза для снижения нагрузки } - Для отслеживания активности пользователей можно дополнительно логировать действия в магазине — это поможет точнее выявлять неактивных клиентов.
Сравнение подходов удаления неактивных пользователей
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Плагин WP Last Login + WP-Cron скрипт удаления | Простота установки, готовое хранение даты входа | Зависимость от плагина, возможна нагрузка при большом количестве пользователей | Для магазинов со средней базой пользователей |
| Собственная реализация логики last_login и удаления | Полный контроль, можно оптимизировать под задачи | Требуется больше времени на разработку и тестирование | Для крупных проектов с нестандартными требованиями |
| Удаление вручную через SQL | Моментальное удаление | Риск ошибок, потеря связанной информации | Экстренные случаи, администраторы с опытом |