Диагностика проблемы: зачем удалять неактивных пользователей?
Ведение большого сайта на WordPress с регистрацией пользователей часто приводит к накоплению неактивных аккаунтов. Неактивные пользователи создают нагрузку на базу данных, могут увеличивать риск безопасности, а также влиять на аналитику и рассылки. Важно регулярно очищать базу от таких аккаунтов, особенно если сайт использует платные сервисы или ограниченное количество пользователей.
Как определить неактивных пользователей в WordPress?
Ключевой критерий — дата последнего входа пользователя. По умолчанию WordPress не хранит дату последнего входа, поэтому для её отслеживания нужно добавить кастомный код или использовать плагины.
Добавление записи даты последнего входа пользователя
Чтобы фиксировать дату последнего входа, добавьте следующий код в functions.php вашей темы или в пользовательский плагин:
add_action('wp_login', 'update_last_login', 10, 2);
function update_last_login($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}Эта функция обновляет метаполе last_login при каждом входе пользователя.
Выбор периода неактивности
Определите, сколько дней без активности считается неактивным. Например, 180 дней (6 месяцев) — распространённый порог.
Пошаговое решение: скрипт автоматического удаления неактивных пользователей
Создадим WP CLI команду и функцию для удаления пользователей, которые не заходили больше 180 дней.
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('delete_inactive_users', function($args, $assoc_args) {
$days = isset($assoc_args['days']) ? intval($assoc_args['days']) : 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'meta_key' => 'last_login',
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => -1
];
$user_query = new WP_User_Query($args);
$user_ids = $user_query->get_results();
if (empty($user_ids)) {
WP_CLI::success('Нет неактивных пользователей для удаления.');
return;
}
foreach ($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
WP_CLI::log("Удалён пользователь ID: $user_id");
}
WP_CLI::success('Удаление неактивных пользователей завершено.');
});
}Запуск команды в консоли:
wp delete_inactive_users --days=180Если у вас нет доступа к WP CLI, можно создать аналогичный код с запуском через CRON.
Проверка результата после внедрения
- Проверьте базу данных через phpMyAdmin или WP User List: не должно быть пользователей с
last_loginстарее порога. - Запустите WP CLI команду с опцией
--dry-run(добавьте её самостоятельно в код как вывод без удаления), чтобы увидеть список к удалению. - Обратите внимание на логи сервера и WP CLI - они должны содержать отчёт об удалённых пользователях.
Частые ошибки и как их исправить
- Отсутствует метаполе
last_login: если код для записи даты входа не подключён, скрипт ничего не найдёт. Проверьте, чтоupdate_last_loginотключен. - Пользователи с пустым
last_loginне удаляются: добавьте дополнительную проверку или инициализацию поля при регистрации. - Удаление пользователей с важными ролями: добавьте фильтр по ролям, чтобы избежать удаления администраторов или модераторов.
- Проблемы с правами на удаление: убедитесь, что скрипт запускается с достаточными правами (WP CLI обычно запускается под пользователем с админскими правами).
Практические советы по безопасности и производительности
- Перед удалением создавайте резервную копию базы данных.
- Исключайте из удаления пользователей с особыми ролями через фильтр, например:
$args['role__not_in'] = ['administrator', 'editor'];- Не удаляйте пользователей, у которых есть активные заказы или важные данные (для WooCommerce — проверяйте заказы).
- Запускайте удаление в ночное время или при низкой нагрузке на сервер.
- Для больших сайтов реализуйте удаление партиями (например, по 50 пользователей за раз).
Сравнение вариантов реализации автоматического удаления пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP CLI команда | Точный контроль, быстрое выполнение, логирование | Требуется доступ к консоли сервера | Использовать только на VPS или выделенных хостингах |
| CRON задача с PHP | Автоматизация без доступа к консоли | Может нагружать сайт, ограничение времени выполнения | Разбивать удаление на части, использовать wp_schedule_event |
| Плагин автоочистки | Простота установки, интерфейс | Меньше гибкости, возможны конфликты | Использовать проверенные плагины, например WP ClearInactiveUsers |