yelly.ru wordpress Yelly

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

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

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

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

По умолчанию WordPress не хранит дату последнего входа пользователя. Для автоматического удаления нужно добавить эту функциональность, например, с помощью хука wp_login, чтобы фиксировать время последнего входа в метаполе пользователя.

Пример кода для записи времени последнего входа

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

Этот код добавляет метаданные last_login с UNIX-таймстампом времени входа.

Пошаговое решение: скрипт автоматического удаления

Чтобы регулярно очищать базу, создадим функцию, которая будет искать пользователей, у которых дата последнего входа старше 180 дней (6 месяцев), и удалять их.

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

function delete_inactive_users() {
    $threshold = strtotime( '-180 days' );
    $args = [
        'meta_key' => 'last_login',
        'meta_value' => $threshold,
        'meta_compare' => '<=',
        'fields' => 'ID',
        'number' => 100,
    ];
    $user_query = new WP_User_Query( $args );
    $users = $user_query->get_results();

    if ( !empty( $users ) ) {
        foreach ( $users as $user_id ) {
            wp_delete_user( $user_id );
        }
    }
}

// Запуск функции через WP-Cron раз в неделю
if ( !wp_next_scheduled( 'weekly_delete_inactive_users' ) ) {
    wp_schedule_event( time(), 'weekly', 'weekly_delete_inactive_users' );
}
add_action( 'weekly_delete_inactive_users', 'delete_inactive_users' );

В этом коде:

  • С помощью WP_User_Query выбираем пользователей с датой последнего входа более 180 дней назад.
  • Удаляем их через wp_delete_user().
  • Запускаем очистку раз в неделю через WP-Cron.

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

Чтобы проверить работу сценария:

  • Зайдите в базу данных и убедитесь, что у пользователей есть метаполе last_login.
  • Добавьте тестового пользователя, установите вручную дату last_login в более раннее время, например через update_user_meta в админке или через инструмент базы данных.
  • Запустите вручную функцию delete_inactive_users() или дождитесь срабатывания WP-Cron.
  • Проверьте, удалился ли тестовый пользователь из базы.

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

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

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

  • Добавляйте в запрос исключения для пользователей с повышенными правами (администраторы, редакторы), чтобы случайно не удалить важных участников.
  • Не запускайте удаление сразу для всех пользователей, ограничивайте пакет по 50-100 пользователей за раз, чтобы избежать перегрузки сервера.
  • Храните дату последнего входа в формате UNIX-таймстампа для удобства сравнения и запросов.
  • Для надежности работы автоматизации рассмотрите использование системного cron вместо WP-Cron, особенно на больших проектах.

Таблица сравнения вариантов удаления неактивных пользователей

МетодПреимуществаНедостатки
WP-Cron с собственным кодомГибкость, бесплатно, точный контрольЗависит от посещаемости сайта, возможны сбои
Системный cron с WP-CLIНадежность, не зависит от посетителейТребует доступа к серверу, сложнее в настройке
Плагины автоматизацииПростота настройкиМожет нагружать сайт, меньше контроля
×
Сделай WordPress мощнее!

Скидка -20% на топовые премиум плагины

Выбрать плагин сейчас ⋙