Диагностика проблемы неактивных пользователей
В крупных и средних сайтах на WordPress со временем накапливается множество зарегистрированных пользователей, которые давно не заходили на сайт и не взаимодействуют с контентом. Это приводит к увеличению базы данных, замедлению работы сайта и потенциальным рискам безопасности, если учесть, что старые аккаунты могут быть взломаны. Чтобы решить эту проблему, нужно автоматически определять и удалять таких пользователей.
Пошаговое решение для автоматического удаления неактивных пользователей
1. Определение критерия неактивности
Обычно за неактивных пользователей принимают тех, кто не заходил на сайт более 6 месяцев. Для этого будем использовать дату последнего входа пользователя.
2. Добавление записи последнего входа пользователя
WordPress по умолчанию не хранит дату последнего входа. Добавим эту возможность с помощью хука wp_login:
function wpcommunity_update_last_login( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'wpcommunity_update_last_login', 10, 2 );Этот код обновит мета-поле last_login при каждом входе пользователя.
3. Создание WP-Cron задачи для удаления неактивных пользователей
Добавим функцию, которая будет искать и удалять пользователей, не заходивших более 180 дней:
function wpcommunity_delete_inactive_users() {
$threshold = date( 'Y-m-d H:i:s', strtotime( '-180 days' ) );
$args = array(
'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 ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
}
if ( ! wp_next_scheduled( 'wpcommunity_daily_inactive_user_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpcommunity_daily_inactive_user_cleanup' );
}
add_action( 'wpcommunity_daily_inactive_user_cleanup', 'wpcommunity_delete_inactive_users' );Этот код проверяет пользователей с last_login старше 180 дней и удаляет их. Задача запускается ежедневно.
4. Обработка пользователей без даты входа
Если у пользователя нет мета-поля last_login, он либо не заходил ни разу, либо поле не установлено. Чтобы не пропустить таких пользователей, расширим запрос:
$args = array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'last_login',
'value' => $threshold,
'compare' => '<',
'type' => 'DATETIME',
),
array(
'key' => 'last_login',
'compare' => 'NOT EXISTS',
),
),
'fields' => 'ID',
'number' => 100,
);Проверка результата после внедрения
Чтобы убедиться, что удаление неактивных пользователей работает:
- Зарегистрируйте тестового пользователя и не входите под ним 6+ месяцев — для проверки подойдут временные изменения даты
last_loginв базе. - Вручную запустите функцию
wpcommunity_delete_inactive_users()через WP CLI или временно вызовите в тему. - Проверьте, что пользователь удален из базы данных (таблица
wp_users). - Проверьте наличие запланированного Cron-задачи:
wp cron event listили плагины типа WP Crontrol.
Частые ошибки и как их исправить
- Отсутствие записи даты входа: если код обновления
last_loginне подключён, функция удаления не работает корректно. Проверьте, что хукwp_loginработает и мета-поле создаётся. - Удаление администраторов: функция может удалить админов, если они не заходили долго. Добавьте защиту, например, исключая роли администраторов:
$args['role__not_in'] = array('Administrator');- Проблемы с WP-Cron: если сайт малопосещаемый, Cron-задачи не запускаются вовремя. Можно настроить системный CRON для вызова
wp-cron.php. - Удаление пользователей с важными данными: перед удалением убедитесь, что данные пользователя не нужны. Можно отправлять уведомление о предстоящем удалении.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед массовым удалением пользователей.
- Ограничьте количество пользователей, удаляемых за один запуск (например, 100), чтобы не перегружать сервер.
- Добавьте логирование удалений в отдельный файл для аудита.
- Если на сайте много пользователей с разными ролями, фильтруйте только нужные роли.
Сравнение подходов для удаления неактивных пользователей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин | Использование готовых плагинов удаления неактивных пользователей | Простота установки, готовый функционал | Может быть избыточным, нагрузка, ограничения настроек |
| Собственный код (как в статье) | Самописная реализация на базе WP-Cron и хуков | Гибкость, контроль, минимальная нагрузка | Требует технических навыков, нужно тестировать |
| Удаление вручную | Ручной поиск и удаление через админку или SQL | Простота, точечность | Трудоемко, риск ошибок, неавтоматично |