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

Диагностика проблемы неактивных пользователей в 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); });

Этот код запустит удаление неактивных пользователей раз в сутки.

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

  1. Войдите в базу данных и проверьте наличие пользователей с датой last_login старше одного года.
  2. Запустите функцию удаления вручную (например, вызовом delete_inactive_users(365); в админке или через WP-CLI).
  3. Проверьте, что эти пользователи удалились из таблицы wp_users и связанной мета-информации wp_usermeta.
  4. Убедитесь, что активные пользователи остались без изменений.

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

  • Отсутствие записи последнего входа: если 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); } } }

Этот код сначала помечает пользователя как неактивного, а при повторном запуске — удаляет. Это снижает риск случайного удаления.

Как автоматизировать присоединение пользователей к группе в WordPress
03.01.2026
Как автоматически менять статус заказов WooCommerce по условиям
16.05.2026
Как использовать WPRemark для автоматического комментирования в WordPress
07.01.2026
Оптимизация браузерных исключений ошибок WordPress
20.05.2025
Как избежать проблем с отключением AJAX в WooCommerce
21.02.2026