Диагностика проблемы: зачем удалять неактивных пользователей
В крупных WordPress-сайтах, особенно с регистрацией и пользовательскими ролями, со временем накапливаются неактивные аккаунты. Они могут негативно влиять на безопасность, нагрузку на базу данных и управляемость сайта. Если автоматизировать удаление неактивных пользователей, можно поддерживать чистоту базы и ускорить работу админки.
Под неактивными пользователями обычно понимают тех, кто не заходил на сайт (не авторизовывался) в течение определённого периода, например, 6 месяцев или год.
Как определить неактивных пользователей в WordPress
WordPress по умолчанию не хранит дату последнего входа пользователя, поэтому сначала нужно добавить такую функциональность.
Добавление записи времени последнего входа
Добавим хук на action wp_login, чтобы при каждом входе пользователя сохранять метку времени в пользовательские метаданные:
function update_last_login( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'timestamp' ) );
}
add_action( 'wp_login', 'update_last_login', 10, 2 );Теперь у каждого пользователя в базе появится метаполе last_login с UNIX-таймстампом последнего входа.
Пошаговое решение: скрипт удаления неактивных пользователей
Создадим PHP-скрипт, который можно запускать вручную или через WP-Cron для удаления пользователей, не заходивших более 6 месяцев.
function delete_inactive_users( $months = 6 ) {
$cutoff = strtotime( '-' . intval( $months ) . ' months' );
$args = array(
'meta_key' => 'last_login',
'meta_value' => $cutoff,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 1000, // лимит по числу пользователей
);
$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 );
}
return count( $users_to_delete );
}
return 0;
}Вызов delete_inactive_users(6); удалит всех, кто не заходил более 6 месяцев.
Как запускать скрипт автоматически через WP-Cron
Для автоматизации можно добавить задачу в WP-Cron, которая будет запускать функцию ежемесячно:
function schedule_inactive_user_cleanup() {
if ( ! wp_next_scheduled( 'inactive_user_cleanup_hook' ) ) {
wp_schedule_event( time(), 'monthly', 'inactive_user_cleanup_hook' );
}
}
add_action( 'wp', 'schedule_inactive_user_cleanup' );
add_action( 'inactive_user_cleanup_hook', function() {
delete_inactive_users( 6 );
} );Проверка результата после внедрения
- В базе данных в таблице
wp_usermetaпоявятся метаполяlast_loginу пользователей, которые входили на сайт. - Выполните вручную функцию
delete_inactive_users(6)и проверьте, что пользователи с датой последнего входа старше 6 месяцев удалены. - Посмотрите лог ошибок или добавьте в функцию логирование, чтобы убедиться, что удаление прошло успешно.
Частые ошибки и как их исправить
- Нет записи last_login для некоторых пользователей — они никогда не входили, или поле не обновилось. В этом случае их можно считать неактивными и удалить отдельно, например, с помощью дополнительного условия.
- Удаляются администраторы или важные роли — добавьте фильтр исключения определённых ролей из удаления:
$args['role__not_in'] = array('administrator', 'editor');- Функция wp_delete_user() не работает из-за недостатка прав — убедитесь, что скрипт запускается с достаточными правами, например, через WP-Cron или из админки.
Практические советы по безопасности и производительности
- Обязательно создавайте резервные копии базы перед массовым удалением пользователей.
- Не пытайтесь удалять большое число пользователей за один запуск — используйте параметр
numberу WP_User_Query для пакетной обработки. - Исключайте из удаления пользователей с ролями администратора или модератора.
- Для оптимизации запросов добавьте индексы по метаполям, если трафик и база большие.
- Логируйте удаление в отдельный файл, чтобы быстро отслеживать действия.
Сравнение вариантов: плагин vs собственный код
| Критерий | Плагин | Собственный код | Компромисс |
|---|---|---|---|
| Гибкость | Ограничена настройками | Полный контроль | Код с настройками в админке |
| Риск конфликтов | Возможны | Минимальный | Тестирование на стенде |
| Зависимости | Новые зависимости | Отсутствуют | Минимальные базы кода |
| Обновления | Автоматические | Требуют поддержки | Использовать WP-CLI для запуска |