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

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

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

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

Проверьте таблицу wp_posts в базе данных на предмет количества записей с типом shop_order и статусом cancelled или wc-cancelled. В WooCommerce статус отменённого заказа по умолчанию — wc-cancelled.

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

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

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

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

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

function wpmy_delete_cancelled_orders() {
    global $wpdb;
    // Удаляем заказы со статусом wc-cancelled старше 7 дней
    $days = 7;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $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",
        $date_threshold
    ));

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

2. Запуск функции по расписанию через WP-Cron

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

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

add_action('wpmy_delete_cancelled_orders_hook', 'wpmy_delete_cancelled_orders');

3. Как отменить задание WP-Cron (при необходимости)

function wpmy_clear_cron() {
    $timestamp = wp_next_scheduled('wpmy_delete_cancelled_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpmy_delete_cancelled_orders_hook');
    }
}
// Вызовите эту функцию вручную при деактивации плагина

Проверка результата: как убедиться, что удаление работает

  • Выполните SQL-запрос из раздела диагностики до и после запуска WP-Cron.
  • Временно замените daily на hourly в расписании для ускоренного тестирования.
  • Проверьте логи сервера или включите отладку WordPress (WP_DEBUG_LOG) для фиксации ошибок.
  • Создайте вручную несколько отменённых заказов старше 7 дней и проверьте, удалятся ли они после запуска функции.

Частые ошибки при автоматическом удалении заказов

  • Неправильный статус заказа: WooCommerce использует wc-cancelled, а не просто cancelled. Проверьте, что статус указан верно в запросах.
  • Отсутствие прав на удаление: wp_delete_post() требует, чтобы пользователь имел соответствующие права или вызов происходил в контексте сервера.
  • WP-Cron не запускается: На хостингах с низкой посещаемостью Cron может не сработать. Для теста запускайте вручную или настройте системный Cron.
  • Удаление не включает метаданные и связанные записи: wp_delete_post() с параметром true удаляет все связанные данные, но не все кастомные таблицы. Для расширенной очистки потребуется дополнительный код.

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

  • Не удаляйте отменённые заказы сразу после создания — оставляйте буфер в 7 дней, чтобы сохранить историю для аналитики.
  • Для сайтов с очень большим числом заказов разбивайте удаление на порции (batch), чтобы не перегружать сервер.
  • Используйте транзакции или проверяйте ошибки при удалении, чтобы избежать частичного удаления.
  • Настройте системный Cron вместо WP-Cron для надёжности на больших проектах — пример настройки в crontab:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
<
МетодПлюсыМинусы
WP-CronПростая настройка, не требует доступа к серверуЗависит от посещаемости сайта, может не сработать вовремя
Системный CronНадёжное срабатывание, подходит для больших сайтовТребует доступа к серверу и знаний администрирования
Ручное удаление через SQLБыстрая очистка, можно настроить сложные условияРиск ошибки, требуется знание SQL и бэкапы
Как отключить автообновления WordPress и плагинов с примерами кода
30.11.2025
WooCommerce: автоматическое удаление нерабочих вариаций товаров
25.06.2026
Автоматическое удаление отсутствующих товаров в WooCommerce
10.05.2026
Как отключить XML-RPC в WordPress для защиты сайта
10.03.2026
Как оценивать и управлять загрузкой сервера WordPress
04.01.2026