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

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

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

Чтобы оптимизировать работу магазина, необходимо регулярно очищать базу от ненужных записей с отменённым статусом заказов (cancelled или failed).

Как проверить наличие отменённых заказов и их влияние

Для оценки объёма отменённых заказов можно выполнить SQL-запрос к базе данных:

SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Обратите внимание на количество записей со статусом wc-cancelled или wc-failed. Чем их больше, тем больше выгода от очистки.

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

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

Добавьте следующий код в файл functions.php вашей дочерней темы или в специальный плагин для кастомных функций.

function wpmg_delete_cancelled_orders() {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'before'    => '30 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true ); // true - удаление без возможности восстановления
        }
    }
}

2. Автоматизация с помощью WP-Cron

Чтобы функция запускалась регулярно, добавим задачу в планировщик WordPress:

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

add_action( 'wpmg_delete_cancelled_orders_event', 'wpmg_delete_cancelled_orders' );

Этот код запустит очистку один раз в день, удаляя отменённые и проваленные заказы старше 30 дней.

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

  1. Перед внедрением сделайте резервную копию базы.
  2. Выполните SQL-запрос из раздела диагностики и запомните количество отменённых заказов.
  3. Вручную создайте тестовые заказы с статусом cancelled и датой старше 30 дней.
  4. Запустите функцию напрямую или дождитесь выполнения WP-Cron (можно вызвать вручную через WP-CLI или плагин для управления задачами).
  5. Повторно выполните SQL-запрос — количество удалённых заказов должно уменьшиться.

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

  • Функция не запускается по Cron: Проверьте, работает ли WP-Cron на вашем сайте. Для теста вызовите функцию вручную через do_action('wpmg_delete_cancelled_orders_event').
  • Заказы не удаляются, хотя функция вызывается: Убедитесь, что статусы заказов указаны корректно (wc-cancelled, wc-failed). Проверьте права пользователя и возможности.
  • Удаляются не те заказы: Проверьте условие date_query, возможно, даты заданы неправильно.
  • Потеря данных из-за удаления: Рекомендуется делать полный бэкап перед внедрением.

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

  • Не запускайте удаление слишком часто — лучше раз в сутки или неделю.
  • Используйте wp_delete_post( $order_id, true ) с осторожностью — удаление без возможности восстановления.
  • Для больших магазинов с тысячами заказов разделяйте удаление на порции, чтобы избежать таймаутов:
function wpmg_delete_cancelled_orders_batch( $batch_size = 100 ) {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'before'    => '30 days ago',
            ),
        ),
        'posts_per_page' => $batch_size,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

    if ( empty( $orders ) ) {
        return false;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }

    return true;
}
  • Используйте серверные инструменты мониторинга для отслеживания влияния на производительность.
  • Регулярно делайте резервные копии базы данных перед очисткой.

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

ПодходПлюсыМинусыПример
Ручное удаление из админкиПростота, контрольТрудозатратно, риск пропускаУдаление заказов по фильтру в WooCommerce
Автоматический скрипт с WP-CronАвтоматизация, регулярностьНужна настройка, возможны ошибкиКод из статьи
Плагин Clearfy ProГотовое решение, дополнительные опцииПлатный, лишний функционалClearfy Pro
Как отключить пагинацию в WordPress без плагинов
25.02.2026
Как удалить или изменить атрибуты товара в WooCommerce через код
20.04.2026
Как изменить возможности пользователя в WordPress без плагинов
05.01.2026
Как создать автоматические оценки в отзывах WordPress
10.04.2026
WooCommerce: как изменить количество товаров в корзине без перезагрузки страницы
18.05.2026