Диагностика проблемы: зачем удалять неактивных пользователей
Многие сайты на WordPress со временем накапливают большое количество пользователей, которые давно не заходили на сайт. Это может негативно влиять на производительность базы данных и создавать дополнительные риски безопасности. Автоматическое удаление таких учетных записей помогает поддерживать чистоту и безопасность сайта без ручной проверки.
Как определить неактивных пользователей: критерии отбора
Для автоматического удаления нужно четко определить, кого считать неактивным. Обычно в качестве критериев используют:
- Дата последнего входа пользователя (last_login). По умолчанию WordPress не хранит эту дату, поэтому понадобится плагин или кастомный код для ее записи.
- Роль пользователя. Например, администраторов и редакторов удалять не стоит, только подписчиков или покупателей.
- Дата регистрации или дата последнего обновления профиля.
Для хранения даты последнего входа можно использовать плагин WP Last Login или написать собственный код с хуком wp_login.
Пример кода для сохранения даты последнего входа пользователя в user meta:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);Пошаговое решение: автоматическое удаление неактивных пользователей
1. Добавьте код сохранения даты последнего входа (пример выше), если он еще не используется.
2. Создайте функцию, которая будет выбирать пользователей, у которых дата последнего входа старше заданного периода (например, 6 месяцев), и удалять их. Исключите из выборки администраторов.
Пример функции удаления неактивных пользователей:
function delete_inactive_users($months = 6) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$months} months"));
// Получаем пользователей с last_login старше threshold, кроме админов
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} um
JOIN {$wpdb->users} u ON u.ID = um.user_id
WHERE um.meta_key = 'last_login'
AND um.meta_value < %s
AND u.ID NOT IN (
SELECT user_id FROM {$wpdb->usermeta}
WHERE meta_key = '{$wpdb->prefix}capabilities' AND meta_value LIKE '%administrator%'
)",
$date_threshold
));
foreach($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
}3. Запустите функцию вручную или добавьте её в крон-задачу WordPress (wp_schedule_event) для регулярного выполнения.
Как добавить WP-Cron для автоматического удаления раз в месяц:
add_action('delete_inactive_users_event', 'delete_inactive_users');
if (!wp_next_scheduled('delete_inactive_users_event')) {
wp_schedule_event(time(), 'monthly', 'delete_inactive_users_event');
}Проверка результата после внедрения
Чтобы убедиться, что удаление работает:
- Проверьте в базе данных таблицу
wp_usermeta, что у удаляемых пользователей действительно стоит дата last_login старше порога. - Создайте тестового пользователя с датой входа, старше 6 месяцев, и запустите функцию вручную через admin-ajax или временный вызов.
- Проверьте, что пользователь удалился из базы и не отображается в списке пользователей админки.
- Просмотрите логи сервера на предмет ошибок при выполнении функции.
Частые ошибки и как их исправить
- Дата последнего входа не сохраняется: Если не реализован код для сохранения last_login, выборка не сработает. Проверьте, что в usermeta есть ключ
last_loginс корректными значениями. - Удаляются администраторы: Проверьте SQL-запрос на исключение ролей. Иногда поле capabilities хранится в сериализованном виде — используйте LIKE с осторожностью.
- Функция не запускается по расписанию: Убедитесь, что wp-cron работает и событие действительно добавлено. Можно временно добавить логирование внутри функции.
- Удаление вызывает ошибки из-за плагинов безопасности: Некоторые плагины могут блокировать wp_delete_user. Проверьте совместимость и логи.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед массовым удалением пользователей.
- Не удаляйте пользователей с ролями выше подписчика без веской причины.
- Оптимизируйте запросы, чтобы не перегружать сервер — например, выполняйте удаление партиями по 50-100 пользователей.
- Отслеживайте логи ошибок PHP и включайте мониторинг Cron задач.
- Используйте плагин Clearfy Pro для оптимизации и очистки базы данных, если хотите комплексное решение для сайта.
Сравнение вариантов реализации автоматического удаления пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин WP Last Login + кастомный код | Простота установки, надежное хранение last_login | Зависимость от плагина, возможные конфликты | Подходит для большинства сайтов |
| Полностью кастомный код для логина и удаления | Максимальная гибкость и контроль | Требует разработки и тестирования | Для опытных разработчиков с нуждами в тонкой настройке |
| Использование готовых плагинов для очистки пользователей | Быстрое решение без кода | Может быть избыточным и влиять на производительность | Подходит для малых сайтов |