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

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

С течением времени на сайте WordPress накапливаются пользователи, которые давно не заходили в систему. Это может негативно влиять на безопасность (заброшенные аккаунты часто становятся мишенью для атак), производительность (большое количество пользователей замедляет выборки) и затруднять управление пользователями. Автоматическое удаление неактивных пользователей по дате последнего входа решает эти задачи.

Как определить неактивных пользователей в WordPress

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

Добавляем запись даты входа пользователя

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

Этот код сохраняет дату и время последнего входа в формате MySQL в мета-поле last_login.

Как автоматически удалять пользователей, не входивших более 6 месяцев

Далее нужно запланировать задачу с помощью WP-Cron, которая будет запускать удаление.

Добавление еженедельного события для очистки

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

add_action('delete_inactive_users_weekly', 'delete_inactive_users_by_last_login');

function delete_inactive_users_by_last_login() {
    global $wpdb;
    $threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    $user_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %s",
        $threshold
    ));

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

Этот код выберет всех пользователей, чей последний вход был более 6 месяцев назад, и удалит их через wp_delete_user, корректно очищая данные WordPress.

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

  1. Войдите под разными пользователями и убедитесь, что мета-поле last_login появляется с актуальной датой в базе (таблица wp_usermeta).
  2. Запустите функцию удаления вручную (временно вызовите delete_inactive_users_by_last_login() через admin-ajax или напрямую в functions.php) и проверьте, что пользователи с датой входа старше 6 месяцев удаляются.
  3. Проверьте логи сервера и наличие ошибок при запуске WP-Cron (плагин WP Crontrol поможет отследить зарезервированные задачи).

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

  • Дата последнего входа не сохраняется — проверьте, что хук wp_login подключен правильно и функция не вызывает ошибок.
  • Пользователи не удаляются — проверьте расписание WP-Cron и права пользователя, под которым запускается скрипт.
  • Удаление удаляет администраторов — добавьте дополнительную проверку роли, чтобы исключить важные аккаунты из удаления.
  • Ошибка в SQL-запросе — используйте $wpdb->prepare для безопасности и правильной подстановки параметров.

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

  • Всегда исключайте пользователей с ролями администратора и редактора из автоматического удаления.
  • Добавьте логирование удалений в файл, чтобы отслеживать, какие пользователи были удалены.
  • Используйте плагин WP Crontrol для контроля и отладки WP-Cron задач.
  • Для сайтов с большим количеством пользователей лучше выполнять удаление партиями (например, по 50 пользователей за раз), чтобы не перегружать сервер.

Пример кода с исключением администраторов и логированием

function delete_inactive_users_by_last_login() {
    global $wpdb;
    $threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    $user_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %s",
        $threshold
    ));

    foreach ($user_ids as $user_id) {
        $user = get_userdata($user_id);
        if (in_array('administrator', $user->roles)) {
            continue; // не удаляем админов
        }

        $deleted = wp_delete_user($user_id);
        if ($deleted) {
            error_log("User ID {$user_id} ({$user->user_login}) deleted due to inactivity.");
        }
    }
}

Сравнение способов реализации автоматического удаления

МетодПреимуществаНедостатки
WP-Cron + собственный кодГибкость, контроль, бесплатноЗависит от посещаемости сайта, требует тестирования
Плагины (например, Inactive User Deleter)Простота настройки, готовые функцииМеньше контроля, может конфликтовать с другими плагинами
Внешний cron + wp-cliТочность и надежность, не зависит от посещаемостиТребует доступа к серверу и знаний по настройке
Как отключить редактор Gutenberg в WordPress с помощью кода
21.03.2026
Как установить ограничение на длительность сессии в WordPress
14.04.2026
Добавление уникальных полей в формы WordPress: подробное руководство
28.01.2026
Как создать собственный шорткод в WordPress с примерами кода
28.11.2025
Как использовать WP-CLI для массовых изменений в WordPress
26.05.2026