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

Почему важно удалять неоплаченные и отменённые заказы автоматически

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

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

  • Проверьте количество заказов в админке WooCommerce — если оно значительно больше реального объёма продаж, скорее всего есть залежи неоплаченных или отменённых заказов.
  • Используйте запрос к базе данных для подсчёта таких заказов:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled');
  • Если количество заказов более 1000 и они не закрыты, база может ощутимо замедляться.

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

Шаг 1. Добавляем WP-Cron задачу для удаления заказов

В functions.php вашей темы или в кастомном плагине добавьте код, который будет запускать очистку заказов ежедневно:

add_action('wp', 'setup_daily_order_cleanup_cron');
function setup_daily_order_cleanup_cron() {
    if (!wp_next_scheduled('daily_order_cleanup_hook')) {
        wp_schedule_event(time(), 'daily', 'daily_order_cleanup_hook');
    }
}

Шаг 2. Реализуем функцию удаления заказов по статусу и возрасту

Вешаем обработчик на наш крон-хук:

add_action('daily_order_cleanup_hook', 'delete_old_unpaid_cancelled_orders');
function delete_old_unpaid_cancelled_orders() {
    global $wpdb;
    
    $days_pending = 30; // Удалять неоплаченные заказы старше 30 дней
    $days_cancelled = 60; // Удалять отменённые заказы старше 60 дней
    
    $pending_date = date('Y-m-d H:i:s', strtotime('-' . $days_pending . ' days'));
    $cancelled_date = date('Y-m-d H:i:s', strtotime('-' . $days_cancelled . ' days'));

    // Получаем ID неоплаченных заказов старше $days_pending дней
    $pending_orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < %s",
        $pending_date
    ));
    
    // Получаем ID отменённых заказов старше $days_cancelled дней
    $cancelled_orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
        $cancelled_date
    ));

    $orders_to_delete = array_merge($pending_orders, $cancelled_orders);

    if (!empty($orders_to_delete)) {
        foreach ($orders_to_delete as $order_id) {
            wp_delete_post($order_id, true); // true - принудительно удаляем без корзины
        }
    }
}

Шаг 3. Проверяем и очищаем задачу WP-Cron (опционально)

При необходимости удалите старую задачу, чтобы избежать дублирования:

wp_clear_scheduled_hook('daily_order_cleanup_hook');

Как проверить, что удаление работает корректно

  • Отслеживайте количество заказов с помощью SQL-запросов, приведённых в разделе диагностики, до и после запуска задачи.
  • Включите логирование в функции удаления, например, записывайте удалённые ID в отдельный файл или в debug.log, чтобы убедиться, что процесс выполняется.
  • Запустите очистку вручную, вызвав функцию delete_old_unpaid_cancelled_orders() через WP-CLI или временно через admin-ajax, чтобы проверить, что заказы действительно удаляются.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает. На некоторых хостингах он отключён. Запустите вручную функцию и проверьте права доступа.
  • Удаляются не те заказы: Убедитесь, что используемые статусы 'wc-pending' и 'wc-cancelled' соответствуют вашим настройкам WooCommerce. В некоторых магазинах могут использоваться другие статусы.
  • Большая нагрузка на базу: Если заказов очень много, разбейте удаление на партии, используя LIMIT в SQL и повторные вызовы функции.
  • Потеря важных данных: Перед внедрением всегда делайте резервную копию базы. Проверьте, что удаляются только старые заказы.

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

  • Используйте wp_delete_post() с параметром true для полного удаления, чтобы не оставлять метаданные и связи.
  • Не запускайте удаление чаще, чем раз в сутки — это снизит нагрузку.
  • Если база очень большая, рассмотрите запуск удаления через WP-CLI скрипт с пагинацией.
  • Добавьте логирование удаления в отдельный файл для аудита и быстрого выявления проблем.
  • Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcoder.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-neoplachennyh-i-otmenennyh-zakazov-po-srokam) для оптимизации базы и удаления данных без написания кода.
Успешная интеграция WooCommerce с Битрикс24 в WordPress
10.01.2026
Автоматический импорт постов в WordPress: практическое руководство
17.01.2026
Автоматический импорт товаров из CSV в WooCommerce: пошаговое руководство
31.03.2026
WooCommerce: добавление автоматической скидки на первый заказ через код
09.06.2026
Автоматическое удаление отменённых заказов в WooCommerce по сроку хранения
27.05.2026