Диагностика проблемы с неактивными клиентами в WooCommerce
С течением времени в базе WooCommerce накапливаются клиенты, которые не совершают покупок или не проявляют активности более длительный период. Это увеличивает размер базы данных, замедляет работу запросов и затрудняет аналитику. Чтобы выявить таких клиентов, нужно определить критерии неактивности.
Обычно под неактивным клиентом понимают пользователя, который:
- Не совершал заказов за последние N месяцев (обычно 6-12);
- Не заходил на сайт в этот период (если есть запись даты последнего входа);
- Не взаимодействовал с сайтом (комментарии, отзывы и др.) - опционально.
В WooCommerce информация о клиентах хранится в таблице wp_users и wp_usermeta, а заказы — в wp_posts с типом shop_order. Для выявления неактивных клиентов нужно сопоставить пользователей и заказы.
Пошаговое решение: автоматическое удаление неактивных клиентов через WP-Cron
1. Определяем период неактивности
Для примера возьмём 12 месяцев (365 дней). Клиенты, не совершавшие заказов за этот период, подлежат удалению.
2. Создаём функцию для поиска и удаления неактивных пользователей
function wc_delete_inactive_customers() {
global $wpdb;
$days_inactive = 365;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
// Получаем ID пользователей, которые были клиентами WooCommerce
$customer_role = 'customer';
// Получаем всех пользователей с ролью customer
$customers = get_users(array('role' => $customer_role, 'fields' => array('ID')));
if (empty($customers)) return;
$inactive_customers = array();
foreach ($customers as $customer) {
$user_id = $customer->ID;
// Проверяем заказы пользователя с датой после порога
$order_exists = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND post_author = %d AND post_date > %s LIMIT 1",
$user_id, $date_threshold
));
if (!$order_exists) {
$inactive_customers[] = $user_id;
}
}
// Удаляем пользователей без заказов за указанный период
foreach ($inactive_customers as $user_id) {
wp_delete_user($user_id);
}
// Логируем результат
error_log('WooCommerce: удалено неактивных клиентов: ' . count($inactive_customers));
}
3. Планируем задачу в WP-Cron для регулярного запуска
add_action('wc_delete_inactive_customers_event', 'wc_delete_inactive_customers');
function wc_schedule_inactive_customers_deletion() {
if (!wp_next_scheduled('wc_delete_inactive_customers_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_event');
}
}
add_action('wp', 'wc_schedule_inactive_customers_deletion');
4. Как отключить задачу, если потребуется
function wc_unschedule_inactive_customers_deletion() {
$timestamp = wp_next_scheduled('wc_delete_inactive_customers_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_delete_inactive_customers_event');
}
}
Проверка результата после внедрения
- Проверить лог ошибок PHP на наличие записи об удалённых пользователях (
error_logв функции). - Вручную проверить наличие пользователей с ролью
customer, которые не совершали заказов более 12 месяцев - они должны отсутствовать. - Запустить функцию вручную через консоль WP-CLI:
wp eval 'wc_delete_inactive_customers();'и проверить результат. - Убедиться, что заказы пользователей не удаляются вместе с пользователями (удаление wp_delete_user не затрагивает заказы, т.к. автор заказа — ID пользователя, но заказы остаются в базе).
Частые ошибки и как их исправить
- Удаляются не те пользователи: Проверьте правильность роли в
get_users(). Иногда клиенты имеют другую роль или кастомные роли. - Удаление пользователей не происходит: Убедитесь, что WP-Cron работает. Для теста вызовите функцию вручную.
- Удаляются пользователи с недавними заказами: Проверьте условие даты и статус заказов. Нужно учитывать статусы
wc-completedиwc-processing. - Пользователи не удаляются из-за прав: Скрипт должен запускаться с правами администратора (через WP-Cron это обычно так).
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте резервную копию базы данных.
- Если база большая, лучше разбивать удаление на партии (например, по 50 пользователей за раз) во избежание таймаутов.
- Логируйте действия в отдельный файл, чтобы не захламлять основной error_log.
- Для точного учета активности можно расширить критерии — например, использовать дату последнего входа пользователя из мета (
last_login), если она есть. - Возможна интеграция с плагином Clearfy Pro из WPShop для очистки базы и оптимизации после массового удаления.
Сравнение подходов к удалению неактивных клиентов
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Ручное удаление через админку | Удаление пользователей по фильтрам вручную | Простота, безопасность | Долго, неудобно при большом количестве |
| Автоматизация WP-Cron + кастомная функция | Регулярный автоматический поиск и удаление | Экономия времени, регулярность | Нужна правильная настройка, риски при ошибках |
| Использование плагина | Готовые решения для очистки пользователей | Удобство, дополнительные опции | Зависимость от плагина, возможные конфликты |