Диагностика проблемы: зачем удалять неактивных пользователей
В крупных WordPress-сайтах и интернет-магазинах на WooCommerce со временем накапливаются пользователи, которые давно не посещали сайт, не совершали действий и неактивны. Это может негативно влиять на производительность базы данных, увеличивает размер бэкапов и создает риски безопасности. Чтобы поддерживать чистоту и оптимизацию, полезно удалять таких пользователей по расписанию.
Как определить неактивных пользователей в WordPress
В WordPress есть поле last_login в метаданных пользователей по умолчанию отсутствует, поэтому для отслеживания последнего входа нужно самостоятельно сохранять дату последнего логина. Если этого не сделать, нельзя объективно определить неактивных пользователей.
Добавляем запись даты последнего входа пользователя
В functions.php вашей темы или в отдельном плагине добавьте следующий код для сохранения времени последнего логина:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);Этот хук срабатывает при успешном входе пользователя и записывает текущую дату и время в метаданные last_login.
Настройка WP-Cron для автоматического удаления неактивных пользователей
После того, как у пользователей есть метка last_login, можно настроить задачу WP-Cron, которая будет регулярно запускать функцию удаления пользователей, не заходивших больше определённого времени (например, 180 дней).
Добавляем событие WP-Cron
if (!wp_next_scheduled('delete_inactive_users_daily')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_users_daily');
}
add_action('delete_inactive_users_daily', 'delete_inactive_users_callback');Функция удаления неактивных пользователей
function delete_inactive_users_callback() {
$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);
$users_to_delete = $user_query->get_results();
foreach ($users_to_delete as $user_id) {
wp_delete_user($user_id);
}
}Обратите внимание, что для безопасности лучше не удалять администраторов и пользователей с определёнными ролями. Для этого добавьте проверку ролей внутри цикла.
Проверка результата после внедрения
- В базе данных в таблице
wp_usermetaпоявится мета ключlast_loginу пользователей после их логина. - Через 1-2 дня после активации WP-Cron проверьте, что неактивные пользователи, которые не заходили более 180 дней, удалены.
- Для отладки можно временно добавить логирование в функцию удаления, например, записывать удалённые ID в файл.
Частые ошибки и как их исправить
- Отсутствие записи last_login: Если в базе нет данных о времени последнего входа, функция не сможет корректно работать. Проверьте, что хук
wp_loginкорректно добавлен и активен. - Удаление администраторов: Без фильтрации ролей можно случайно удалить пользователей с правами администратора. Добавьте проверку:
if (in_array('administrator', $user->roles)) {
continue;
}- WP-Cron не срабатывает: По умолчанию WP-Cron запускается при посещении сайта. Для надёжной работы на больших проектах лучше настроить системный cron или использовать внешние сервисы для вызова WP-Cron.
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервные копии базы данных.
- Удаляйте пользователей пакетами (в примере 100 за раз), чтобы не перегрузить сервер.
- Учитывайте роли и права пользователей, чтобы не потерять важных аккаунтов.
- Для повышения точности используйте плагин WP Activity Log или аналитику посещений, чтобы дополнительно фильтровать неактивных.
- Отключите WP-Cron и настройте системный cron на выполнение
wp-cron.phpкаждые 15 минут для стабильности.
Сравнение вариантов реализации удаления неактивных пользователей
| Метод | Плюсы | Минусы | Компромиссы |
|---|---|---|---|
| WP-Cron + собственный код | Гибкость, контроль, без сторонних плагинов | Требует настройки, знания PHP | Пакетная обработка для нагрузки |
| Плагины (например, Inactive User Deleter) | Простота, готовые решения | Могут быть избыточны, нагрузка, безопасность | Меньше контроля, зависит от обновлений |
| Ручное удаление через SQL-запросы | Быстро, без лишних нагрузок | Опасно, риск потери данных | Использовать только с резервным копированием |