Диагностика проблемы: почему важно удалять неактивных пользователей
В интернет-магазинах на WooCommerce база пользователей со временем может разрастаться за счёт неактивных аккаунтов. Это негативно влияет на производительность сайта, увеличивает нагрузку на базу данных и усложняет администрирование. Часто под «неактивными» понимают пользователей, которые не совершали покупки и не заходили на сайт в течение длительного времени, например, 6-12 месяцев.
Определение критериев неактивности пользователей в WooCommerce
Для точечного удаления пользователей определимся с критериями неактивности. Обычно берут такие параметры:
- Дата последнего входа (last_login) более 6 месяцев назад или отсутствует;
- Отсутствие заказов (orders_count = 0);
- Роль пользователя — «customer» (чтобы не удалять администраторов и редакторов).
WooCommerce не сохраняет дату последнего входа по умолчанию, поэтому её нужно добавить самостоятельно.
Добавление мета-поля с датой последнего входа пользователя
Добавим в functions.php следующий код, который при каждом входе пользователя будет обновлять мета-поле last_login:
add_action('wp_login', 'update_last_login_meta', 10, 2);
function update_last_login_meta($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('timestamp'));
}
Этот код фиксирует время входа в формате timestamp WordPress.
Пошаговое удаление неактивных пользователей
Теперь можно написать функцию, которая выберет и удалит пользователей с ролью customer, у которых:
- нет заказов в WooCommerce;
- последний вход был более 6 месяцев назад (или отсутствует).
Пример кода для удаления таких пользователей:
function delete_inactive_customers() {
$six_months_ago = strtotime('-6 months');
// WP_User_Query для пользователей с ролью customer
$args = [
'role' => 'customer',
'meta_query' => [
'relation' => 'OR',
[
'key' => 'last_login',
'value' => $six_months_ago,
'compare' => '<',
'type' => 'NUMERIC',
],
[
'key' => 'last_login',
'compare' => 'NOT EXISTS',
],
],
'fields' => 'ID',
'number' => -1,
];
$users = get_users($args);
foreach ($users as $user_id) {
// Проверяем, есть ли у пользователя заказы
$orders = wc_get_orders([
'customer_id' => $user_id,
'limit' => 1,
'return' => 'ids',
]);
if (empty($orders)) {
wp_delete_user($user_id);
}
}
}
// Можно запускать вручную или через WP-CLI
// delete_inactive_customers();
Как запустить удаление безопасно
Рекомендуется запускать функцию из консоли WP-CLI или через временный admin-скрипт, чтобы избежать таймаута и случайного удаления:
- Создайте файл
delete-inactive-customers.phpв корне темы с вызовом функции; - Откройте этот файл через браузер, убедитесь, что удаления прошли;
- Удалите файл после выполнения.
Проверка результата удаления
Чтобы проверить, что функция отработала корректно:
- Посмотрите в админке WordPress → Пользователи, количество клиентов должно уменьшиться;
- В базе данных в таблице
wp_usermetaне должно остаться пользователей с рольюcustomerбез заказов и с устаревшимlast_login; - Для дополнительной проверки можно вывести список удаляемых ID перед удалением через
error_logили на экран.
Частые ошибки и как их избежать
- Отсутствие мета-поля last_login: без этого поля нельзя определить активность, поэтому сначала убедитесь, что код обновления даты входа работает.
- Удаление пользователей с заказами: проверьте, что запрос к
wc_get_ordersкорректный и возвращает заказы, иначе есть риск удалить активных клиентов. - Таймаут при большом количестве пользователей: выполняйте скрипт по частям или через WP-CLI.
- Удаление администраторов: убедитесь, что фильтрация по роли работает правильно.
Практические советы по безопасности и производительности
- Перед удалением сделайте полный бэкап базы данных.
- Выполняйте удаление в часы минимальной нагрузки на сайт.
- Периодически очищайте базу от неактивных пользователей, чтобы поддерживать скорость запросов.
- Используйте WP-CLI для пакетной обработки, чтобы избежать проблем с ограничением времени выполнения PHP.
Сравнение методов удаления неактивных пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Удаление через плагины (например, User Cleanup) | Удобный интерфейс, настройки без кода | Дополнительная нагрузка, возможные конфликты | Использовать для небольших сайтов |
| Кастомный код (пример выше) | Гибкость, контроль, без лишних плагинов | Требует навыков, риск ошибок без тестов | Использовать с бэкапом и тестированием |
| Удаление вручную из базы данных | Максимальный контроль | Высокий риск, сложность | Только для опытных и с бэкапом |