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

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

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

Чтобы проверить, есть ли такие записи, можно использовать SQL-запрос в базе данных или посмотреть через админку WooCommerce:

SELECT ID, post_status FROM wp_posts WHERE post_type IN ('shop_order', 'product') AND post_status = 'wc-cancelled';

Если количество таких записей большое и они не нужны, стоит рассмотреть автоматическое удаление.

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

1. Автоматическое удаление заказов со статусом «Отменен»

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

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

function wpb_cleanup_cancelled_orders() {
    $args = [
        'post_type' => 'shop_order',
        'post_status' => 'wc-cancelled',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    $cancelled_orders = get_posts( $args );

    foreach ( $cancelled_orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true — удаление без перемещения в корзину
    }
}
add_action( 'wpb_cleanup_cancelled_orders_hook', 'wpb_cleanup_cancelled_orders' );

2. Автоматическое удаление товаров со статусом «Отменен»

Стандартно WooCommerce не устанавливает статус «Отменен» для товаров, но если у вас есть кастомный статус или товары, которые необходимо удалять автоматически, пример кода ниже:

function wpb_cleanup_cancelled_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => 'wc-cancelled', // если используется такой статус
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    $cancelled_products = get_posts( $args );

    foreach ( $cancelled_products as $product_id ) {
        wp_delete_post( $product_id, true );
    }
}
add_action( 'wpb_cleanup_cancelled_orders_hook', 'wpb_cleanup_cancelled_products' );

3. Очистка кэша и оптимизация базы после удаления

После удаления лучше очистить кэш сайта и оптимизировать базу данных, чтобы освободить место и улучшить производительность. Это можно сделать через плагин, например, Clearfy Pro (ссылка), или вручную через phpMyAdmin.

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

  • Создайте тестовый заказ в WooCommerce и установите ему статус «Отменен».
  • Подождите, пока сработает WP-Cron (по умолчанию раз в сутки) или запустите вручную с помощью плагина WP Crontrol.
  • Проверьте в админке WooCommerce, что заказ удалён.
  • При необходимости проверьте таблицу wp_posts через SQL-запрос.

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

  • Не срабатывает WP-Cron: Это частая проблема при низкой посещаемости сайта. Для проверки используйте плагин WP Crontrol, чтобы убедиться, что событие запланировано. Для критически важных задач стоит настроить системный cron на сервере.
  • Удаление не происходит: Проверьте, что статус заказа точно wc-cancelled. Иногда статус может быть кастомным или отличаться по регистру.
  • Удаление товаров не работает: По умолчанию WooCommerce не использует статус «Отменен» для товаров. Убедитесь, что у товаров действительно такой статус или адаптируйте код под нужный вам статус.
  • Потеря данных: Перед автоматическим удалением сделайте резервную копию базы данных, чтобы избежать случайной потери важных данных.

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

  • Всегда используйте wp_delete_post() с параметром true, чтобы удалять записи без перемещения в корзину и не засорять базу.
  • Регулярно проверяйте логи сервера и WordPress на наличие ошибок, связанных с WP-Cron.
  • Для больших магазинов рассмотрите использование системного cron вместо стандартного WP-Cron для более надёжного выполнения задач.
  • Если количество отменённых заказов очень большое, разбивайте удаление на части (например, 100 заказов за один запуск), чтобы избежать таймаутов.

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

МетодПреимуществаНедостаткиРекомендуется для
WP-Cron + PHP кодГибкость, контроль, не требует сторонних плагиновЗависит от посещаемости сайта, возможны сбоиМалые и средние магазины
Системный cron + PHP кодНадёжность, точность выполнения задачТребует доступа к серверу и настройкиКрупные магазины, сайты с малой посещаемостью
Плагины очистки базы (Clearfy, WP-Optimize)Простота настройки, дополнительные функции оптимизацииМогут быть избыточными, нагрузка на сайтДля комплексной оптимизации и очистки
Как создать выбор фильтра на AJAX в WordPress
09.01.2026
WooCommerce: как добавить пользовательское поле в форму оплаты через хук
23.04.2026
Как использовать шорткоды в WooCommerce для расширения функционала на WPBegin
04.12.2025
Как создать Custom Post Type с дополнительными метаданными в WordPress
23.12.2025
Как отключить Emoji в WordPress: пошаговое руководство
07.04.2026