Почему важно удалять неактивных пользователей в WordPress
Неактивные пользователи — это зарегистрированные аккаунты, которые не выполняли вход на сайт длительное время. Их наличие может привести к увеличению базы данных, снижению производительности, а также к потенциальным рискам безопасности. Автоматическое удаление таких пользователей помогает поддерживать чистоту базы, снижать нагрузку и минимизировать уязвимости.
Диагностика: как определить неактивных пользователей
Для начала необходимо определить критерии неактивности. Обычно это пользователи, которые не заходили на сайт в течение определённого срока, например, 6 месяцев или 1 года. В WordPress дата последнего входа не хранится по умолчанию, поэтому её нужно сохранять самостоятельно.
Как проверить, есть ли у вас данные о последнем входе
В базе данных WordPress можно посмотреть метаполе пользователя, например, last_login. Чтобы проверить, есть ли такие данные, выполните SQL-запрос в phpMyAdmin:
SELECT user_id, meta_value FROM wp_usermeta WHERE meta_key = 'last_login' LIMIT 10;Если результатов нет, значит отслеживание не настроено и нужно добавить соответствующий код.
Пошаговое решение: как сохранить дату последнего входа и удалять неактивных пользователей
1. Сохраняем дату последнего входа пользователя
Добавьте следующий код в файл functions.php вашей темы или в свой плагин:
function save_last_login_timestamp($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('timestamp'));
}
add_action('wp_login', 'save_last_login_timestamp', 10, 2);Этот хук wp_login срабатывает при входе пользователя и обновляет мета-данные с текущим временем.
2. Скрипт автоматического удаления неактивных пользователей
Далее создадим функцию, которая будет искать и удалять пользователей, не входивших на сайт более заданного периода. Например, 180 дней.
function delete_inactive_users() {
$threshold = strtotime('-180 days'); // 180 дней назад
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100, // пакетная обработка
];
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
foreach ($users_to_delete as $user_id) {
wp_delete_user($user_id);
}
}Обратите внимание, что функция удаляет пользователей пакетами по 100 за раз, чтобы не перегружать сервер.
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', 'delete_inactive_users');Этот код создаёт ежедневное событие, которое вызывает функцию удаления.
Проверка результата после внедрения
1. Проверьте, что при входе пользователя в базу данных в wp_usermeta создаётся или обновляется ключ last_login с текущим timestamp.
2. Запустите функцию удаления вручную, добавив временно вызов delete_inactive_users() в functions.php и проверьте, что пользователи с датой последнего входа более 180 дней удаляются.
3. Проверяйте логи сервера и таблицы пользователей, чтобы убедиться, что удаление происходит без ошибок.
Частые ошибки и как их исправить
- Нет данных о последнем входе: если
last_loginне сохраняется, удаление не сработает. Решение — добавить хукwp_loginдля записи мета. - Удаление администраторов: функция удаляет всех пользователей, включая админов. Нужно исключить админов, добавив в запрос условие
role__not_in => ['administrator']. - Проблемы с производительностью: если база большая, лучше запускать удаление пакетами и с ограничением по времени, чтобы избежать таймаута.
- WP-Cron не срабатывает: если на сайте мало трафика или отключён WP-Cron, планировщик не работает. Рекомендуется настроить системный cron для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Обязательно делайте резервную копию базы перед автоматическим удалением пользователей.
- Добавьте логирование удалённых пользователей для аудита и восстановления при ошибке.
- Исключайте из удаления важные роли (например, администраторы, редакторы).
- Для больших сайтов рекомендуем запускать удаление не чаще раза в неделю.
- Для улучшения производительности используйте прямые SQL-запросы с LIMIT и OFFSET, если WP_User_Query слишком медленный.
Таблица сравнения способов удаления неактивных пользователей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP_User_Query + wp_delete_user | Использование стандартных API WordPress | Безопасно, учитывает всю логику удаления | Медленнее на больших базах |
| Прямой SQL + удаление через SQL | Удаление через SQL-запросы | Быстро на больших базах | Риск повреждения данных, обход хуков |
| Плагины (Clearfy Pro и др.) | Готовые решения с настройками | Просто, поддержка, интерфейс | Зависимость от стороннего кода, нагрузка |