Диагностика проблемы: зачем и когда удалять неактивных пользователей
В крупных и средних WordPress-сайтах с регистрацией пользователей часто накапливаются учетные записи, которые более не используются. Такие неактивные пользователи не только увеличивают размер базы данных, но и потенциально создают риски безопасности (например, устаревшие пароли, забытые учетные записи с правами). Автоматизация удаления таких пользователей поможет поддерживать базу в чистоте и снизить нагрузку на систему.
Как определить неактивного пользователя
Ключевое — установить критерии неактивности. Обычно это:
- Отсутствие входа в систему за последние N дней;
- Отсутствие активности (комментарии, заказы, публикации и т.п.);
- Статус пользователя (например, исключить администраторов из удаления).
В WordPress время последнего входа хранится в метаполе last_login, если оно есть, или можно использовать дату последней активности в другом поле, но по умолчанию WordPress не хранит дату последнего входа. Для этого нужно внедрить отслеживание (пример ниже).
Пошаговое решение: отслеживание и удаление неактивных пользователей
1. Отслеживание последнего входа пользователя
Добавим код в functions.php вашей темы или в плагин, чтобы при каждом логине обновлять метаполе last_login пользователя:
add_action('wp_login', 'update_last_login', 10, 2);
function update_last_login($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('timestamp'));
}2. Скрипт для удаления неактивных пользователей
Создадим функцию, которая будет искать пользователей, не заходивших более 180 дней, и удалять их, исключая администраторов:
function delete_inactive_users($days = 180) {
$threshold = strtotime('-' . intval($days) . ' days');
$args = array(
'meta_key' => 'last_login',
'meta_compare' => '<=',
'meta_value' => $threshold,
'fields' => 'ID',
'exclude' => get_users(array('role' => 'administrator', 'fields' => 'ID')),
);
$inactive_users = get_users($args);
foreach ($inactive_users as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
return count($inactive_users);
}3. Запуск удаления по расписанию с WP-Cron
Чтобы автоматизировать процесс, зарегистрируем событие WP-Cron, которое будет запускать функцию раз в неделю:
if (!wp_next_scheduled('weekly_inactive_user_cleanup')) {
wp_schedule_event(time(), 'weekly', 'weekly_inactive_user_cleanup');
}
add_action('weekly_inactive_user_cleanup', function() {
$deleted_count = delete_inactive_users(180);
error_log('Deleted ' . $deleted_count . ' inactive users');
});Проверка результата после внедрения
- Войдите под учетной записью пользователя, затем проверьте в базе данных (таблица
wp_usermeta) наличие метаполяlast_loginс текущей меткой времени. - Запустите функцию
delete_inactive_usersвручную, например, черезwp shellили временно вызовите в коде, и убедитесь, что пользователи с датой входа раньше 180 дней удаляются. - Проверьте логи сервера или файл debug.log для сообщений об удалённых пользователях.
Частые ошибки и как их исправить
- Дата последнего входа не записывается — проверьте, что хук
wp_loginподключен правильно и функцияupdate_last_loginне вызывает ошибок. - Удаляются администраторы — убедитесь, что в параметре
excludeпереданы ID всех админов; можно вывести их список черезerror_log(print_r(get_users(['role' => 'administrator', 'fields' => 'ID']), true)); - Пользователи не удаляются — проверьте права пользователя, под которым работает скрипт, и корректность вызова
wp_delete_user. - WP-Cron не срабатывает — убедитесь, что на сайте включён WP-Cron и что нет проблем с запуском задач (например, из-за кэширования или блокировки).
Практические советы по безопасности и производительности
- Перед автоматическим удалением пользователей сделайте резервную копию базы данных.
- Исключайте из удаления пользователей с особыми ролями или активными заказами (для WooCommerce), чтобы не навредить бизнес-процессу.
- Для больших сайтов с тысячами пользователей делайте удаление пакетами, чтобы избежать таймаутов.
- Регулярно проверяйте логи ошибок и WP-Cron, чтобы отслеживать корректность работы скрипта.
- Для улучшения производительности храните дату последнего входа в метаполе, а не вычисляйте динамически по другим параметрам.
Сравнение решений: плагин vs собственный код
| Критерий | Плагин | Собственный код | Компромисс |
|---|---|---|---|
| Гибкость | Ограничена настройками | Максимальная, можно учесть любые условия | Использовать код с возможностью настройки через админку |
| Производительность | Может быть тяжелее из-за лишних функций | Оптимизирован под задачу | Минималистичный код без лишних зависимостей |
| Безопасность | Зависит от качества плагина | Контроль над кодом | Рецензирование кода и тестирование |
| Поддержка | Есть поддержка и обновления | Требует самостоятельного обслуживания | Комбинация: базовый код + сторонние обновления |