Диагностика проблемы: зачем удалять неактивных пользователей в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается большое количество зарегистрированных пользователей, которые не совершают покупок или давно не заходили. Это увеличивает нагрузку на базу данных, замедляет работу сайта и затрудняет аналитику. Автоматическое удаление неактивных пользователей позволяет поддерживать базу в чистоте и улучшать производительность.
Как определить неактивных пользователей в WooCommerce
Под неактивными пользователями обычно понимаются те, кто:
- Не заходил на сайт более N дней (например, 180 дней)
- Не совершал заказов за этот период
- Не имеет открытых подписок или активных ролей
WooCommerce сохраняет дату последнего входа и заказы в базе данных, что позволяет отфильтровать таких пользователей.
Пошаговое решение: автоматическое удаление неактивных пользователей с WP-Cron
Ниже пример кода, который автоматически удаляет пользователей, неактивных более 180 дней и не имеющих заказов за это время.
1. Создаем функцию удаления неактивных пользователей
function wc_delete_inactive_users() {
$days_inactive = 180; // Порог неактивности
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
global $wpdb;
// Получаем ID пользователей, у которых последний вход старше порога
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->prefix}usermeta um ON u.ID = um.user_id AND um.meta_key = 'last_login'
WHERE (um.meta_value IS NULL OR um.meta_value < %s)",
$date_threshold
));
if (empty($user_ids)) {
return; // Нет подходящих пользователей
}
foreach ($user_ids as $user_id) {
// Проверяем, есть ли у пользователя заказы
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => 1
));
if (empty($orders)) {
// Удаляем пользователя
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
}
}2. Добавляем хук WP-Cron для регулярного запуска
function wc_schedule_inactive_users_deletion() {
if (!wp_next_scheduled('wc_delete_inactive_users_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_users_event');
}
}
add_action('wp', 'wc_schedule_inactive_users_deletion');
add_action('wc_delete_inactive_users_event', 'wc_delete_inactive_users');3. Записываем дату последнего входа пользователя
WooCommerce по умолчанию не сохраняет дату последнего входа. Нужно добавить:
function wc_save_last_login($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'wc_save_last_login', 10, 2);Проверка результата после внедрения
- Выполнить ручной запуск функции
wc_delete_inactive_users()через консоль WP-CLI или временно добавить вызов вfunctions.phpи проверить удаление пользователей. - Просмотреть список пользователей в админке до и после запуска, убедиться, что удаляются только те, у кого нет заказов и дата последнего входа превышает порог.
- Проверить логи сервера и базы данных на ошибки.
Частые ошибки и как их исправить
- Проблема: Пользователи не удаляются, хотя должны.
Причина: Мета полеlast_loginне сохраняется или сохраняется в неверном формате.
Решение: Проверьте, что хукwp_loginс функциейwc_save_last_loginподключен и работает. Используйтеerror_logдля отладки. - Проблема: Ошибка при удалении пользователя.
Причина: Функцияwp_delete_userвызывается без подключения необходимых файлов.
Решение: Добавьтеrequire_once ABSPATH . 'wp-admin/includes/user.php';перед вызовом. - Проблема: WP-Cron не запускается.
Решение: Проверьте, что на сайте посещения или внешние триггеры выполняют WP-Cron. При необходимости настройте системный cron для wp-cron.php.
Практические советы по безопасности и производительности
- Безопасность: Перед удалением пользователей сделайте резервную копию базы данных, чтобы избежать потери данных.
- Производительность: Если база пользователей большая, делайте выборку и удаление партиями, чтобы избежать таймаутов.
- Логирование: Добавьте логирование удаляемых пользователей для аудита:
function wc_delete_inactive_users() {
$days_inactive = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
global $wpdb;
$user_ids = $wpdb->get_col($wpdb->prepare("SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->prefix}usermeta um ON u.ID = um.user_id AND um.meta_key = 'last_login'
WHERE (um.meta_value IS NULL OR um.meta_value < %s)", $date_threshold));
if (empty($user_ids)) {
return;
}
foreach ($user_ids as $user_id) {
$orders = wc_get_orders(array('customer_id' => $user_id, 'limit' => 1));
if (empty($orders)) {
require_once ABSPATH . 'wp-admin/includes/user.php';
if (wp_delete_user($user_id)) {
error_log("WooCommerce: User $user_id deleted due to inactivity");
}
}
}
}Сравнение способов реализации
| Метод | Плюсы | Минусы | Примечание |
|---|---|---|---|
| Ручное удаление через SQL | Быстрое выполнение, без нагрузки на WP | Опасно, можно удалить нужных пользователей | Требует знаний SQL и создания сложных запросов |
| Автоматизация на WP-Cron с PHP | Безопасно, можно добавить логику проверки | Зависит от работы WP-Cron, может быть медленнее | Рекомендуется для большинства сайтов |
| Плагины очистки пользователей | Удобный интерфейс, часто с дополнительными настройками | Может влиять на производительность, лишние зависимости | Использовать если нужна расширенная функциональность |