WooCommerce: автоматическое удаление неактивных клиентов по истории заказов

Диагностика проблемы: зачем и когда нужно удалять неактивных клиентов в WooCommerce

В интернет-магазинах на WooCommerce со временем накапливается большое количество пользователей, которые зарегистрировались, но не сделали ни одного заказа или перестали совершать покупки давно. Это влияет на производительность базы данных, рассылки и аналитику. Автоматическое удаление таких неактивных клиентов помогает поддерживать чистоту базы и ускорять работу сайта.

Ключевой критерий — отсутствие заказов за заданный период времени. Часто бывает, что пользователи регистрируются, но не покупают, либо давно не активны и не планируют возвращаться.

Как определить неактивного клиента по истории заказов

Неактивный клиент — это пользователь, у которого нет заказов со статусами processing, completed или аналогичными, сделанных в последние N месяцев. В нашем примере возьмём 6 месяцев.

Для диагностики можно использовать SQL-запрос, чтобы понять, есть ли у пользователя заказы в нужный период:

SELECT COUNT(*) FROM wp_posts AS orders
JOIN wp_postmeta AS meta ON orders.ID = meta.post_id
WHERE orders.post_type = 'shop_order'
AND orders.post_status IN ('wc-processing', 'wc-completed')
AND meta.meta_key = '_customer_user'
AND meta.meta_value = USER_ID
AND orders.post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH);

Замените USER_ID на ID пользователя. Если результат 0, значит заказов нет.

Пошаговое решение: скрипт для автоматического удаления неактивных клиентов

Реализуем функцию на PHP, которую можно запускать через WP-Cron или вручную для удаления пользователей без заказов за последние 6 месяцев.

function wc_delete_inactive_customers( $months = 6 ) {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$months} months"));

    // Получаем ID пользователей, у которых нет заказов за последние $months
    $user_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT u.ID FROM {$wpdb->users} u
         LEFT JOIN (
           SELECT DISTINCT meta_value AS user_id FROM {$wpdb->postmeta} pm
           JOIN {$wpdb->posts} p ON pm.post_id = p.ID
           WHERE pm.meta_key = '_customer_user'
           AND p.post_type = 'shop_order'
           AND p.post_status IN ('wc-processing', 'wc-completed')
           AND p.post_date > %s
         ) orders ON u.ID = orders.user_id
         WHERE orders.user_id IS NULL
         AND u.user_registered < %s
         AND u.ID != 1", // исключаем администратора с ID=1
         $date_limit,
         $date_limit
        )
    );

    if ( empty( $user_ids ) ) {
        return 'Неактивных пользователей для удаления не найдено';
    }

    foreach ( $user_ids as $user_id ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user( $user_id );
    }

    return sprintf('Удалено %d неактивных пользователей.', count( $user_ids ));
}

Для запуска вручную:

add_action('admin_init', function() {
    if ( current_user_can('manage_options') && isset($_GET['delete_inactive']) && $_GET['delete_inactive'] == '1' ) {
        $result = wc_delete_inactive_customers(6);
        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
    }
});

Зайдите в админку и добавьте в адресную строку ?delete_inactive=1 для запуска удаления.

Проверка результата после внедрения

  • Проверьте количество пользователей в разделе «Пользователи» до и после запуска скрипта.
  • Запустите SQL-запрос из раздела диагностики для случайных пользователей, чтобы убедиться, что отсутствуют заказы и что такие пользователи удалены.
  • Проверьте логи ошибок и убедитесь, что не возникло сбоев при удалении.

Частые ошибки и как их исправить

  • Удаляются администраторы или нужные пользователи. Решение: в скрипте исключён пользователь с ID=1, но если у вас несколько админов — добавьте дополнительные проверки по ролям через get_userdata() и условие user_can( $user_id, 'administrator' ).
  • Пользователи с заказами удаляются. Проверьте правильность статусов заказов в запросе — WooCommerce может использовать кастомные статусы. Убедитесь, что статусы указаны верно.
  • Большая нагрузка на базу при большом числе пользователей. Разбейте удаление на пакеты по 100 пользователей, вызывая функцию циклично.
  • Скрипт не запускается через WP-Cron. Убедитесь, что WP-Cron включён и настроен, либо используйте системный cron для запуска WP-Cron.

Практические советы по безопасности и производительности

  • Перед удалением сделайте резервную копию базы данных.
  • Добавьте логирование удалённых пользователей в отдельный файл для аудита.
  • Задавайте период удаления (например, 6 месяцев) с запасом — не удаляйте слишком свежих пользователей.
  • Используйте WP-CLI для пакетного запуска и мониторинга процессов по расписанию.
  • Если база большая — оптимизируйте SQL-запрос, индексируйте колонки post_date и meta_key.

Сравнение вариантов автоматического удаления неактивных клиентов

МетодПлюсыМинусыРекомендации
Кастомный PHP-скрипт (как в статье)Полный контроль, гибкость, без сторонних плагиновТребует навыков, возможны ошибки при сложных условияхИспользовать для уникальных требований и при наличии разработчика
Плагин для очистки пользователейПростота использования, готовые функцииМогут быть ресурсоёмкими, ограничены в настройкахПодходит для небольших сайтов, проверять совместимость с WooCommerce
WP-CLI команды для массового удаленияБыстро и эффективно для больших базНе подходит для новичков, требует SSH доступаИспользовать на больших проектах с доступом к серверу
WooCommerce: как автоматически удалять товары из магазина по статусу заказов
10.05.2026
Автоматическое удаление непроданных товаров WooCommerce по времени
26.05.2026
Как создать собственный шорткод в WordPress
10.11.2025
WooCommerce: автоматическое удаление неактивных клиентов по истории заказов
05.08.2026
WooCommerce: как автоматически изменять статус заказа по условиям
29.05.2026