Диагностика проблемы: зачем удалять неактивных пользователей
В крупных проектах на WordPress количество зарегистрированных пользователей может быстро расти. Многие из них перестают заходить на сайт, что создает нагрузку на базу данных и снижает безопасность. Неактивные аккаунты повышают риски взлома, а также затрудняют управление пользователями.
Чтобы выявить неактивных пользователей, нужно определить критерии неактивности. Обычно это отсутствие входа в аккаунт более 3–6 месяцев или отсутствие активности (комментариев, заказов, действий).
Как проверить, что пользователи неактивны
WordPress по умолчанию не хранит дату последнего входа пользователя. Чтобы получить эти данные, можно использовать метаполе last_login и обновлять его при каждом входе с помощью хука wp_login. Например:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);После этого в базе появятся даты последних входов, по которым можно фильтровать неактивных.
Пошаговое решение: скрипт автоматического удаления неактивных пользователей
1. Добавляем фикс для регистрации даты последнего входа
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);2. Создаем функцию для удаления пользователей, не заходивших более N дней
function delete_inactive_users($days = 180) {
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'meta_key' => 'last_login',
'meta_compare' => '<',
'meta_value' => $date_threshold,
'fields' => 'ID',
'number' => -1,
];
$user_query = new WP_User_Query($args);
$inactive_users = $user_query->get_results();
foreach($inactive_users as $user_id) {
wp_delete_user($user_id);
}
return count($inactive_users);
}3. Запускаем удаление по расписанию с помощью WP-Cron
if (!wp_next_scheduled('delete_inactive_users_daily')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_users_daily');
}
add_action('delete_inactive_users_daily', function() {
$deleted_count = delete_inactive_users(180); // 180 дней
error_log("Удалено неактивных пользователей: " . $deleted_count);
});Проверка результата
- Проверьте наличие мета-поля
last_loginу пользователей в базе данных (таблицаwp_usermeta). - Выполните вручную вызов
delete_inactive_users(180)через админский плагин или командную строку WP-CLI и проверьте список удаленных пользователей. - Проверьте логи ошибок PHP или файл debug.log на наличие записей о количестве удаленных пользователей.
- Убедитесь, что пользователи с датой последнего входа старше 180 дней пропали из списка пользователей.
Частые ошибки и их причины
- Отсутствие метаполя
last_login: если не подключен хукwp_login, даты не будут сохраняться и фильтрация не сработает. - Удаление администраторов: скрипт удаляет всех пользователей по условию, нужно добавить исключения для ролей с правами администратора.
- Неправильный формат даты: убедитесь, что даты в метаполе и в сравнении WP_User_Query совпадают по формату.
- Конфликты с кешированием: если сайт использует кеш, удаление может не сразу отображаться в админке пользователей.
Практические советы по безопасности и производительности
- Добавьте проверку ролей, чтобы не удалять аккаунты с особыми правами. Например:
foreach($inactive_users as $user_id) {
$user = get_userdata($user_id);
if (in_array('administrator', $user->roles)) continue;
wp_delete_user($user_id);
}- Используйте WP-CLI для запуска скрипта в больших базах, чтобы избежать таймаутов.
- Резервное копирование базы перед массовыми удалениями обязательно.
- Если число неактивных пользователей большое, разбейте удаление на несколько вызовов с лимитом.
- Для повышения производительности храните дату последнего входа в формате UNIX timestamp.
Сравнение вариантов удаления неактивных пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простой, не требует кода | Непрактично при большом объеме; риск ошибки | Использовать для выборочного удаления |
| Скрипт с WP_User_Query и wp_delete_user | Автоматизация; гибкость фильтров | Требует настройки; возможны ошибки без проверки ролей | Добавить исключения и лимиты |
| Плагины для управления пользователями | Интерфейс, готовые функции | Могут быть избыточны; нагрузка сайта | Использовать при отсутствии навыков программирования |