Проблема: накопление неактивных и заблокированных пользователей в WordPress
Со временем в базе WordPress накапливаются пользователи, которые неактивны или заблокированы администратором. Это негативно влияет на безопасность сайта, производительность и усложняет управление пользователями. Стандартных инструментов WordPress для массового удаления таких пользователей нет, а плагины могут быть избыточными или конфликтовать с другими решениями. Рассмотрим, как решить эту задачу с помощью кода.
Диагностика: как определить неактивных и заблокированных пользователей
Для начала нужно понять, кого считать неактивными пользователями. Обычно критерии следующие:
- Пользователи, которые не заходили в админку и не активировались более 6 месяцев.
- Пользователи с ролью, например, «подписчик», которые не совершали активности.
- Заблокированные пользователи, у которых в метаданных есть флаг блокировки.
Для проверки последнего входа пользователя используйте поле last_login, если оно есть, или плагин, который добавляет такую метку, либо анализируйте дату последнего изменения профиля.
Пример SQL-запроса для поиска пользователей, не активных более 180 дней (без плагинов)
SELECT u.ID, u.user_login, u.user_email, um.meta_value as last_login FROM wp_users u LEFT JOIN wp_usermeta um ON u.ID = um.user_id AND um.meta_key = 'last_login' WHERE (um.meta_value < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY)) OR um.meta_value IS NULL);Если поле last_login отсутствует, можно использовать user_registered для грубой оценки.
Пошаговое решение: удаление неактивных и заблокированных пользователей через код
Для массового удаления пользователей без плагинов лучше всего использовать WP-CLI или добавить временный сниппет в файл functions.php активной темы (после теста на тестовом сайте!).
Шаг 1. Создайте резервную копию базы данных
Перед удалением обязательно сделайте бэкап базы, чтобы избежать потерь.
Шаг 2. Подготовьте сниппет для удаления
function delete_inactive_and_blocked_users() {
$args = [
'role__in' => ['subscriber', 'customer'], // роли для проверки
'meta_query' => [
'relation' => 'OR',
[
'key' => 'last_login',
'value' => strtotime('-180 days'),
'compare' => '<=',
'type' => 'NUMERIC'
],
[
'key' => 'blocked',
'value' => '1',
'compare' => '='
]
]
];
$user_query = new WP_User_Query($args);
$users = $user_query->get_results();
if(empty($users)) {
error_log('No inactive or blocked users found.');
return;
}
foreach($users as $user) {
require_once(ABSPATH.'wp-admin/includes/user.php');
wp_delete_user($user->ID);
error_log('Deleted user ID: ' . $user->ID);
}
}
// Запуск функции один раз
add_action('init', function(){
if(current_user_can('administrator')) {
delete_inactive_and_blocked_users();
}
});В этом коде:
- Выбираются пользователи с ролями «subscriber» и «customer».
- Удаляются те, у кого мета «last_login» старше 180 дней или установлен флаг «blocked».
Шаг 3. Запустите код и проверьте логи
В логе ошибок PHP появятся записи об удалённых пользователях. После успешного удаления удалите этот сниппет из functions.php.
Проверка результата после внедрения
Чтобы убедиться, что удаление прошло успешно:
- Перейдите в админку → Пользователи и проверьте количество пользователей с указанными ролями.
- Сделайте SQL-запрос аналогичный диагностическому и убедитесь, что пользователей с устаревшими датами больше нет.
- Проверьте логи сервера для подтверждения удаления.
Частые ошибки и как их исправить
- Отсутствие поля
last_login: WordPress по умолчанию не записывает дату последнего входа. Решение — добавить этот функционал через хукиwp_loginили использовать плагины. - Ошибка прав пользователя: функция запускается не от администратора, из-за чего удаление не происходит. Проверьте условие
current_user_can('administrator'). - Удаление важных пользователей: будьте осторожны с ролями в фильтре, чтобы не удалить админов или редакторов.
- Превышение времени выполнения: при большом количестве пользователей удаление может прерваться. Разбейте процесс на партии или используйте WP-CLI.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед массовым удалением.
- Добавьте логирование удалений для аудита.
- Для больших сайтов используйте WP-CLI, команда
wp user deleteс фильтрами и пакетной обработкой. - Добавьте периодический скрипт через CRON для очистки неактивных пользователей.
- При добавлении поля
last_loginиспользуйте хукwp_loginдля автоматического обновления метаданных:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', time());
}, 10, 2);Сравнение подходов удаления пользователей
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-CLI | Быстро, пакетно, без нагрузки на сайт | Требует доступа к серверу и знаний командной строки | Большие сайты, регулярная очистка |
| PHP-сниппет в functions.php | Нет сторонних плагинов, просто внедрить | Риск ошибки, нагрузка при большом объеме | Малые сайты, одноразовое удаление |
| Плагины для управления пользователями | Удобный интерфейс, дополнительные функции | Могут замедлять сайт, конфликты | Пользователи без навыков кода |