Диагностика проблемы: почему важно удалять неактивных пользователей
В крупных WordPress-сайтах с пользовательской регистрацией часто накапливается много неактивных аккаунтов. Они занимают место в базе данных, могут увеличивать нагрузку на сервер, создавать риски безопасности (например, если скомпрометированы пароли), а также усложнять управление пользователями. Особенно это актуально для сайтов с ограниченным хостингом и WooCommerce-магазинов, где пользователи могут регистрироваться, но не совершать покупок долгое время.
Как определить неактивных пользователей
Под «неактивными» чаще всего понимают пользователей, которые не заходили на сайт определённое время (например, 6 месяцев или год). В WordPress дата последнего входа не сохраняется по умолчанию, поэтому нужно добавить отслеживание этой информации.
Добавление хранения даты последнего входа пользователя
В functions.php темы добавьте следующий код, который при каждом входе обновляет мета-поле last_login:
function update_last_login( $login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'update_last_login', 10, 2 );Этот код записывает дату и время последнего входа пользователя в формате MySQL в пользовательские метаданные.
Пошаговое решение: скрипт автоматического удаления неактивных пользователей
Далее создадим функцию, которая автоматически удаляет пользователей, не заходивших на сайт более 180 дней (6 месяцев). Для безопасности исключим администраторов.
function delete_inactive_users() {
$days_inactive = 180;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
$args = array(
'meta_key' => 'last_login',
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => 'ID',
'exclude' => array(1), // исключаем пользователя с ID 1 (обычно админ)
'role__not_in' => array('administrator'), // исключаем админов
'number' => 100 // лимит за раз
);
$user_query = new WP_User_Query( $args );
$users_to_delete = $user_query->get_results();
if ( ! empty( $users_to_delete ) ) {
foreach ( $users_to_delete as $user_id ) {
require_once( ABSPATH . 'wp-admin/includes/user.php' );
wp_delete_user( $user_id );
}
}
}
// Запускаем функцию раз в сутки через 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' );Этот код запускает задачу в WP-Cron, которая ежедневно удаляет пользователей, не заходивших 180+ дней. Можно изменить период в переменной $days_inactive.
Проверка результата после внедрения
- В базе данных в таблице
wp_usermetaпроверьте наличие мета-поляlast_loginу пользователей. - Создайте тестового пользователя, войдите под ним, убедитесь, что
last_loginобновляется. - Измените дату
last_loginтестового пользователя в базе на дату старше 180 дней и запустите функциюdelete_inactive_usersвручную (через вызов в админке или WP-CLI). - Проверьте, удалён ли пользователь из базы.
- Для мониторинга можно добавить запись в лог внутри функции удаления.
Частые ошибки и как их исправить
- Дата последнего входа не обновляется: Проверьте, подключён ли хук
wp_loginи нет ли конфликтов с плагинами, которые изменяют процесс авторизации. - Удаляются администраторы: Обязательно исключайте админов из запроса. Используйте параметр
'role__not_in' => ['administrator']и исключайте ID админов. - Функция не запускается по расписанию: Убедитесь, что WP-Cron работает, и ваш сайт посещается. Для теста используйте плагин WP Crontrol или вызовите функцию вручную.
- Удалённые пользователи остаются в базе: Проверьте, используется ли
wp_delete_user(), и нет ли ошибок в логах PHP.
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением пользователей обязательно настройте регулярное резервное копирование базы, чтобы можно было восстановить данные при ошибках.
- Исключение важных ролей: Помимо администраторов, исключайте пользователей с особыми ролями или VIP-статусом.
- Пошаговая очистка: Не удаляйте сразу слишком много пользователей, чтобы избежать нагрузки на сервер и ошибок. В коде ограничен лимит 100 пользователей за один проход.
- Логирование: Добавьте логирование в файл или в системный журнал для аудита удалений.
- Оптимизация запросов: Используйте кэширование и избегайте сложных запросов к базе, если пользователей очень много.
Таблица сравнения вариантов автоматического удаления пользователей
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код на functions.php + WP-Cron | Полный контроль, бесплатно, гибко | Требует навыков, возможны ошибки | Лучше для разработчиков и кастомных задач |
| Плагины (например, Inactive User Deleter) | Простота настройки, готовый интерфейс | Могут быть лишние функции, нагрузка | Подходит для быстрых решений без кода |
| Удаление вручную через базу | Полный контроль, быстро | Риск ошибок, нет автоматизации | Использовать как экстренный вариант |