Правильное удаление неактивных пользователей WordPress с примером кода

Диагностика проблемы: зачем удалять неактивных пользователей

На крупных сайтах с регистрацией пользователей часто накапливаются неактивные аккаунты, которые не используются владельцами и занимают место в базе данных. Это может замедлять работу сайта, увеличивать нагрузку на сервер и создавать риски безопасности, так как забытые аккаунты могут быть уязвимы для взлома.

Первый шаг — определить, кто считается неактивным. Обычно это пользователи, которые давно не заходили на сайт (например, более 6 месяцев), и не совершали никаких действий.

Как проверить активность пользователей в базе

WordPress хранит дату последнего входа пользователя в поле last_login только если установлен соответствующий плагин или собственное решение. По умолчанию стандартный WordPress не ведет такую статистику, но есть поле user_registered с датой регистрации.

Для проверки активности без плагинов и дополнительных данных можно ориентироваться на дату последнего изменения профиля или метаданных, но это не всегда надежно. Лучший вариант — добавить механизм записи времени последнего входа.

Пошаговое решение: автоматическое удаление неактивных пользователей

1. Добавляем хранение даты последнего входа

Для точного отслеживания добавим хук на успешный вход пользователя и запишем дату в метаполе last_login:

add_action('wp_login', function($user_login, $user) {
    update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);

2. Создаем функцию для удаления неактивных пользователей

Напишем функцию, которая будет удалять пользователей, не входивших более 180 дней (6 месяцев). Можно запускать ее вручную или через WP-Cron.

function delete_inactive_users($days = 180) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days'));

    // Получаем IDs пользователей с last_login < $date_threshold или без last_login (новые пользователи без входов)
    $user_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT u.ID FROM {$wpdb->users} u
         LEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id AND um.meta_key = 'last_login'
         WHERE (um.meta_value < %s OR um.meta_value IS NULL) AND u.ID > 1",
        $date_threshold
    ));

    foreach ($user_ids as $user_id) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user($user_id);
    }

    return count($user_ids);
}

3. Запускаем функцию по крону

Настроим WP-Cron, чтобы вызывать удаление раз в неделю:

add_action('weekly_delete_inactive_users', 'delete_inactive_users');

if (!wp_next_scheduled('weekly_delete_inactive_users')) {
    wp_schedule_event(time(), 'weekly', 'weekly_delete_inactive_users');
}

Проверка результата после внедрения

  • Залогиньтесь под тестовым пользователем и проверьте, что в таблице usermeta для него появляется мета last_login с актуальным временем.
  • Запустите функцию delete_inactive_users(180) вручную через админ-панель или через командную строку WP-CLI и проверьте, что неактивные аккаунты удаляются.
  • Проверьте, что WP-Cron событие запланировано и срабатывает (через плагин WP Crontrol или wp cron event list).

Частые ошибки и как их исправить

  • Пользователи не удаляются: Проверьте, что ID пользователей не равны 1 (администратор), он не удаляется. Также убедитесь, что функция вызывается, а не просто объявлена.
  • Нет мета last_login: Если не записывается время входа, проверьте правильность хука wp_login и параметры функции.
  • Удаление критичных пользователей: Добавьте исключения по ролям, если нужно сохранить админов или других важных пользователей.
  • Проблемы с WP-Cron: Если крон не срабатывает, настройте реальный cron на сервер, чтобы запускать WP-Cron через wp-cron.php.

Практические советы по безопасности и производительности

  • Перед удалением пользователей сделайте резервную копию базы.
  • Добавьте логирование удалений в отдельный файл или базу для аудита.
  • Ограничьте удаление пользователей с определенными ролями (например, админ, редактор) чтобы избежать проблем.
  • Для больших сайтов делайте удаление пакетами по 50-100 пользователей, чтобы избежать таймаутов.
  • Проверяйте и очищайте связанные с пользователями данные (комментарии, заказы WooCommerce) вручную или через дополнительные функции.

Сравнение вариантов удаления неактивных пользователей

ВариантПлюсыМинусыКомпромисс
Удаление вручную через админкуПростота, контрольДолго, неудобно на больших сайтахИспользовать для единичных случаев
Плагин для удаленияАвтоматизация, удобный интерфейсЗависимость от стороннего кода, нагрузкаВыбирать проверенные плагины, тестировать
Собственный код с WP-CronГибкость, контроль, минимальная нагрузкаТребует навыков, настройкаОптимальный для опытных разработчиков
Как автоматически отключать изображения в WordPress при отказах от загрузки
24.01.2026
Правильное удаление неактивных пользователей WordPress с примером кода
30.04.2026
Как удалить корзину WooCommerce и обновить страницу без конфликтов AJAX
17.05.2026
Как создать автоматическое удаление неактивных пользователей WordPress
07.04.2026
Автоматическое удаление старых мультимедиа в WordPress: практические решения
12.04.2026