Диагностика проблемы: зачем удалять неактивных пользователей
В крупных WordPress-проектах с регистрацией пользователей количество аккаунтов быстро растет. Многие пользователи регистрируются, но неактивны — не заходят, не совершают действий. Это создает нагрузку на базу данных, увеличивает риски безопасности и затрудняет управление пользователями. Автоматизация удаления таких аккаунтов по срокам бездействия помогает поддерживать чистоту базы и повышать производительность сайта.
Как определить, кто считается неактивным пользователем?
Ключевой критерий — дата последнего входа пользователя. По умолчанию WordPress не хранит дату логина, поэтому сначала нужно добавить этот функционал.
Добавляем запись даты последнего входа
В functions.php темы или в плагине добавьте следующий код:
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.
Пошаговое решение: создание автоматического удаления неактивных пользователей
1. Создаем функцию удаления
function wpcommunity_delete_inactive_users() {
$threshold = strtotime( '-6 months' ); // Удалять пользователей, не заходивших 6 месяцев
$args = [
'meta_key' => 'last_login',
'meta_value' => date('Y-m-d H:i:s', $threshold),
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100, // Обрабатываем по 100 пользователей за раз
];
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
foreach ( $user_query->results as $user_id ) {
// Не удаляем администраторов
if ( in_array('administrator', get_userdata($user_id)->roles) ) {
continue;
}
wp_delete_user( $user_id );
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавим событие, которое будет запускать функцию еженедельно.
function wpcommunity_schedule_user_cleanup() {
if ( ! wp_next_scheduled( 'wpcommunity_weekly_user_cleanup' ) ) {
wp_schedule_event( time(), 'weekly', 'wpcommunity_weekly_user_cleanup' );
}
}
add_action( 'wp', 'wpcommunity_schedule_user_cleanup' );
add_action( 'wpcommunity_weekly_user_cleanup', 'wpcommunity_delete_inactive_users' );Проверка результата после внедрения
1. Проверьте, что у пользователей появляется метаполе last_login после входа.
2. Запустите функцию удаления вручную для теста, вызвав wpcommunity_delete_inactive_users() через WP-CLI или временно из админки.
3. Убедитесь, что пользователи, которые не заходили больше 6 месяцев, удаляются, а администраторы остаются.
4. Проверьте логи ошибок сервера и базы данных на предмет сбоев.
Частые ошибки и как их исправить
- Дата последнего входа не сохраняется. Проверьте, что хук
wp_loginподключен и код добавлен в правильное место. Для теста выполните вход и проверьте метаполя пользователя через phpMyAdmin или WP-CLI. - Удаляются администраторы. Добавьте проверку ролей перед удалением, как в приведенном коде. Если роли хранятся нестандартно — исправьте проверку.
- Запланированное событие WP-Cron не срабатывает. Проверьте, что на сайте посещения есть (WP-Cron зависит от трафика) или настройте системный crontab для вызова wp-cron.php.
- Удаление занимает много времени и вызывает таймауты. Уменьшите параметр
numberв WP_User_Query для обработки меньших партий пользователей.
Практические советы по безопасности и производительности
- Перед массовым удалением пользователей сделайте резервную копию базы данных.
- Не удаляйте пользователей без явной причины — можно добавить уведомление о предстоящем удалении с возможностью сохранить аккаунт.
- Для больших сайтов лучше запускать задачу удаления через системный cron, а не WP-Cron, чтобы избежать сбоев.
- Используйте транзакции и логирование удалений, чтобы иметь возможность откатить ошибочные удаления.
Сравнение способов реализации автоматического удаления пользователей
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + usermeta (как в статье) | Простота, интеграция с WordPress, без доп. плагинов | Зависимость от трафика, возможны таймауты при большом количестве пользователей |
| Внешний системный cron + WP-CLI | Надежность, можно запускать в любое время, подходит для больших сайтов | Требует доступа к серверу, знания CLI |
| Плагин для управления пользователями | Удобный интерфейс, расширенные возможности | Дополнительная нагрузка, возможные конфликты с другими плагинами |