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

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

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

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

Для автоматического удаления нужно четко определить, кого считать неактивным. Обычно в качестве критериев используют:

  • Дата последнего входа пользователя (last_login). По умолчанию WordPress не хранит эту дату, поэтому понадобится плагин или кастомный код для ее записи.
  • Роль пользователя. Например, администраторов и редакторов удалять не стоит, только подписчиков или покупателей.
  • Дата регистрации или дата последнего обновления профиля.

Для хранения даты последнего входа можно использовать плагин WP Last Login или написать собственный код с хуком wp_login.

Пример кода для сохранения даты последнего входа пользователя в user meta:

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

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

1. Добавьте код сохранения даты последнего входа (пример выше), если он еще не используется.

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

Пример функции удаления неактивных пользователей:

function delete_inactive_users($months = 6) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$months} months"));

    // Получаем пользователей с last_login старше threshold, кроме админов
    $user_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT user_id FROM {$wpdb->usermeta} um
         JOIN {$wpdb->users} u ON u.ID = um.user_id
         WHERE um.meta_key = 'last_login'
           AND um.meta_value < %s
           AND u.ID NOT IN (
               SELECT user_id FROM {$wpdb->usermeta}
               WHERE meta_key = '{$wpdb->prefix}capabilities' AND meta_value LIKE '%administrator%'
           )",
        $date_threshold
    ));

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

3. Запустите функцию вручную или добавьте её в крон-задачу WordPress (wp_schedule_event) для регулярного выполнения.

Как добавить WP-Cron для автоматического удаления раз в месяц:

add_action('delete_inactive_users_event', 'delete_inactive_users');

if (!wp_next_scheduled('delete_inactive_users_event')) {
    wp_schedule_event(time(), 'monthly', 'delete_inactive_users_event');
}

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

Чтобы убедиться, что удаление работает:

  • Проверьте в базе данных таблицу wp_usermeta, что у удаляемых пользователей действительно стоит дата last_login старше порога.
  • Создайте тестового пользователя с датой входа, старше 6 месяцев, и запустите функцию вручную через admin-ajax или временный вызов.
  • Проверьте, что пользователь удалился из базы и не отображается в списке пользователей админки.
  • Просмотрите логи сервера на предмет ошибок при выполнении функции.

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

  • Дата последнего входа не сохраняется: Если не реализован код для сохранения last_login, выборка не сработает. Проверьте, что в usermeta есть ключ last_login с корректными значениями.
  • Удаляются администраторы: Проверьте SQL-запрос на исключение ролей. Иногда поле capabilities хранится в сериализованном виде — используйте LIKE с осторожностью.
  • Функция не запускается по расписанию: Убедитесь, что wp-cron работает и событие действительно добавлено. Можно временно добавить логирование внутри функции.
  • Удаление вызывает ошибки из-за плагинов безопасности: Некоторые плагины могут блокировать wp_delete_user. Проверьте совместимость и логи.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением пользователей.
  • Не удаляйте пользователей с ролями выше подписчика без веской причины.
  • Оптимизируйте запросы, чтобы не перегружать сервер — например, выполняйте удаление партиями по 50-100 пользователей.
  • Отслеживайте логи ошибок PHP и включайте мониторинг Cron задач.
  • Используйте плагин Clearfy Pro для оптимизации и очистки базы данных, если хотите комплексное решение для сайта.

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

МетодПлюсыМинусыКомпромисс
Плагин WP Last Login + кастомный кодПростота установки, надежное хранение last_loginЗависимость от плагина, возможные конфликтыПодходит для большинства сайтов
Полностью кастомный код для логина и удаленияМаксимальная гибкость и контрольТребует разработки и тестированияДля опытных разработчиков с нуждами в тонкой настройке
Использование готовых плагинов для очистки пользователейБыстрое решение без кодаМожет быть избыточным и влиять на производительностьПодходит для малых сайтов
Как автоматически удалить товар из заказов WooCommerce после отмены или возврата
18.04.2026
Как отключить автовыделение и автозагрузку изображений в WordPress
02.03.2026
Как использовать хук WooCommerce для обновления мета данных заказа на этапе оформления
07.05.2026
Как использовать хук pre_get_posts в WordPress для фильтрации записей
29.01.2026
Автоматическое удаление старых неиспользуемых изображений из медиабиблиотеки WordPress
06.02.2026