Диагностика проблемы с неактивными пользователями
В крупных WordPress-сайтах с регистрацией пользователей рано или поздно возникает проблема накопления неактивных аккаунтов. Они занимают место в базе, ухудшают производительность, а также могут создавать риски безопасности. Если у вас есть задача регулярно очищать базу пользователей, которые не заходили на сайт длительное время (например, 6 месяцев), то ручное удаление неэффективно. Нужно автоматизировать процесс.
Как определить неактивного пользователя
WordPress по умолчанию хранит дату последнего входа не всегда. Для отслеживания активности можно использовать мета-поле пользователя last_login, которое нужно записывать при каждом входе пользователя. Если этого нет, можно ориентироваться на дату последней публикации или другого действия, но это менее надежно.
Пошаговое решение: автоматическое удаление неактивных пользователей
Ниже пример кода, который записывает в мета-поле дату последнего входа и запускает крон-задачу для удаления пользователей без входа более 180 дней.
<?php
// Шаг 1. Записываем дату последнего входа
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('timestamp'));
}, 10, 2);
// Шаг 2. Создаем крон-задачу для очистки
add_action('delete_inactive_users_daily', function() {
$threshold = strtotime('-180 days');
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'number' => -1,
'fields' => 'ID'
];
$users = get_users($args);
foreach ($users as $user_id) {
wp_delete_user($user_id);
}
});
// Шаг 3. Регистрируем событие крон
if (!wp_next_scheduled('delete_inactive_users_daily')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_users_daily');
}
// Шаг 4. Очистка при деактивации плагина или темы
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('delete_inactive_users_daily');
});
?>Проверка результата после внедрения
1. Войдите под тестовым пользователем, затем проверьте в базе данных в таблице wp_usermeta, что у него установлен мета-ключ last_login с текущим timestamp.
2. Запустите вручную крон-задачу с помощью WP-CLI или плагина для управления задачами WP-Cron. Например, через WP-CLI:
wp cron event run delete_inactive_users_daily3. Проверьте списки пользователей — аккаунты с last_login старше 180 дней должны быть удалены.
Частые ошибки и их исправление
- Нет записи даты последнего входа — крон удалит только тех, у кого установлен
last_login. Убедитесь, что хукwp_loginработает и мета создается. - Некорректный формат даты — используйте
current_time('timestamp'), неtime(), чтобы учитывать часовой пояс WordPress. - Крон-задача не запускается — проверьте, есть ли событие в списке с помощью
wp cron event list, и что сайт посещают, чтобы WP-Cron срабатывал. - Удаляются администраторы — в коде выше удаляются все пользователи с устаревшим логином, добавьте проверку ролей, если нужно сохранить некоторые:
if (!in_array('administrator', $user_roles)) {
wp_delete_user($user_id);
}Практические советы по безопасности и производительности
- Не удаляйте пользователей без резервного копирования базы.
- Добавьте фильтр по ролям, чтобы исключить важных пользователей.
- Для больших сайтов лучше разбивать удаление на порции, чтобы не перегружать сервер.
- Используйте WP-CLI для запуска задач вне зависимости от посещаемости сайта.
Сравнение методов удаления неактивных пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Код с wp_login и WP-Cron | Полный контроль, без плагинов, гибкость | Нужно писать и тестировать код, зависит от WP-Cron |
| Плагины очистки пользователей (например, WP User Manager) | Простота настройки, интерфейс | Дополнительная нагрузка, возможные конфликты |
| Ручное удаление в админке | Простота | Не подходит для больших сайтов, трудоемко |