Диагностика проблемы: зачем удалять неактивных пользователей
С течением времени на сайте WordPress накапливаются пользователи, которые давно не заходили в систему. Это может негативно влиять на безопасность (заброшенные аккаунты часто становятся мишенью для атак), производительность (большое количество пользователей замедляет выборки) и затруднять управление пользователями. Автоматическое удаление неактивных пользователей по дате последнего входа решает эти задачи.
Как определить неактивных пользователей в WordPress
По умолчанию WordPress не хранит дату последнего входа пользователя. Для решения нужно добавить мета-данные с датой последнего входа при каждой авторизации.
Добавляем запись даты входа пользователя
add_action('wp_login', 'record_last_login', 10, 2);
function record_last_login($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}Этот код сохраняет дату и время последнего входа в формате MySQL в мета-поле last_login.
Как автоматически удалять пользователей, не входивших более 6 месяцев
Далее нужно запланировать задачу с помощью WP-Cron, которая будет запускать удаление.
Добавление еженедельного события для очистки
if (!wp_next_scheduled('delete_inactive_users_weekly')) {
wp_schedule_event(time(), 'weekly', 'delete_inactive_users_weekly');
}
add_action('delete_inactive_users_weekly', 'delete_inactive_users_by_last_login');
function delete_inactive_users_by_last_login() {
global $wpdb;
$threshold = date('Y-m-d H:i:s', strtotime('-6 months'));
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %s",
$threshold
));
foreach ($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
}Этот код выберет всех пользователей, чей последний вход был более 6 месяцев назад, и удалит их через wp_delete_user, корректно очищая данные WordPress.
Проверка результата после внедрения
- Войдите под разными пользователями и убедитесь, что мета-поле
last_loginпоявляется с актуальной датой в базе (таблицаwp_usermeta). - Запустите функцию удаления вручную (временно вызовите
delete_inactive_users_by_last_login()через admin-ajax или напрямую в functions.php) и проверьте, что пользователи с датой входа старше 6 месяцев удаляются. - Проверьте логи сервера и наличие ошибок при запуске WP-Cron (плагин WP Crontrol поможет отследить зарезервированные задачи).
Частые ошибки и как их исправить
- Дата последнего входа не сохраняется — проверьте, что хук
wp_loginподключен правильно и функция не вызывает ошибок. - Пользователи не удаляются — проверьте расписание WP-Cron и права пользователя, под которым запускается скрипт.
- Удаление удаляет администраторов — добавьте дополнительную проверку роли, чтобы исключить важные аккаунты из удаления.
- Ошибка в SQL-запросе — используйте
$wpdb->prepareдля безопасности и правильной подстановки параметров.
Практические советы по безопасности и производительности
- Всегда исключайте пользователей с ролями администратора и редактора из автоматического удаления.
- Добавьте логирование удалений в файл, чтобы отслеживать, какие пользователи были удалены.
- Используйте плагин WP Crontrol для контроля и отладки WP-Cron задач.
- Для сайтов с большим количеством пользователей лучше выполнять удаление партиями (например, по 50 пользователей за раз), чтобы не перегружать сервер.
Пример кода с исключением администраторов и логированием
function delete_inactive_users_by_last_login() {
global $wpdb;
$threshold = date('Y-m-d H:i:s', strtotime('-6 months'));
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %s",
$threshold
));
foreach ($user_ids as $user_id) {
$user = get_userdata($user_id);
if (in_array('administrator', $user->roles)) {
continue; // не удаляем админов
}
$deleted = wp_delete_user($user_id);
if ($deleted) {
error_log("User ID {$user_id} ({$user->user_login}) deleted due to inactivity.");
}
}
}Сравнение способов реализации автоматического удаления
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + собственный код | Гибкость, контроль, бесплатно | Зависит от посещаемости сайта, требует тестирования |
| Плагины (например, Inactive User Deleter) | Простота настройки, готовые функции | Меньше контроля, может конфликтовать с другими плагинами |
| Внешний cron + wp-cli | Точность и надежность, не зависит от посещаемости | Требует доступа к серверу и знаний по настройке |