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

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

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

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

В WordPress нет штатного поля для отслеживания даты последнего входа пользователя. Чтобы решить эту задачу, нужно:

  • Добавить запись последнего логина через хук wp_login.
  • Сохранять дату последнего входа в мета-поле пользователя.

Добавляем отслеживание последнего входа

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

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

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

Создадим функцию, которая будет искать пользователей, не заходивших на сайт более N дней, и удалять их. Например, удалять аккаунты без входа 180 дней.

function wplancer_delete_inactive_users() {
    $days_inactive = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));

    $args = array(
        'meta_key'     => 'last_login',
        'meta_value'   => $date_threshold,
        'meta_compare' => '<',
        'fields'       => 'ID',
        'number'       => 100,
    );

    $inactive_users = get_users( $args );

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

Для автоматизации запуска функции добавьте cron-задачу:

if ( ! wp_next_scheduled( 'wplancer_daily_inactive_user_cleanup' ) ) {
    wp_schedule_event( time(), 'daily', 'wplancer_daily_inactive_user_cleanup' );
}
add_action( 'wplancer_daily_inactive_user_cleanup', 'wplancer_delete_inactive_users' );

Как проверить, что удаление работает

  • В базе данных в таблице wp_usermeta проверьте наличие мета-ключа last_login у пользователей.
  • Создайте тестового пользователя, не заходите под ним 180 дней (или измените дату last_login вручную в базе), запустите функцию вручную через WP-CLI или временно вызовите ее в коде.
  • Проверьте, что пользователь удалён из админки и базы.

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

  • Отсутствие записи даты последнего входа: Функция удаления ищет last_login. Если этот мета-ключ не создаётся, удаление не будет работать. Убедитесь, что хук wp_login корректно добавлен.
  • Удаление администраторов: В текущем коде не исключены роли, поэтому могут удаляться админы. Добавьте проверку роли, чтобы защитить важных пользователей.
  • Проблемы с производительностью при большом количестве пользователей: Используйте пагинацию или ограничьте количество удаляемых пользователей за один запуск.

Расширение функции с проверкой роли и логированием

function wplancer_delete_inactive_users_safe() {
    $days_inactive = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));

    $args = array(
        'meta_key'     => 'last_login',
        'meta_value'   => $date_threshold,
        'meta_compare' => '<',
        'fields'       => array('ID', 'user_login', 'roles'),
        'number'       => 50,
    );

    $inactive_users = get_users( $args );

    foreach ( $inactive_users as $user ) {
        if ( in_array( 'administrator', $user->roles ) ) {
            continue; // не удаляем админов
        }
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user( $user->ID );
        error_log( 'Deleted inactive user: ' . $user->user_login );
    }
}

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

  • Перед удалением делайте резервную копию базы.
  • Добавьте уведомление администратору о количестве удалённых пользователей.
  • Учитывайте, что пользователи без входа могут быть новыми, но зарегистрированными. Возможно, лучше сначала отправлять предупреждения.
  • Если у вас WooCommerce, учитывайте связанные данные, чтобы не потерять заказы.

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

МетодОписаниеПлюсыМинусы
Ручной аудит и удалениеАдмин проверяет дату последнего входа и удаляет пользователей вручнуюКонтроль, нет риска ошибочного удаленияТрудозатратно, не масштабируется
Автоматический скрипт с wp_loginСохраняет дату последнего входа, удаляет по кронуАвтоматизация, гибкостьТребует доработки, возможны ошибки при настройке
Плагины (например, Inactive User Deleter)Готовое решение с интерфейсомПростота настройкиМогут грузить сайт, ограниченные настройки
Как создать комплексный фильтрованный список на WordPress
22.12.2025
Как создать автоматические записи с обновляемым контекстом в WordPress
02.04.2026
Как создать многоуровневую навигацию в WordPress: подробное руководство
10.01.2026
Как использовать Custom User Meta в WordPress для расширения функционала
25.02.2026
Автоматическое удаление товаров в WooCommerce по срокам и статусам
21.05.2026