Диагностика проблемы: зачем удалять неактивных пользователей
В крупных и средних проектах на WordPress с регистрацией пользователей со временем накапливается множество аккаунтов, которые не используются — например, зарегистрировавшиеся, но неактивные пользователи или боты. Это увеличивает нагрузку на базу данных, замедляет административную панель и негативно влияет на безопасность ресурса.
Проверка актуальности пользователей — важная задача для оптимизации и поддержания порядка. Но как автоматизировать удаление таких аккаунтов, не рискуя потерять важных участников?
Определяем неактивных пользователей
В WordPress не хранится дата последнего входа по умолчанию. Для этой цели обычно добавляют сохранение последней активности через хук wp_login. На основе этой даты можно определять, кто не заходил на сайт, например, последние 6 месяцев.
Добавление записи последнего входа
function update_last_login( $login, $user ) {
update_user_meta( $user->ID, '_last_login', current_time( 'timestamp' ) );
}
add_action( 'wp_login', 'update_last_login', 10, 2 );Этот код записывает временную метку последнего входа в метаданные пользователя под ключом _last_login.
Пошаговое решение: автоматическое удаление неактивных пользователей
1. Создаем функцию для выборки и удаления
function delete_inactive_users() {
$days_inactive = 180; // 6 месяцев
$cutoff = strtotime( "-{$days_inactive} days" );
$args = array(
'meta_key' => '_last_login',
'meta_value' => $cutoff,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100, // лимит на партию
'exclude' => array(1), // исключаем admin с ID 1
);
$user_query = new WP_User_Query( $args );
$users_to_delete = $user_query->get_results();
if ( empty( $users_to_delete ) ) {
return;
}
foreach ( $users_to_delete as $user_id ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
}2. Настраиваем запуск функции через WP-Cron
function schedule_inactive_users_deletion() {
if ( ! wp_next_scheduled( 'delete_inactive_users_event' ) ) {
wp_schedule_event( time(), 'daily', 'delete_inactive_users_event' );
}
}
add_action( 'wp', 'schedule_inactive_users_deletion' );
add_action( 'delete_inactive_users_event', 'delete_inactive_users' );Этот код запускает проверку и удаление неактивных пользователей ежедневно.
Проверка результата после внедрения
- В админке WordPress перейдите в Пользователи и отфильтруйте по дате последнего входа, используя метаполе
_last_login(для этого можно временно вывести данные через плагин типа Admin Columns). - Проверьте логи сервера или добавьте логирование в функцию удаления, например, с помощью
error_log()для подтверждения удаления пользователей. - Проверьте, что пользователи с датой входа старше 180 дней удаляются, а активные остаются.
Частые ошибки и как их исправить
- Отсутствие записи последнего входа. Если функция
update_last_loginне была добавлена ранее, у многих пользователей не будет метаполя_last_login, и они не попадут в выборку. Решение: добавить код для обновления этого поля и подождать, пока пользователи войдут. - Удаление администраторов или важных пользователей. Обязательно исключайте из выборки админов и ключевых ролей (
excludeв запросе). Можно дополнительно проверять роль перед удалением. - Проблемы с производительностью при большом количестве пользователей. Используйте параметр
numberдля поэтапного удаления и планируйте запуск с WP-Cron с интервалом не реже суток. - Крон не запускается. WP-Cron зависит от посещаемости сайта. Для надежности настройте системный cron на сервере или используйте плагины, запускающие WP-Cron вручную.
Практические советы по безопасности и производительности
- Для безопасности добавьте резервное копирование пользователей перед удалением, например, экспорт их данных через WP-CLI или плагин.
- Перед удалением можно отправлять уведомления пользователям о предстоящем удалении с просьбой войти на сайт.
- Для ускорения выборки добавьте индекс на метаполе
_last_loginв таблицеwp_usermetaчерез SQL, если база большая. - Проверяйте, что удаление пользователей не влияет на связанные данные (посты, комментарии). По умолчанию посты останутся, но можно изменить поведение в
wp_delete_user.
Сравнение подходов к удалению неактивных пользователей
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоемко, риск ошибки |
| Плагины (например, Inactive User Deleter) | Готовое решение, настройки | Дополнительная нагрузка, возможные конфликты |
| Код с WP-Cron (описанный выше) | Автоматизация, кастомизация | Требует настройки, зависит от WP-Cron |