Диагностика проблемы: зачем удалять неактивных пользователей
Большие сайты на WordPress с регистрацией пользователей часто сталкиваются с проблемой накопления неактивных аккаунтов. Это увеличивает размер базы данных, замедляет запросы и может создавать риск безопасности. Вопрос: как автоматически и безопасно удалять пользователей, которые не заходили на сайт, например, более 6 месяцев?
Как определить неактивных пользователей
WordPress не хранит дату последнего входа по умолчанию. Чтобы реализовать логику удаления, сначала нужно отслеживать время последнего логина.
Добавляем мета-поле с датой последнего входа
Добавим код в functions.php активной темы или в отдельный сниппет, который будет обновлять мета-поле last_login при каждом успешном входе пользователя:
function update_user_last_login( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'update_user_last_login', 10, 2 );Теперь у каждого пользователя будет храниться время последнего логина.
Пошаговое решение: автоматическое удаление
1. Создаем функцию удаления неактивных пользователей
function delete_inactive_users() {
$threshold = strtotime( '-6 months' ); // 6 месяцев назад
$args = array(
'meta_key' => 'last_login',
'meta_value' => date( 'Y-m-d H:i:s', $threshold ),
'meta_compare' => '<',
'fields' => 'ID',
'number' => -1
);
$user_query = new WP_User_Query( $args );
$users = $user_query->get_results();
if ( ! empty( $users ) ) {
foreach ( $users as $user_id ) {
require_once( ABSPATH . 'wp-admin/includes/user.php' );
wp_delete_user( $user_id );
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавим расписание, чтобы функция запускалась, например, раз в неделю:
function schedule_inactive_user_deletion() {
if ( ! wp_next_scheduled( 'delete_inactive_users_event' ) ) {
wp_schedule_event( time(), 'weekly', 'delete_inactive_users_event' );
}
}
add_action( 'wp', 'schedule_inactive_user_deletion' );
add_action( 'delete_inactive_users_event', 'delete_inactive_users' );Проверка результата после внедрения
- В базе данных в таблице
wp_usermetaпроверьте наличие метаполяlast_loginу пользователей. - Отслеживайте журнал ошибок и логи сервера, чтобы убедиться, что Cron-задача выполняется.
- Добавьте временный лог в функцию удаления, например, записывайте ID удаленных пользователей в отдельный файл или в лог WordPress:
function delete_inactive_users() {
$threshold = strtotime( '-6 months' );
$args = array(
'meta_key' => 'last_login',
'meta_value' => date( 'Y-m-d H:i:s', $threshold ),
'meta_compare' => '<',
'fields' => 'ID',
'number' => -1
);
$user_query = new WP_User_Query( $args );
$users = $user_query->get_results();
if ( ! empty( $users ) ) {
foreach ( $users as $user_id ) {
error_log( 'Deleting user ID: ' . $user_id );
require_once( ABSPATH . 'wp-admin/includes/user.php' );
wp_delete_user( $user_id );
}
}
}Частые ошибки и как исправить
- Отсутствие мета-поля last_login: Если вы не добавили отслеживание даты последнего входа, удаление не сработает. Проверьте, что хук
wp_loginподключен правильно. - Неправильный формат даты: Используйте
current_time('mysql')для записи иY-m-d H:i:sдля сравнения. - WP-Cron не срабатывает: По умолчанию WP-Cron срабатывает при посещении сайта. Для надежности настройте системный cron на вызов
wp-cron.php. - Удаление администраторов: Проверьте, что функция не удаляет пользователей с ролью администратора (можно добавить фильтр в запрос).
Практические советы по безопасности и производительности
- Добавьте фильтр по ролям, чтобы не удалять администраторов и важных пользователей:
$args['role__not_in'] = array('Administrator');- Для больших сайтов лучше удалять пользователей пакетами по 50-100 за один запуск, чтобы избежать таймаутов:
$args['number'] = 100;- Логируйте удаление пользователей для аудита и восстановления при ошибках.
- Регулярно проверяйте базу данных и оптимизируйте таблицы, чтобы избежать фрагментации после удаления.
- Если нужны дополнительные отчеты, можно расширить функцию, отправляя уведомления администратору после удаления.
- Для упрощения работы с пользователями рассмотрите Clearfy Pro с функциями оптимизации и очистки пользователей https://wpshop.ru/plugins/clearfy?source=wplessons.ru&medium=article&campaign=kak-avtomaticheski-udaljat-neaktivnyh-polzovatelej-v-wordpress-bez-plaginov
Сравнение вариантов удаления неактивных пользователей
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Собственный код + WP-Cron | Полный контроль, без плагинов | Требует навыков и поддержки | Код из статьи |
| Плагины очистки пользователей | Удобство и интерфейс | Дополнительная нагрузка, возможные конфликты | Better Delete User, WP Bulk Delete |
| Ручная очистка через админку | Простота | Трудоемко, риск пропустить | Админка WordPress |