Диагностика проблемы неактивных пользователей в WordPress
Неактивные пользователи — это аккаунты, которые долгое время не заходили на сайт или не выполняли никаких действий. Они могут занимать место в базе данных, влиять на безопасность (особенно, если это администраторы или редакторы) и увеличивать нагрузку на систему. В WooCommerce, например, неактивные покупатели или клиенты, которые не совершали заказов долгое время, тоже создают избыточные данные.
Для диагностики можно использовать SQL-запросы к базе данных или плагины для анализа активности пользователей. Ключевые показатели — дата последнего входа пользователя и дата регистрации.
Как проверить активность пользователей через базу данных
WordPress по умолчанию не хранит дату последнего входа в отдельном поле, но можно получить дату последнего действия через плагины или произвести настройку для записи этой даты. Если такой записи нет, можно ориентироваться на дату последней публикации или комментария, если это применимо.
SELECT user_login, user_registered FROM wp_users WHERE user_registered < DATE_SUB(NOW(), INTERVAL 1 YEAR);Этот запрос выберет пользователей, зарегистрированных более года назад. Но лучше вести учёт последней активности с помощью плагина или кастомного поля.
Пошаговое решение: автоматическое удаление неактивных пользователей
1. Добавляем хранение даты последнего входа
Для начала нужно записывать дату последнего входа пользователя. Добавьте в functions.php или в плагин следующий код:
add_action('wp_login', function($user_login, $user) { update_user_meta($user->ID, 'last_login', current_time('mysql')); }, 10, 2);Этот код сохраняет дату и время последнего входа в пользовательское мета поле last_login.
2. Создаём функцию для удаления неактивных пользователей
function delete_inactive_users($days = 365) { $threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days')); $args = [ 'meta_key' => 'last_login', 'meta_value' => $threshold, 'meta_compare' => '<', 'fields' => 'ID', ]; $user_query = new WP_User_Query($args); foreach ($user_query->get_results() as $user_id) { require_once(ABSPATH . 'wp-admin/includes/user.php'); wp_delete_user($user_id); } }Эта функция удаляет всех пользователей, последний вход которых был более $days дней назад. Можно запускать её по расписанию.
3. Настраиваем автоматический запуск через WP-Cron
if (!wp_next_scheduled('delete_inactive_users_daily')) { wp_schedule_event(time(), 'daily', 'delete_inactive_users_daily'); } add_action('delete_inactive_users_daily', function() { delete_inactive_users(365); });Этот код запустит удаление неактивных пользователей раз в сутки.
Проверка результата после внедрения
- Войдите в базу данных и проверьте наличие пользователей с датой
last_loginстарше одного года. - Запустите функцию удаления вручную (например, вызовом
delete_inactive_users(365);в админке или через WP-CLI). - Проверьте, что эти пользователи удалились из таблицы
wp_usersи связанной мета-информацииwp_usermeta. - Убедитесь, что активные пользователи остались без изменений.
Частые ошибки и как их исправить
- Отсутствие записи последнего входа: если
last_loginне обновляется, удалится либо никто, либо все. Проверьте, что хукwp_loginработает и мета поле обновляется. - Удаление важных пользователей: проверьте, чтобы в функцию не попали администраторы или важные роли. Добавьте фильтр по роли:
$args['role__not_in'] = ['administrator', 'editor'];- Проблемы с WP-Cron: если расписание не срабатывает, проверьте, работает ли WP-Cron на вашем хостинге или запустите вручную через WP-CLI.
Практические советы по безопасности и производительности
- Перед удалением создавайте резервные копии базы данных.
- Не удаляйте пользователей сразу, лучше сначала помечать их статусом, например, через мета поле
inactive_flag, и через время удалять. - Ограничьте удаление пользователей только теми ролями, которые не влияют на работу сайта.
- Для крупных сайтов используйте WP-CLI для запуска удаления, чтобы избежать таймаутов PHP.
Сравнение вариантов реализации удаления неактивных пользователей
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Плагин | Простота установки, готовый интерфейс | Могут быть избыточными, нагрузка | Использовать лёгкие плагины с минимальным функционалом |
| Кастомный код + WP-Cron | Гибкость, минимальная нагрузка | Требует навыков программирования, поддержка | Тестировать на тестовом сайте перед продакшеном |
| WP-CLI скрипт | Высокая производительность, подходит для больших сайтов | Требует доступа к терминалу, опыт работы с WP-CLI | Использовать для разовых очисток |
Пример расширенного кода с фильтрацией по роли и отметкой inactive
function mark_and_delete_inactive_users($days = 365) { $threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days')); $args = [ 'meta_key' => 'last_login', 'meta_value' => $threshold, 'meta_compare' => '<', 'fields' => 'ID', 'role__not_in' => ['administrator', 'editor'], ]; $user_query = new WP_User_Query($args); foreach ($user_query->get_results() as $user_id) { $inactive = get_user_meta($user_id, 'inactive_flag', true); if (!$inactive) { update_user_meta($user_id, 'inactive_flag', 1); } else { require_once(ABSPATH . 'wp-admin/includes/user.php'); wp_delete_user($user_id); } } }Этот код сначала помечает пользователя как неактивного, а при повторном запуске — удаляет. Это снижает риск случайного удаления.