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

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

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

  • Пользователь деактивирован или имеет роль, указывающую на блокировку.
  • Отсутствие активности (например, последний логин более 6 месяцев назад).
  • Пользователи, заблокированные вручную при выявлении подозрительной активности.

В WordPress нет стандартного статуса "заблокирован" для пользователей, поэтому чаще всего разработчики используют пользовательские метаданные или определённые роли (например, blocked или inactive).

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

Шаг 1. Определение критериев удаления

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

Шаг 2. Получение списка пользователей по условиям

$args = [
    'role' => 'blocked',
    'meta_query' => [
        [
            'key' => 'last_login',
            'value' => date('Y-m-d H:i:s', strtotime('-180 days')),
            'compare' => '<',
            'type' => 'DATETIME',
        ],
    ],
];
$users = get_users($args);

Примечание: Для отслеживания last_login нужно предварительно записывать время авторизации пользователя в метаданные. Это можно сделать с помощью хука wp_login:

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

Шаг 3. Удаление пользователей

foreach ($users as $user) {
    wp_delete_user($user->ID);
}

Шаг 4. Автоматизация с помощью WP-Cron

Чтобы запускать удаление автоматически, добавим задачу в WP-Cron, например, раз в сутки.

if (!wp_next_scheduled('auto_delete_blocked_users')) {
    wp_schedule_event(time(), 'daily', 'auto_delete_blocked_users');
}

add_action('auto_delete_blocked_users', function() {
    $args = [
        'role' => 'blocked',
        'meta_query' => [
            [
                'key' => 'last_login',
                'value' => date('Y-m-d H:i:s', strtotime('-180 days')),
                'compare' => '<',
                'type' => 'DATETIME',
            ],
        ],
    ];
    $users = get_users($args);
    foreach ($users as $user) {
        wp_delete_user($user->ID);
    }
});

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

  • Проверьте вручную наличие пользователей с ролью blocked и метаданными last_login в базе через phpMyAdmin или админку.
  • Запустите функцию удаления вручную (через вызов хука или отдельный скрипт) и убедитесь, что пользователи удаляются.
  • Проверьте, что WP-Cron действительно срабатывает (например, с помощью плагина WP Crontrol).
  • Отследите логи ошибок, чтобы убедиться в отсутствии сбоев.

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

  • Отсутствие записи времени последнего входа: без last_login фильтрация по дате невозможна. Решение: обязательно добавьте хук wp_login для обновления метаданных.
  • Неверно указанная роль пользователя: роль blocked должна существовать и быть назначена. Проверьте наличие роли через get_editable_roles().
  • Удаление администраторов: если у заблокированных пользователей есть права администратора, их удаление может привести к проблемам. Рекомендуется исключить администраторов из выборки.
  • WP-Cron не срабатывает: на некоторых серверах WP-Cron работает только при посещениях сайта. Для надежности настройте системный cron или используйте внешние сервисы.

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

  • Перед массовым удалением пользователей создавайте резервную копию базы данных.
  • Ограничьте права пользователя, который запускает удаление, чтобы избежать случайных ошибок.
  • Оптимизируйте запросы к базе данных, минимизируя нагрузку при большом количестве пользователей.
  • Используйте транзакции или поэтапное удаление при критично большом объеме данных.

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

МетодПлюсыМинусыКомпромисс
Ручное удаление через админкуПростота, контрольТрудозатратно, риск забытьПодходит для небольших сайтов
WP-Cron с кастомным кодомАвтоматизация, гибкостьЗависимость от WP-Cron, требует разработкиЛучший вариант для средних и больших сайтов
Плагин сторонний (например, User Cleanup)Готовое решение, интерфейсДополнительная нагрузка, возможны конфликтыИспользуйте, если не хотите писать код
Как использовать REST API в WordPress для создания своего плагина
22.11.2025
Как создать собственный тип записей (Custom Post Type) в WordPress с примером кода
27.03.2026
Как автоматически удалять старые заказы WooCommerce по дате
25.05.2026
Как создать динамическую отображающуюся таблицу в WordPress с помощью shortcode
12.02.2026
Как удалить или изменить авторские права в метаданных WordPress
08.02.2026