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

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

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

Проверить количество отменённых заказов можно через админку WooCommerce в разделе Заказы, выбрав фильтр по статусу Отменён. Также можно выполнить SQL-запрос в базе данных:

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

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

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

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

Добавим функцию, которая будет удалять все заказы со статусом wc-cancelled старше определённого количества дней (например, 30):

function wpdirect_delete_cancelled_orders() {
    global $wpdb;
    $days = 30; // количество дней, по истечении которых заказы будут удалены
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    // Получаем ID заказов со статусом отменён и датой создания старше threshold
    $orders_to_delete = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
        $date_threshold
    ));

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

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

2. Регистрация ежесуточного Cron-задания

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

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

add_action('wpdirect_daily_delete_cancelled_orders', 'wpdirect_delete_cancelled_orders');

3. Добавление функции и задачи в файл functions.php или в собственный плагин

Рекомендуется оформить код в собственный плагин для удобства управления или добавить в functions.php активной темы с учётом возможных рисков при смене темы.

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

Чтобы убедиться, что удаление работает корректно, можно:

  • В админке WooCommerce проверить количество отменённых заказов до и после запуска Cron.
  • Запустить функцию вручную через WP-CLI:
wp eval 'wpdirect_delete_cancelled_orders();'
  • Проверить логи сервера на наличие ошибок.
  • Убедиться, что удалённые заказы отсутствуют в базе (через phpMyAdmin или другой инструмент).

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

  • Задача Cron не запускается: проверьте, что WordPress Cron работает (выполните wp cron event list с WP-CLI). Если сайт малопосещаемый, активируйте системный Cron (real cron) для запуска wp-cron.php.
  • Заказы не удаляются: убедитесь, что функция wp_delete_post() вызывается с параметром true для полного удаления, а не перемещения в корзину.
  • Удаляются не те заказы: проверьте правильность статуса wc-cancelled и даты создания (поле post_date в базе).
  • Проблемы с производительностью при большом количестве заказов: разнесите удаление по партиям с помощью LIMIT в SQL-запросе.

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

  • Резервное копирование: перед внедрением автоматического удаления делайте резервную копию базы данных.
  • Лимит пакетов удаления: для магазинов с тысячами отменённых заказов ограничьте количество удаляемых записей за один запуск, например, так:
function wpdirect_delete_cancelled_orders_batch() {
    global $wpdb;
    $days = 30;
    $limit = 100; // удалять по 100 заказов за раз
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $orders_to_delete = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s LIMIT %d",
        $date_threshold, $limit
    ));

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

    foreach ($orders_to_delete as $order_id) {
        wp_delete_post($order_id, true);
    }
}
  • Логирование: добавьте логирование удалённых заказов в отдельный файл или таблицу для контроля.
  • Проверка прав: убедитесь, что пользователь или процесс, который запускает Cron, имеет необходимые права на удаление заказов.

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

МетодПлюсыМинусыПрименимость
Ручное удаление через админкуПросто, без кодаТрудоёмко при большом количестве заказовМалые магазины
Плагин для очистки заказовАвтоматизация, интерфейсДополнительная нагрузка, зависимость от плагинаСредние и крупные магазины
Код с Cron-заданием (описано в статье)Минимальная нагрузка, гибкость, полное удалениеНеобходимость поддержки кодаЛюбые магазины с базовыми навыками разработки
WooCommerce: автоматическое удаление отменённых заказов по расписанию с оптимизацией
19.06.2026
Как создать автоматическое удаление старых постов в WordPress
28.03.2026
Как создать мультиязычный сайт на WordPress без плагинов
14.12.2025
WooCommerce: автоматическое отключение отзывов по условиям
25.06.2026
WooCommerce: автоматическое изменение статуса заказа при неудачной оплате
12.06.2026