wpdownload.ru wordpress WPDownload.ru

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

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

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

Диагностика проблемы

Для начала нужно определить критерии неактивности. Обычно используют комбинацию следующих факторов:

  • Дата последнего заказа;
  • Дата последнего входа на сайт (login);
  • Отсутствие активности в течение определенного времени (например, 12 месяцев).

Для диагностики можно использовать SQL-запросы к базе данных или плагины с отчетностью, например Clearfy Pro для мониторинга и очистки.

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

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

WooCommerce хранит заказы как тип записи shop_order, а связь с пользователем — через метаполе _customer_user. Чтобы найти пользователей без заказов за последний год, воспользуемся SQL-запросом:

SELECT u.ID FROM wp_users u LEFT JOIN wp_posts p ON u.ID = p.post_author AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing') WHERE (p.post_date IS NULL OR p.post_date < DATE_SUB(NOW(), INTERVAL 12 MONTH));

Но в WooCommerce чаще заказы привязаны через метаполе, поэтому более точный способ — использовать WP_Query и метазапросы.

2. Скрипт для удаления пользователей и заказов

Ниже пример кода для файла functions.php или отдельного плагина, который удалит пользователей без заказов или с заказами старше 12 месяцев, а также их заказы:

function wc_delete_inactive_customers() {
    $args = [
        'role' => 'customer',
        'fields' => 'ID',
    ];
    $user_ids = get_users($args);
    $now = current_time('mysql');
    $date_limit = date('Y-m-d H:i:s', strtotime('-12 months', strtotime($now)));

    foreach ($user_ids as $user_id) {
        $orders = wc_get_orders([
            'customer' => $user_id,
            'limit' => -1,
            'orderby' => 'date',
            'order' => 'DESC',
            'return' => 'ids',
        ]);

        $has_recent_order = false;
        foreach ($orders as $order_id) {
            $order = wc_get_order($order_id);
            if ($order->get_date_created() && $order->get_date_created()->date('Y-m-d H:i:s') >= $date_limit) {
                $has_recent_order = true;
                break;
            }
        }

        if (!$has_recent_order) {
            // Удаляем заказы пользователя
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true);
            }
            // Удаляем пользователя
            require_once(ABSPATH . 'wp-admin/includes/user.php');
            wp_delete_user($user_id);
        }
    }
}

// Запускаем функцию по крону или вручную
// wc_delete_inactive_customers();

Важно: запускать эту функцию лучше в фоне (через WP-Cron или внешний cron), чтобы избежать таймаутов.

3. Настройка задания WP-Cron

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

add_action('wc_delete_inactive_customers_event', 'wc_delete_inactive_customers');

if (!wp_next_scheduled('wc_delete_inactive_customers_event')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_event');
}

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

  • Проверьте в админке WooCommerce список пользователей — неактивные должны удалиться;
  • Проверьте базу заказов — заказы этих пользователей тоже должны исчезнуть;
  • Для теста можете временно изменить период на 1 месяц и проверить на тестовом сайте;
  • Логи ошибок PHP должны быть пусты, функция не должна вызывать замедлений.

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

  • Удаление не тех пользователей: убедитесь, что критерии отбора корректны, особенно по дате последнего заказа.
  • Таймауты при удалении большого количества данных: разбивайте процесс на партии (batch processing) или используйте WP-CLI для запуска скрипта.
  • Удаление пользователей с админскими правами: фильтруйте по роли customer чтобы не затронуть админов.
  • Отсутствие резервного копирования: обязательно делайте бэкап базы перед массовым удалением.

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

  • Используйте транзакции SQL при удалении, если работаете напрямую с базой, чтобы избежать частичных удалений;
  • Обязательно проверяйте роль пользователя перед удалением, чтобы не повредить администраторам;
  • Для крупных магазинов лучше выполнять удаление партиями с помощью WP-CLI или очередей;
  • Оптимизируйте базу данных после удаления: OPTIMIZE TABLE wp_users, wp_usermeta, wp_posts, wp_postmeta;
  • Если нужна точечная очистка, рассмотрите использование Clearfy Pro для безопасной очистки без риска.

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

МетодПлюсыМинусыРекомендации
Код в functions.phpГибкость, без сторонних плагиновРиск ошибок, требует тестированияИспользовать на малых и средних сайтах
WP-CLI скриптБыстро, подходит для больших базТребует доступа к серверуДля опытных админов и разработчиков
Плагин Clearfy ProБезопасность, готовые инструментыПлатный, менее гибкийДля тех, кто хочет готовое решение с поддержкой
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше