Почему важно удалять неактивных пользователей в WooCommerce
Неактивные пользователи, которые долго не заходили в магазин или не совершали покупок, занимают место в базе данных, что может замедлять работу сайта и усложнять управление клиентской базой. Автоматическое удаление таких пользователей помогает поддерживать базу в актуальном состоянии и снижать нагрузку на сервер.
Диагностика проблемы: как определить неактивных пользователей
Для начала нужно понять, кто считается «неактивным». Обычно это пользователи, которые не авторизовались и не делали заказов за определённый период (например, 6 месяцев). Чтобы проверить, есть ли такие пользователи, выполните SQL-запрос через phpMyAdmin или WP-CLI:
SELECT ID, user_login, user_email, user_registered FROM wp_users WHERE ID NOT IN (SELECT user_id FROM wp_wc_customer_lookup) OR user_registered < NOW() - INTERVAL 6 MONTH;Этот запрос показывает пользователей, у которых нет заказов, или которые зарегистрированы более 6 месяцев назад. Если таких много, стоит автоматизировать удаление.
Пошаговое решение: скрипт для автоматического удаления неактивных пользователей
Добавьте следующий код в файл functions.php вашей дочерней темы или создайте отдельный плагин. Скрипт удалит пользователей, которые не заходили и не делали заказов более 180 дней.
function wc_auto_delete_inactive_users() {
$days_inactive = 180; // Период неактивности в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
// Получаем ID пользователей с заказами
global $wpdb;
$users_with_orders = $wpdb->get_col("SELECT DISTINCT user_id FROM {$wpdb->prefix}wc_orders WHERE user_id > 0");
// Получаем пользователей без заказов и неактивных
$args = array(
'meta_query' => array(),
'date_query' => array(
'before' => $date_threshold
),
'exclude' => $users_with_orders,
'fields' => 'ID',
'number' => -1
);
$user_query = new WP_User_Query($args);
$inactive_users = $user_query->get_results();
if (!empty($inactive_users)) {
foreach ($inactive_users as $user_id) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}
// Запускаем функцию раз в сутки
if (!wp_next_scheduled('wc_auto_delete_inactive_users_hook')) {
wp_schedule_event(time(), 'daily', 'wc_auto_delete_inactive_users_hook');
}
add_action('wc_auto_delete_inactive_users_hook', 'wc_auto_delete_inactive_users');Объяснение:
- Определяем дату, до которой считаем пользователей неактивными.
- Получаем всех пользователей с заказами, чтобы их не удалять.
- Получаем пользователей без заказов и зарегистрированных до даты порога.
- Удаляем каждого такого пользователя через
wp_delete_user(). - Запускаем этот процесс раз в сутки с помощью
wp_schedule_event.
Проверка результата после внедрения
Для проверки корректности работы скрипта:
- Вручную создайте тестового пользователя с датой регистрации более 180 дней назад и без заказов.
- Запустите планировщик задач вручную:
do_action('wc_auto_delete_inactive_users_hook');В админке WordPress убедитесь, что пользователь удалён.
- Проверьте логи сервера и WordPress на ошибки.
- Убедитесь, что пользователи с заказами не удалились.
Частые ошибки и как их исправить
- Пользователи с заказами удаляются: возможно, запрос к таблице заказов неверен. Проверьте название таблицы. В WooCommerce с версии 3.0 заказы в
wp_postsс типомshop_order. Лучше заменить запрос на:
$users_with_orders = $wpdb->get_col(
"SELECT DISTINCT post_author FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing')"
);- Удаление не происходит: убедитесь, что планировщик WP-Cron работает, либо вызывайте функцию вручную для теста.
- Удаление вызывает ошибки прав доступа: функция
wp_delete_user()должна вызываться с правами администратора, убедитесь, что код запускается в нужном контексте.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед массовым удалением пользователей.
- Добавьте логирование удалённых пользователей для аудита.
- Для больших баз данных используйте пакетное удаление по 50-100 пользователей за раз, чтобы избежать таймаутов.
- Используйте транзакции или откаты, если возможно (через плагин или дополнительные SQL-запросы).
- Запускайте скрипт в низкую нагрузку сайта (например, ночью).
Сравнение способов автоматического удаления пользователей WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота настройки, интерфейс | Часто платные функции, нагрузка | Использовать для небольших сайтов |
| Собственный код с WP-Cron | Полный контроль, бесплатность | Требует навыков, тестирования | Оптимизация и логирование обязательны |
| Внешний системный cron + WP-CLI | Надежность, минимальная нагрузка | Требуется доступ к серверу | Лучше для больших проектов |