Диагностика проблемы: зачем удалять неактивных пользователей
В крупных WordPress-сайтах с регистрацией пользователей часто накапливаются аккаунты, которые не используются длительное время. Это увеличивает нагрузку на базу данных, усложняет администрирование и может привести к проблемам безопасности, если такие аккаунты слабо защищены. Чтобы поддерживать чистоту и безопасность сайта, полезно настроить автоматическое удаление неактивных пользователей, например, не авторизовавшихся более 6 месяцев.
Как определить неактивных пользователей в WordPress
По умолчанию WordPress не хранит дату последнего входа пользователя. Для автоматического удаления нужно добавить эту функциональность, например, с помощью хука 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-таймстампом времени входа.
Пошаговое решение: скрипт автоматического удаления
Чтобы регулярно очищать базу, создадим функцию, которая будет искать пользователей, у которых дата последнего входа старше 180 дней (6 месяцев), и удалять их.
Код для удаления неактивных пользователей
function delete_inactive_users() {
$threshold = strtotime( '-180 days' );
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<=',
'fields' => 'ID',
'number' => 100,
];
$user_query = new WP_User_Query( $args );
$users = $user_query->get_results();
if ( !empty( $users ) ) {
foreach ( $users as $user_id ) {
wp_delete_user( $user_id );
}
}
}
// Запуск функции через WP-Cron раз в неделю
if ( !wp_next_scheduled( 'weekly_delete_inactive_users' ) ) {
wp_schedule_event( time(), 'weekly', 'weekly_delete_inactive_users' );
}
add_action( 'weekly_delete_inactive_users', 'delete_inactive_users' );В этом коде:
- С помощью
WP_User_Queryвыбираем пользователей с датой последнего входа более 180 дней назад. - Удаляем их через
wp_delete_user(). - Запускаем очистку раз в неделю через WP-Cron.
Проверка результата после внедрения
Чтобы проверить работу сценария:
- Зайдите в базу данных и убедитесь, что у пользователей есть метаполе
last_login. - Добавьте тестового пользователя, установите вручную дату
last_loginв более раннее время, например черезupdate_user_metaв админке или через инструмент базы данных. - Запустите вручную функцию
delete_inactive_users()или дождитесь срабатывания WP-Cron. - Проверьте, удалился ли тестовый пользователь из базы.
Частые ошибки и как их исправить
- Нет метаполя
last_login: Если функция удаления не находит пользователей, возможно, вы не добавили запись последнего входа. Проверьте, что хукwp_loginработает. - WP-Cron не срабатывает: Если автоматическая очистка не происходит, проверьте настройки WP-Cron или настройте системный cron для вызова
wp-cron.php. Можно отключить WP-Cron и настроить системный cron, чтобы повысить надежность. - Удаляются администраторы или важные пользователи: Добавьте в запрос исключение ролей, например, исключите администраторов из удаления.
Практические советы по безопасности и производительности
- Добавляйте в запрос исключения для пользователей с повышенными правами (администраторы, редакторы), чтобы случайно не удалить важных участников.
- Не запускайте удаление сразу для всех пользователей, ограничивайте пакет по 50-100 пользователей за раз, чтобы избежать перегрузки сервера.
- Храните дату последнего входа в формате UNIX-таймстампа для удобства сравнения и запросов.
- Для надежности работы автоматизации рассмотрите использование системного cron вместо WP-Cron, особенно на больших проектах.
Таблица сравнения вариантов удаления неактивных пользователей
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron с собственным кодом | Гибкость, бесплатно, точный контроль | Зависит от посещаемости сайта, возможны сбои |
| Системный cron с WP-CLI | Надежность, не зависит от посетителей | Требует доступа к серверу, сложнее в настройке |
| Плагины автоматизации | Простота настройки | Может нагружать сайт, меньше контроля |