WooCommerce: как автоматически удалять неактивных клиентов

Проблема: накопление неактивных клиентов в WooCommerce и нагрузка на базу данных

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

Диагностика: как определить неактивных клиентов в WooCommerce

Для начала нужно определить критерии «неактивности». Обычно это клиенты, которые:

  • не совершали заказов за последние N месяцев;
  • не заходили на сайт (по дате последнего входа);
  • не обновляли профиль.

WooCommerce хранит заказы в таблице wp_posts с типом shop_order, а связь с клиентом — через мета-поле _customer_user. Логин пользователя — в таблице wp_users, последний вход — в поле user_last_login (если используется плагин для отслеживания логинов, иначе нужно внедрять свой код).

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

1. Определение неактивных пользователей по заказам

Напишем запрос, который ищет пользователей без заказов за последние 6 месяцев:

SELECT ID FROM wp_users WHERE ID NOT IN ( SELECT DISTINCT CAST(meta_value AS UNSIGNED) FROM wp_postmeta WHERE meta_key = '_customer_user' AND post_id IN ( SELECT ID FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH) ) );

Этот запрос вернёт ID пользователей без заказов за последние 6 месяцев.

2. Удаление пользователей программно через WP_CLI

Реализуем WP_CLI команду для удаления таких пользователей (рекомендуется запускать из консоли сервера):

if ( defined('WP_CLI') && WP_CLI ) {
    WP_CLI::add_command('wc delete_inactive_customers', function() {
        global $wpdb;
        $query = "SELECT ID FROM {$wpdb->users} WHERE ID NOT IN (
            SELECT DISTINCT CAST(pm.meta_value AS UNSIGNED) 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-completed', 'wc-processing')
            AND p.post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH)
        )";
        $users = $wpdb->get_col($query);
        foreach ($users as $user_id) {
            wp_delete_user($user_id);
            WP_CLI::log("Deleted user ID: $user_id");
        }
    });
}

Команду можно запустить в терминале командой wp wc delete_inactive_customers.

3. Автоматизация через Cron

Чтобы не запускать команду вручную, добавим WP Cron задачу:

function schedule_inactive_customers_cleanup() {
    if (!wp_next_scheduled('wc_cleanup_inactive_customers')) {
        wp_schedule_event(time(), 'weekly', 'wc_cleanup_inactive_customers');
    }
}
add_action('wp', 'schedule_inactive_customers_cleanup');

add_action('wc_cleanup_inactive_customers', function() {
    global $wpdb;
    $query = "SELECT ID FROM {$wpdb->users} WHERE ID NOT IN (
        SELECT DISTINCT CAST(pm.meta_value AS UNSIGNED) 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-completed', 'wc-processing')
        AND p.post_date > DATE_SUB(NOW(), INTERVAL 6 MONTH)
    )";
    $users = $wpdb->get_col($query);
    foreach ($users as $user_id) {
        wp_delete_user($user_id);
    }
});

Этот код запустит удаление неактивных клиентов раз в неделю.

Проверка результата

  • Перед запуском — сделайте резервную копию базы данных.
  • Запустите код вручную или WP CLI команду и проверьте логи на удаление пользователей.
  • Проверьте в админке WooCommerce список пользователей — неактивные должны исчезнуть.
  • Для теста создайте тестовых пользователей с и без заказов и проверьте, что удаляются только неактивные.

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

  • Удаление нужных пользователей: При неправильном запросе могут удалиться активные клиенты. Чтобы избежать, всегда проверяйте SQL-запрос на тестовой базе.
  • Отсутствие учета статуса заказа: Не учитывайте статусы заказов, которые действительно считаются завершенными (wc-completed, wc-processing). Иначе удалите клиентов с текущими заказами.
  • Проблемы с WP Cron: WP Cron запускается только при посещении сайта. Для надежности используйте системный cron или WP CLI.
  • Отсутствие резервной копии: Удаление пользователей — необратимая операция. Обязательно делайте бэкап.

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

  • Запускайте удаление неактивных клиентов в низкую нагрузку на сервер время (ночь или раннее утро).
  • Ограничьте количество удаляемых пользователей за один прогон (например, по 50), чтобы избежать таймаутов и нагрузок.
  • Используйте WP CLI для большей надежности и контроля.
  • Если у вас есть плагин для управления пользователями (например, User Insights), интегрируйте логику удаления с его отчетами.
  • При большом количестве пользователей используйте прямые SQL-запросы с осторожностью и тестируйте на копии сайта.

Сравнение подходов удаления неактивных клиентов

СпособПлюсыМинусыКомпромисс
WP CLI командаНадежно, быстро, можно запускать вручнуюТребует доступа к серверу и командной строкеПодходит для опытных админов и разработчиков
WP Cron с PHP кодомАвтоматизация без внешних инструментовЗависит от посещаемости сайта, может пропустить запускИспользуйте системный cron для вызова wp-cron.php
Плагин с UIУдобство управления через админкуМожет быть тяжелым и ненастраиваемымИспользуйте только проверенные плагины
WooCommerce: как автоматически удалять неактивных клиентов
16.07.2026
Как создать автоматический импорт сообщений из Telegram в WordPress
05.04.2026
WooCommerce: как автоматизировать очистку корзины после неоплаченных заказов
26.06.2026
Как создать собственный REST API в WordPress
13.11.2025
Как создать автоматический импорт данных из Google Sheets в WordPress
14.01.2026