Диагностика проблемы неактивных пользователей
В больших WordPress-сайтах с регистрацией пользователей часто накапливаются аккаунты, которые давно не используются. Они могут создавать нагрузку на базу данных, увеличивать вероятность взлома и затруднять управление пользователями. Важно своевременно выявлять и удалять таких пользователей.
Как определить неактивных пользователей
В WordPress нет штатного поля для отслеживания даты последнего входа пользователя. Чтобы решить эту задачу, нужно:
- Добавить запись последнего логина через хук
wp_login. - Сохранять дату последнего входа в мета-поле пользователя.
Добавляем отслеживание последнего входа
function wplancer_update_last_login( $login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time('mysql') );
}
add_action( 'wp_login', 'wplancer_update_last_login', 10, 2 );Этот код сохраняет дату и время последнего входа пользователя в формате MySQL datetime.
Шаги автоматического удаления неактивных пользователей
Создадим функцию, которая будет искать пользователей, не заходивших на сайт более N дней, и удалять их. Например, удалять аккаунты без входа 180 дней.
function wplancer_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',
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100,
);
$inactive_users = get_users( $args );
foreach ( $inactive_users as $user_id ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
}
}Для автоматизации запуска функции добавьте cron-задачу:
if ( ! wp_next_scheduled( 'wplancer_daily_inactive_user_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wplancer_daily_inactive_user_cleanup' );
}
add_action( 'wplancer_daily_inactive_user_cleanup', 'wplancer_delete_inactive_users' );Как проверить, что удаление работает
- В базе данных в таблице
wp_usermetaпроверьте наличие мета-ключаlast_loginу пользователей. - Создайте тестового пользователя, не заходите под ним 180 дней (или измените дату
last_loginвручную в базе), запустите функцию вручную через WP-CLI или временно вызовите ее в коде. - Проверьте, что пользователь удалён из админки и базы.
Частые ошибки и их исправление
- Отсутствие записи даты последнего входа: Функция удаления ищет
last_login. Если этот мета-ключ не создаётся, удаление не будет работать. Убедитесь, что хукwp_loginкорректно добавлен. - Удаление администраторов: В текущем коде не исключены роли, поэтому могут удаляться админы. Добавьте проверку роли, чтобы защитить важных пользователей.
- Проблемы с производительностью при большом количестве пользователей: Используйте пагинацию или ограничьте количество удаляемых пользователей за один запуск.
Расширение функции с проверкой роли и логированием
function wplancer_delete_inactive_users_safe() {
$days_inactive = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
$args = array(
'meta_key' => 'last_login',
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => array('ID', 'user_login', 'roles'),
'number' => 50,
);
$inactive_users = get_users( $args );
foreach ( $inactive_users as $user ) {
if ( in_array( 'administrator', $user->roles ) ) {
continue; // не удаляем админов
}
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user->ID );
error_log( 'Deleted inactive user: ' . $user->user_login );
}
}Практические советы по безопасности и производительности
- Перед удалением делайте резервную копию базы.
- Добавьте уведомление администратору о количестве удалённых пользователей.
- Учитывайте, что пользователи без входа могут быть новыми, но зарегистрированными. Возможно, лучше сначала отправлять предупреждения.
- Если у вас WooCommerce, учитывайте связанные данные, чтобы не потерять заказы.
Сравнение подходов для удаления неактивных пользователей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручной аудит и удаление | Админ проверяет дату последнего входа и удаляет пользователей вручную | Контроль, нет риска ошибочного удаления | Трудозатратно, не масштабируется |
| Автоматический скрипт с wp_login | Сохраняет дату последнего входа, удаляет по крону | Автоматизация, гибкость | Требует доработки, возможны ошибки при настройке |
| Плагины (например, Inactive User Deleter) | Готовое решение с интерфейсом | Простота настройки | Могут грузить сайт, ограниченные настройки |