Диагностика проблемы с неактивными пользователями WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается много пользователей, которые зарегистрировались, но давно не заходили или не совершали покупок. Это негативно влияет на производительность базы данных, замедляет рассылки и усложняет аналитику. Часто владельцы магазинов хотят автоматически удалять таких «заброшенных» пользователей, чтобы поддерживать чистоту данных.
Как определить неактивного пользователя?
Обычно под неактивностью понимают пользователя, который:
- Не заходил в аккаунт больше заданного периода (например, 6 месяцев);
- Не делал заказов за этот же период;
- Не оставлял других действий, например комментариев или отзывов.
В базе WordPress время последнего логина обычно не хранится по умолчанию, поэтому его нужно фиксировать самостоятельно.
Пошаговое решение: автоматическое удаление неактивных пользователей в WooCommerce
1. Запись времени последнего входа пользователя
Добавим код, который при каждом успешном входе пользователя сохраняет мета-данные с датой и временем:
add_action('wp_login', 'save_last_login_time', 10, 2);
function save_last_login_time($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}2. Написание функции очистки неактивных пользователей
Создадим функцию, которая будет искать пользователей, у которых не было логинов и заказов дольше заданного времени (например, 180 дней), и удалять их.
function delete_inactive_woocommerce_users() {
global $wpdb;
$threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
// Получаем ID пользователей WooCommerce
$user_ids = get_users(array(
'role' => 'customer',
'fields' => 'ID'
));
foreach ($user_ids as $user_id) {
$last_login = get_user_meta($user_id, 'last_login', true);
// Проверяем последний заказ пользователя
$last_order_date = $wpdb->get_var($wpdb->prepare(
"SELECT MAX(post_date) FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed','wc-processing') AND post_author = %d",
$user_id
));
// Если нет даты последнего логина, считаем пользователя неактивным
if (!$last_login) {
$last_login = '1970-01-01 00:00:00';
}
if (!$last_order_date) {
$last_order_date = '1970-01-01 00:00:00';
}
// Проверяем, старше ли даты лимита
if ($last_login < $threshold && $last_order_date < $threshold) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}3. Запуск удаления по расписанию через WP-Cron
Добавим еженедельное задание, чтобы запускать функцию автоматически:
add_action('delete_inactive_users_cron', 'delete_inactive_woocommerce_users');
function setup_delete_inactive_users_cron() {
if (!wp_next_scheduled('delete_inactive_users_cron')) {
wp_schedule_event(time(), 'weekly', 'delete_inactive_users_cron');
}
}
add_action('wp', 'setup_delete_inactive_users_cron');Проверка результата после внедрения
- Войдите под тестовым пользователем и убедитесь, что мета last_login добавилась в профиль пользователя (через phpMyAdmin или плагин для управления пользователями).
- Создайте тестового пользователя без логинов и заказов старше 180 дней (можно вручную изменить дату last_login в базе).
- Запустите функцию
delete_inactive_woocommerce_users()вручную (через временный вызов в functions.php) и проверьте, удалился ли пользователь. - Проверьте Cron-задания с помощью плагина WP Crontrol, чтобы убедиться, что задача добавлена и срабатывает.
Частые ошибки и как их исправить
- last_login не сохраняется: Убедитесь, что хук
wp_loginне переопределяется другими плагинами, и что код добавлен в functions.php активной темы или в плагин. - Пользователи не удаляются: Проверьте, что роль пользователя точно
customer, и что даты корректно сравниваются в форматеY-m-d H:i:s. - Удаляются нужные пользователи: Проверьте логику сравнения дат и настройте порог (180 дней) под свои нужды.
- Ошибка с wp_delete_user: Убедитесь, что подключен файл
wp-admin/includes/user.phpперед вызовом. - WP-Cron не срабатывает: Настройте вызов cron вручную или через внешние сервисы, если на сервере нет реального cron.
Практические советы по безопасности и производительности
- Резервное копирование: Перед массовым удалением пользователей обязательно сделайте резервную копию базы данных.
- Логирование удалений: Добавьте ведение логов, чтобы отслеживать, каких пользователей и когда удалили, например, через error_log или отдельный файл.
- Оптимизация запросов: Используйте готовые функции WordPress для выборки пользователей, избегайте лишних SQL-запросов.
- Обработка ошибок: Добавьте проверку успешности
wp_delete_userи уведомления администратору при неудаче.
Сравнение способов удаления неактивных пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоемко при большом числе пользователей |
| Плагин для очистки пользователей | Удобство, настройки | Дополнительная нагрузка, возможные конфликты |
| Код с WP-Cron (описанный в статье) | Автоматизация, гибкость | Нужно писать и тестировать код, возможны ошибки при некорректной логике |