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

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

В крупных и средних 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 собственный код

Критерий Плагин Собственный код Компромисс
Гибкость Ограничена настройками Максимальная, можно учесть любые условия Использовать код с возможностью настройки через админку
Производительность Может быть тяжелее из-за лишних функций Оптимизирован под задачу Минималистичный код без лишних зависимостей
Безопасность Зависит от качества плагина Контроль над кодом Рецензирование кода и тестирование
Поддержка Есть поддержка и обновления Требует самостоятельного обслуживания Комбинация: базовый код + сторонние обновления
Автоматическое удаление старых черновиков в WordPress
22.12.2025
Как удалить проблемы с перенаправлениями после смены домена в WordPress
02.05.2026
Как создать собственный тип записи в WordPress с примером кода
09.01.2026
Оптимизация базы данных WordPress: удаление связанных и устаревших данных
02.12.2025
Автообновление плагинов WordPress без риска: настройка и контроль
13.01.2026