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

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

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

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

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

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

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

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

function wplab_delete_cancelled_orders() {
    // Получаем отменённые заказы старше 7 дней
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '7 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );
    $orders = get_posts($args);

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

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // жесткое удаление
    }
}

2. Запуск функции по расписанию с помощью WP-Cron

Создайте событие, которое будет запускать удаление один раз в сутки:

if (!wp_next_scheduled('wplab_daily_delete_cancelled_orders')) {
    wp_schedule_event(time(), 'daily', 'wplab_daily_delete_cancelled_orders');
}
add_action('wplab_daily_delete_cancelled_orders', 'wplab_delete_cancelled_orders');

3. Очистка при удалении расписания (опционально)

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

function wplab_clear_scheduled_delete() {
    $timestamp = wp_next_scheduled('wplab_daily_delete_cancelled_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wplab_daily_delete_cancelled_orders');
    }
}
register_deactivation_hook(__FILE__, 'wplab_clear_scheduled_delete');

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

  • Через 24 часа после добавления кода проверьте, что отменённые заказы старше 7 дней удалены. Для этого выполните SQL-запрос из раздела диагностики и сравните с предыдущим значением.
  • В админке WooCommerce в разделе Заказы убедитесь, что отменённые заказы исчезают по мере старения.
  • Если хотите протестировать сразу, временно замените '7 days ago' на '1 day ago' и вызовите функцию вручную:
wplab_delete_cancelled_orders();

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

  • Удаление не происходит: Проверьте, активировано ли событие WP-Cron. Для диагностики установите плагин WP Crontrol и убедитесь, что задача wplab_daily_delete_cancelled_orders в расписании.
  • Заказы не удаляются из базы данных: Убедитесь, что используете wp_delete_post($order_id, true) с параметром true для полного удаления, а не перемещения в корзину.
  • Удаляются не те заказы: Проверьте параметр post_status. Для отменённых заказов статус должен быть wc-cancelled. Также стоит проверить, что дата post_date соответствует дате создания заказа.
  • Производительность падает при удалении: При большом числе заказов разбейте удаление на чанки по 100 заказов за один запуск, чтобы избежать таймаутов.

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

  • Резервное копирование: Перед внедрением автоматического удаления сделайте полное резервное копирование базы данных.
  • Использование чанков: Для стабильной работы используйте разбиение на порции, например:
function wplab_delete_cancelled_orders_chunk() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => array(
            array('column' => 'post_date', 'before' => '7 days ago'),
        ),
        'posts_per_page' => 100,
        'fields'         => 'ids',
    );
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}
add_action('wplab_daily_delete_cancelled_orders', 'wplab_delete_cancelled_orders_chunk');
  • Контроль логов: Добавьте логирование удалённых заказов для отладки:
function wplab_delete_cancelled_orders() {
    $orders = get_posts([...]);
    foreach ($orders as $order_id) {
        if (wp_delete_post($order_id, true)) {
            error_log('Удалён заказ ID: ' . $order_id);
        }
    }
}
  • Альтернативы: Для удобства есть плагины, например Clearfy Pro, которые умеют очищать базу WooCommerce от ненужных данных. Но код позволяет гибко настроить условия удаления.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, нет кодаТрудоёмко, не автоматично
Плагин Clearfy Pro или аналогАвтоматизация, удобный интерфейсПлатные, может не соответствовать специфическим требованиям
Собственный код с WP-CronГибкость, бесплатность, полное управлениеНеобходимы базовые навыки разработки, возможны ошибки без тестирования
Как отключить XML-RPC в WordPress для защиты сайта
04.03.2026
Как отключить Emoji в WordPress для ускорения сайта
23.01.2026
Как изменить размеры изображений товаров WooCommerce без плагинов
24.06.2026
Как использовать хуки WooCommerce для добавления дополнительной логики в заказы
03.06.2026
Как избежать конфликтов между WPML и WooCommerce: практическое руководство
19.04.2026