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

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

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

Основная задача — автоматически определять клиентов, у которых не было активных заказов за определённый период (например, 1 год), и удалять их из базы.

Как проверить, есть ли неактивные пользователи

В базе данных WooCommerce клиенты — это пользователи с ролью customer. Чтобы проверить наличие неактивных клиентов, можно выполнить SQL-запрос к базе:

SELECT u.ID, u.user_login, MAX(p.post_date) AS last_order_date
FROM wp_users u
LEFT JOIN wp_posts p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing')
WHERE u.ID IN (
    SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%customer%'
)
GROUP BY u.ID
HAVING last_order_date IS NULL OR last_order_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);

Этот запрос покажет список пользователей с ролью customer, у которых нет заказов или последний заказ старше 1 года.

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

1. Создаём функцию для поиска и удаления пользователей

Вставьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wpkpi_delete_inactive_customers() {
    $args = array(
        'role'       => 'customer',
        'fields'     => ['ID'],
        'number'     => -1,
    );
    $users = get_users($args);
    $threshold_date = strtotime('-1 year');

    foreach ($users as $user) {
        $last_order = wc_get_customer_last_order($user->ID);
        $last_order_date = $last_order ? strtotime($last_order->get_date_created()) : 0;

        if ($last_order_date === 0 || $last_order_date < $threshold_date) {
            // Удаляем пользователя
            wp_delete_user($user->ID);
        }
    }
}

2. Запускаем функцию по расписанию через WP-Cron

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

if (! wp_next_scheduled('wpkpi_delete_inactive_customers_event')) {
    wp_schedule_event(time(), 'monthly', 'wpkpi_delete_inactive_customers_event');
}
add_action('wpkpi_delete_inactive_customers_event', 'wpkpi_delete_inactive_customers');

3. Проверка работы

Для тестирования вы можете вызвать функцию вручную в консоли WP-CLI или добавить временный вызов:

// Временно вызвать функцию вручную
add_action('init', function() {
    if (current_user_can('administrator') && isset($_GET['run_delete'])) {
        wpkpi_delete_inactive_customers();
        echo 'Inactive customers deleted';
        exit;
    }
});

Перейдите в браузере на https://ваш-сайт.ru/?run_delete=1 под админом, чтобы проверить удаление.

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

  • Запустите SQL-запрос из раздела диагностики - список пользователей должен уменьшиться.
  • Проверьте пользователей в админке WordPress - неактивные клиенты должны исчезнуть.
  • Отслеживайте логи ошибок и убедитесь, что ошибок нет при удалении.

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

  • Пользователи не удаляются: Проверьте, что функция wc_get_customer_last_order() корректно возвращает заказы. В WooCommerce версии ниже 3.0 может не работать.
  • Ошибка с правами доступа: Убедитесь, что код выполняется с правами администратора, особенно при ручном запуске.
  • Удаляются не те пользователи: Проверьте корректность фильтра по роли customer. Если у вас кастомные роли, исправьте фильтр.
  • Проблемы с WP-Cron: Убедитесь, что WP-Cron работает или настройте системный cron для запуска wp-cron.php.

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

  • Резервное копирование: Перед автоматическим удалением пользователей сделайте резервную копию базы.
  • Пакетная обработка: Если клиентов много, запускайте удаление частями, чтобы избежать таймаутов:
function wpkpi_delete_inactive_customers_batch($batch_size = 50) {
    $args = array(
        'role'       => 'customer',
        'fields'     => ['ID'],
        'number'     => $batch_size,
        'offset'     => get_option('wpkpi_delete_offset', 0),
    );
    $users = get_users($args);
    if (empty($users)) {
        update_option('wpkpi_delete_offset', 0); // Сброс после окончания
        return;
    }
    $threshold_date = strtotime('-1 year');
    foreach ($users as $user) {
        $last_order = wc_get_customer_last_order($user->ID);
        $last_order_date = $last_order ? strtotime($last_order->get_date_created()) : 0;
        if ($last_order_date === 0 || $last_order_date < $threshold_date) {
            wp_delete_user($user->ID);
        }
    }
    update_option('wpkpi_delete_offset', get_option('wpkpi_delete_offset', 0) + $batch_size);
}
  • Логи: Добавьте логирование удалённых пользователей для аудита.
  • Проверка статусов заказов: В фильтрах учитывайте только нужные статусы (например, completed, processing), чтобы не удалять клиентов с активными заказами.

Сравнение вариантов реализации удаления

ВариантПреимуществаНедостатки
Код на PHP с WP-CronГибкость, контроль, не требует сторонних плагиновНужны навыки разработки, возможны ошибки при больших базах
Плагины очистки базы (например, WP-Optimize)Простота использования, готовые интерфейсыМогут удалять не то, ограниченные настройки удаления клиентов
Ручное удаление через админкуПростота, полный контрольТрудозатратно, невозможно автоматизировать
WooCommerce: автоматическое изменение статуса заказа при проблемах с платежами
18.06.2026
Как избежать проблем с подключением стилей и скриптов в WordPress
27.01.2026
Как успешно оптимизировать WordPress для поисковых систем: практические советы
14.11.2025
WooCommerce: автоматическое отключение отправки писем по заказам без оплаты
28.06.2026
WooCommerce: автоматическое отключение отправки писем по заказам без оплаты
30.05.2026