Диагностика: почему нужно удалять неактивных пользователей
Неактивные пользователи в базе WordPress могут создавать нагрузку на сервер и увеличивать размер базы данных. Особенно это критично для сайтов с регистрацией и магазином на WooCommerce, когда у вас сотни или тысячи пользователей, которые давно не заходили и не совершали действия.
Чтобы проверить количество неактивных пользователей, используйте SQL-запрос в phpMyAdmin или через WP-CLI:
SELECT ID, user_login, user_registered, last_login FROM wp_users LEFT JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id AND wp_usermeta.meta_key = 'last_login' WHERE last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR) OR last_login IS NULL;Обратите внимание, что по умолчанию WordPress не сохраняет время последнего входа, поэтому для работы с last_login нужно предварительно внедрить этот механизм (например, через плагин или добавить код).
Как отслеживать последний вход пользователя
Добавим в functions.php код для сохранения времени последнего входа:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);После этого в usermeta будет храниться мета-ключ last_login с датой последнего входа пользователя.
Пошаговое решение: удаление неактивных пользователей
Шаг 1. Сделайте резервную копию базы данных.
Шаг 2. Добавьте код для удаления пользователей, которые не заходили более года:
function delete_inactive_users($days = 365) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'last_login' AND meta_value < %s",
$date_limit
));
if (empty($user_ids)) {
return 0;
}
require_once(ABSPATH . 'wp-admin/includes/user.php');
foreach ($user_ids as $user_id) {
wp_delete_user($user_id);
}
return count($user_ids);
}
// Запуск удаления
$deleted = delete_inactive_users(365);
echo "Удалено пользователей: $deleted";Этот код берет user_id пользователей с последним логином старше 365 дней и удаляет их через стандартную функцию wp_delete_user(), которая корректно очищает данные.
Проверка результата после внедрения
- Запустите функцию удаления и убедитесь, что количество удаленных пользователей соответствует ожиданиям.
- Проверьте базу данных, выполнив SQL-запрос для поиска пользователей с
last_loginстарше года — их не должно остаться. - Проверьте работу сайта, особенно если есть зависимости от пользователей (например, заказы WooCommerce).
Частые ошибки и как их исправить
- Отсутствует мета-ключ
last_login: без этого кода вы не сможете отфильтровать пользователей по дате последнего входа. Добавьте код отслеживания последнего входа. - Удаление пользователей с заказами WooCommerce: если удалять пользователей, у которых есть заказы, это может привести к потере связей. Проверьте перед удалением:
function can_delete_user($user_id) {
$orders = wc_get_orders(array('customer' => $user_id, 'limit' => 1));
return empty($orders);
}И фильтруйте список пользователей по этому условию.
- Удаление происходит без резервной копии: всегда делайте бэкап перед массовыми удалениями.
- Неверный формат даты: убедитесь, что
current_time('mysql')и сравнения в SQL совпадают по формату.
Практические советы по безопасности и производительности
- Используйте WP-Cron для регулярного запуска удаления неактивных пользователей, например, раз в месяц.
- Обязательно проверяйте наличие заказов и других зависимостей перед удалением.
- Для сайтов с большим количеством пользователей используйте пакетную обработку, чтобы не перегружать сервер.
- Записывайте логи удаления для контроля.
- Используйте плагин Clearfy (https://wpshop.ru/plugins/clearfy?utm_source=wplog.ru&utm_medium=article&utm_campaign=kak-udalit-po-umerennomu-variantu-neaktivnye-polzovateli-v-wordpress) для оптимизации базы и удаления мусорных данных.
Сравнение вариантов удаления неактивных пользователей
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручной SQL-запрос | Быстро и напрямую | Риск удаления без проверки зависимостей | Использовать только с резервной копией |
| Код на PHP с wp_delete_user() | Корректное удаление с очисткой данных | Требует программирования | Оптимально для автоматизации |
| Плагины очистки (Clearfy и др.) | Удобно, готовые функции | Могут быть платными | Подходит для регулярного обслуживания |