Диагностика проблемы неактивных пользователей в WordPress
В крупных и средних проектах на WordPress сообщество или база пользователей может быстро разрастаться. При этом многие пользователи регистрируются, но долго не заходят на сайт, что создает избыточную нагрузку на базу данных и затрудняет администрирование. Проблема усугубляется, если используется WooCommerce или другие плагины, где активность пользователя влияет на бизнес-процессы.
Чтобы понять, насколько велика доля неактивных пользователей, можно выполнить SQL-запрос к базе, например:
SELECT ID, user_login, user_registered, last_login.meta_value AS last_login_date
FROM wp_users
LEFT JOIN wp_usermeta AS last_login ON (wp_users.ID = last_login.user_id AND last_login.meta_key = 'last_login')
WHERE last_login.meta_value < DATE_SUB(NOW(), INTERVAL 6 MONTH)
OR last_login.meta_value IS NULL;
Если в вашей базе нет мета-данных с последним входом, придется реализовать их хранение самостоятельно, например, с помощью хука wp_login для записи времени последнего входа.
Как автоматически удалять неактивных пользователей в WordPress — пошаговое решение
1. Отслеживание времени последнего входа пользователя
Добавьте в functions.php темы или собственный плагин следующий код, чтобы записывать дату и время последнего входа пользователя:
function track_last_login($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'track_last_login', 10, 2);
2. Создание функции удаления неактивных пользователей
Допустим, считаем неактивными пользователей, которые не заходили на сайт более 180 дней. Создадим функцию, которая будет искать таких пользователей и удалять их.
function delete_inactive_users($days = 180) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days'));
// Получаем ID пользователей с last_login до пороговой даты или без last_login
$users_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id AND um.meta_key = 'last_login'
WHERE um.meta_value < %s OR um.meta_value IS NULL",
$date_threshold
));
if (!empty($users_to_delete)) {
foreach ($users_to_delete as $user_id) {
// Не удаляем администраторов
if (user_can($user_id, 'administrator')) {
continue;
}
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}
3. Автоматизация через WP-Cron
Чтобы не запускать функцию вручную, зарегистрируем ежедневное событие WP-Cron:
function schedule_inactive_users_cleanup() {
if (!wp_next_scheduled('daily_inactive_users_cleanup')) {
wp_schedule_event(time(), 'daily', 'daily_inactive_users_cleanup');
}
}
add_action('wp', 'schedule_inactive_users_cleanup');
add_action('daily_inactive_users_cleanup', function() {
delete_inactive_users(180); // Удаляем пользователей неактивных более 180 дней
});
Проверка результата после внедрения
- Выполните SQL-запрос из раздела диагностики, чтобы убедиться, что пользователи с датой последнего входа старше 180 дней есть.
- Запустите функцию удаления вручную в тестовой среде (например, вызвав
delete_inactive_users(180);через WP-CLI или временно через админку). - Проверьте, что пользователи удалились из таблицы
wp_usersи связанная с ними информация также удалена. - Проверьте, что администраторы не были удалены.
- Проверьте логи ошибок и убедитесь, что нет фатальных ошибок после запуска кода.
Частые ошибки и как их исправить
- Отсутствие мета-данных last_login: если вы не добавили запись времени последнего входа, функция не сможет определить неактивных пользователей. Решение — добавить хук
wp_loginдля записи last_login. - Удаление важных пользователей: функция удаляет всех, кроме администраторов. Если есть другие важные роли, внесите их в исключения через проверку
user_can(). - Проблемы с WP-Cron: если WP-Cron не срабатывает из-за низкой посещаемости сайта, лучше настроить системный cron для запуска wp-cron.php.
- Удаление пользователей с заказами (WooCommerce): удаление пользователей с заказами может привести к потере данных. Добавьте дополнительную проверку на наличие заказов перед удалением.
Практические советы по безопасности и производительности
- Добавьте в функцию удаления логирование удалённых пользователей для возможности аудита.
- Проверяйте права доступа пользователей перед удалением, чтобы не удалить случайно важные аккаунты.
- Для больших сайтов разбивайте удаление на партии по 50-100 пользователей, чтобы избежать таймаутов.
- Используйте системный cron для запуска WP-Cron, это надёжнее и стабильнее.
- Регулярно делайте резервные копии базы данных перед автоматическими удалениями.
Сравнение вариантов автоматического удаления пользователей
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код с WP-Cron | Гибкость, контроль над логикой, отсутствие дополнительных плагинов | Требует навыков программирования, настройка WP-Cron |
| Плагины (например, Inactive User Delete) | Простота установки, готовый интерфейс | Может грузить сайт, ограниченная кастомизация |
| Ручное удаление через SQL/админку | Полный контроль, без автоматизации | Трудоёмко, риск ошибок, не подходит для больших баз |