Проблема: зачем удалять неактивных пользователей
В крупных сайтах на WordPress с регистрацией пользователей со временем появляется много неактивных аккаунтов. Это увеличивает нагрузку на базу данных, замедляет админку, повышает риски безопасности и усложняет управление правами доступа. Автоматическое удаление таких пользователей — эффективный способ поддерживать базу в порядке без лишних расходов на плагины.
Диагностика: как определить неактивных пользователей
Для удаления нужна четкая метрика активности. В WordPress не всегда есть точные данные о последнем входе пользователя. Чаще всего используют два варианта:
- Дата последнего входа (last_login) — если вы заранее отслеживаете этот параметр, например, через плагин или кастомное решение.
- Дата регистрации — если последней активности не фиксируется, можно считать неактивными пользователей, зарегистрированных давно, но не проявлявших активности.
Для проверки, есть ли у вас данные о последнем входе, выполните SQL-запрос в базе данных через phpMyAdmin или WP-CLI:
SELECT user_login, meta_value FROM wp_usermeta WHERE meta_key = 'last_login' ORDER BY meta_value DESC LIMIT 10;Если данных нет, можно добавить код для фиксации даты логина (пример ниже).
Пошаговое решение: как автоматически удалять неактивных пользователей
1. Фиксируем дату последнего входа пользователя
Добавьте следующий код в functions.php вашей темы или в отдельный mu-плагин, чтобы записывать дату последнего входа:
function record_last_login($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'record_last_login', 10, 2);2. Создаем функцию для удаления неактивных пользователей
Этот код будет удалять пользователей, которые не заходили на сайт более 180 дней (6 месяцев):
function delete_inactive_users() {
global $wpdb;
$threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT user_id FROM $wpdb->usermeta
WHERE meta_key = 'last_login'
AND meta_value < %s",
$threshold
));
if (empty($user_ids)) {
return;
}
foreach ($user_ids as $user_id) {
wp_delete_user($user_id);
}
}3. Настраиваем автоматический запуск удаления через WP-Cron
Добавьте в functions.php код для планирования задачи удаления раз в сутки:
function schedule_inactive_user_deletion() {
if (!wp_next_scheduled('daily_inactive_user_cleanup')) {
wp_schedule_event(time(), 'daily', 'daily_inactive_user_cleanup');
}
}
add_action('wp', 'schedule_inactive_user_deletion');
add_action('daily_inactive_user_cleanup', 'delete_inactive_users');Как проверить, что удаление работает
- Проверьте наличие мета-ключа
last_loginу пользователей в базе данных через phpMyAdmin. - Вручную измените дату
last_loginу тестового пользователя на дату старше 180 дней и запустите функциюdelete_inactive_users()через WP-CLI или временно вызовите её из кода. - Убедитесь, что тестовый пользователь удален (проверьте через админку или запрос в базе).
- Проверьте через логи сервера или плагин для мониторинга Cron, что событие
daily_inactive_user_cleanupвыполняется.
Частые ошибки и как их исправить
- Отсутствие данных
last_login— без фиксации даты входа удаление не сработает. Решение: обязательно добавить хукwp_loginдля записи даты. - Функция не вызывается автоматически — проверьте, что WP-Cron активен и что на сайт заходят посетители, запускающие Cron. Для надежности можно настроить системный Cron на вызов
wp-cron.php. - Удаляются нужные пользователи — проверьте, что условие даты корректно, и не удаляете администраторов или важных пользователей. При необходимости добавьте исключения в код.
- Большая нагрузка при удалении — если база большая, удаляйте пользователей партиями, например, по 50 за один запуск.
Практические советы по безопасности и производительности
- Не удаляйте автоматически администраторов — добавьте проверку роли в функцию
delete_inactive_users():
foreach ($user_ids as $user_id) {
$user = get_userdata($user_id);
if (in_array('administrator', $user->roles)) {
continue;
}
wp_delete_user($user_id);
}- Для производительности ограничьте количество удаляемых пользователей за один запуск:
$user_ids = array_slice($user_ids, 0, 50); - Для надежности запускайте системный Cron вместо WP-Cron:
В crontab сервера добавьте:wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Сделайте резервную копию базы перед внедрением автоматического удаления.
Сравнение вариантов реализации автоматического удаления пользователей
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота настройки, интерфейс | Дополнительная нагрузка, зависимости | Clearfy Pro (частично решает) |
| Код с WP-Cron | Гибкость, нет лишних плагинов | Нужны базовые навыки, настройка Cron | Код из статьи |
| Внешний скрипт и системный Cron | Стабильность, не зависит от трафика | Дополнительные настройки сервера | Wget или curl вызов wp-cron.php |