Диагностика проблемы: зачем удалять неактивных пользователей WooCommerce
В интернет-магазинах на WooCommerce база пользователей часто разрастается за счёт неактивных аккаунтов — зарегистрированных, но не совершавших вход или покупки длительное время. Это создаёт нагрузку на базу данных, замедляет бэкапы и анализ, а также может влиять на безопасность. Удаление таких пользователей улучшит производительность и безопасность сайта.
Как определить неактивных пользователей
Основной критерий — дата последнего входа пользователя. WooCommerce и WordPress по умолчанию не сохраняют дату последнего входа, поэтому её нужно фиксировать самостоятельно.
Пошаговое решение: реализация автоматического удаления
1. Сохранение даты последнего входа пользователя
Добавим код в functions.php темы или в кастомный плагин, чтобы при каждом логине записывать метаданные с датой последнего входа:
function wpmoney_update_last_login($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'wpmoney_update_last_login', 10, 2);2. Скрипт для удаления неактивных пользователей
Создадим функцию, которая ищет пользователей, не заходивших более 180 дней (6 месяцев), и удаляет их. Для запуска можно использовать WP-Cron или запускать вручную.
function wpmoney_delete_inactive_users() {
$threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100,
];
$user_query = new WP_User_Query($args);
$user_ids = $user_query->get_results();
if (!empty($user_ids)) {
foreach ($user_ids as $user_id) {
wp_delete_user($user_id);
}
}
}3. Автоматизация с помощью WP-Cron
Добавим событие, чтобы запускать скрипт раз в неделю:
if (!wp_next_scheduled('wpmoney_weekly_delete_inactive_users')) {
wp_schedule_event(time(), 'weekly', 'wpmoney_weekly_delete_inactive_users');
}
add_action('wpmoney_weekly_delete_inactive_users', 'wpmoney_delete_inactive_users');Проверка результата после внедрения
Чтобы убедиться, что всё работает корректно:
- Войдите под тестовым пользователем и проверьте, что у него в метаданных
last_loginобновилась дата (через phpMyAdmin или плагин для работы с базой). - Создайте тестового пользователя с датой входа в базе более 180 дней назад.
- Вызовите функцию удаления вручную из консоли WP-CLI
wp eval 'wpmoney_delete_inactive_users();'или временно вызовите её из админки. - Проверьте, что указанные пользователи удалены из базы.
Частые ошибки и как их исправить
- Дата последнего входа не сохраняется: проверьте, что хук
wp_loginподключён, и функцияwpmoney_update_last_loginне содержит ошибок. - Удаляются не все неактивные пользователи: WP_User_Query по умолчанию возвращает максимум 100 пользователей, увеличьте параметр
numberили реализуйте пагинацию. - Удаление пользователей с важными правами: добавьте фильтр по ролям, чтобы исключить администраторов и важных пользователей из удаления.
- WP-Cron не срабатывает: проверьте, работает ли WP-Cron на хостинге или настройте системный cron для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте резервную копию базы данных.
- Добавьте логирование удалённых пользователей в отдельный файл для аудита.
- Обрабатывайте удаление порциями, чтобы избежать превышения времени выполнения скрипта.
- Исключайте пользователей с ролью
administratorиз автоматического удаления:
function wpmoney_delete_inactive_users() {
$threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100,
'role__not_in' => ['administrator'],
];
$user_query = new WP_User_Query($args);
$user_ids = $user_query->get_results();
if (!empty($user_ids)) {
foreach ($user_ids as $user_id) {
wp_delete_user($user_id);
}
}
}Сравнение вариантов удаления пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную из админки | Простота, контроль | Трудозатратно, нельзя по дате входа |
| Плагины очистки пользователей | Автоматизация, удобный интерфейс | Может не учитывать дату последнего входа, нагрузка на сайт |
| Кастомный код с WP-Cron | Точный контроль, гибкость, безопасность | Требует навыков программирования |