Диагностика задачи: зачем удалять неактивных пользователей
Неактивные пользователи на сайте WordPress могут создавать нагрузку на базу данных и потенциально увеличивать риски безопасности. Особенно это актуально для сайтов с регистрацией пользователей, таких как интернет-магазины на WooCommerce, сообщества или порталы. Удаление пользователей, которые не заходили на сайт долгое время (например, более 6 месяцев), позволяет поддерживать базу данных в актуальном состоянии и уменьшить вероятность компрометации аккаунтов.
Пошаговое решение: настройка WP-Cron для удаления неактивных пользователей
1. Создаем функцию для удаления неактивных пользователей
Для начала напишем функцию, которая будет искать пользователей, неактивных более заданного периода, и удалять их.
function wptips_delete_inactive_users() {
$days_inactive = 180; // Порог неактивности в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
// Получаем пользователей, последний раз заходивших до даты порога
$args = array(
'meta_key' => 'last_login', // предполагается, что есть мета "last_login"
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => -1,
'exclude' => array(1), // исключаем администратора с ID 1
);
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
if (!empty($users_to_delete)) {
foreach ($users_to_delete as $user_id) {
wp_delete_user($user_id);
}
}
}Важно: WordPress по умолчанию не хранит дату последнего входа пользователя. Для этого нужно заранее организовать сохранение этого значения, например, с помощью хука wp_login:
function wptips_track_user_last_login($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'wptips_track_user_last_login', 10, 2);2. Планируем задачу WP-Cron
Добавим событие в WP-Cron, которое будет запускать функцию удаления раз в сутки.
function wptips_schedule_inactive_users_cleanup() {
if (!wp_next_scheduled('wptips_daily_inactive_user_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptips_daily_inactive_user_cleanup');
}
}
add_action('wp', 'wptips_schedule_inactive_users_cleanup');
add_action('wptips_daily_inactive_user_cleanup', 'wptips_delete_inactive_users');Как проверить, что решение работает
- Убедитесь, что в базе правильно сохраняется мета
last_loginдля пользователей (проверьте таблицуwp_usermetaили через админку). - Запустите функцию удаления вручную, вызвав
wptips_delete_inactive_users()из консоли WP-CLI или временно через админ-панель, чтобы проверить удаление. - Проверьте журнал ошибок сервера или лог плагина, чтобы убедиться в отсутствии ошибок.
- Через несколько дней убедитесь, что пользователи с датой последнего входа старше порога удаляются автоматически.
Частые ошибки и их исправление
- Отсутствие мета
last_login: функция ничего не удалит, если дата последнего входа не сохраняется. Решение — реализовать сохранение даты входа через хукwp_login. - Удаляется администратор: будьте внимательны с ID пользователей. В коде исключён пользователь с ID 1, но если у вас несколько админов, добавьте их в исключения.
- WP-Cron не запускается автоматически: стандартный WP-Cron работает только при посещениях сайта. Для надежности настройте системный cron на сервере для вызова
wp-cron.php. - Ошибка удаления пользователей: убедитесь, что у пользователя, под которым работает скрипт, есть права на удаление пользователей и подключена функция
wp_delete_user.
Практические советы по безопасности и производительности
- Перед удалением пользователей создавайте резервные копии базы или экспортируйте список удаляемых пользователей.
- Ограничьте удаление только теми пользователями, которые действительно неактивны и не имеют важных ролей.
- Для больших сайтов разбивайте процесс удаления на части, чтобы избежать превышения лимита времени выполнения скрипта.
- Для точного учета активности можно дополнительно отслеживать последние действия в пользовательских сессиях или действиях WooCommerce.
Сравнение вариантов реализации удаления неактивных пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + пользовательская функция | Полный контроль, нет зависимости от плагинов, можно адаптировать под любые требования | Необходима настройка отслеживания last_login, WP-Cron зависит от посещений сайта |
| Плагины для очистки пользователей (например, Inactive User Deleter) | Простота использования, готовые настройки и интерфейс | Могут быть избыточными, нагрузка при больших базах, меньше гибкости |
| Ручное удаление через SQL-запросы | Быстро и без нагрузки на сайт | Риск ошибок, отсутствие логики проверки ролей и безопасности |