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

Проблема: накопление отменённых заказов в WooCommerce

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

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

Чтобы проверить, есть ли проблема, зайдите в раздел WooCommerce > Заказы и отфильтруйте заказы по статусу отменён (cancelled). Если количество отменённых заказов превышает несколько сотен, стоит задуматься об автоматизации их удаления.

Также проверьте размер таблиц wp_posts и wp_postmeta через phpMyAdmin или с помощью плагина WP-Optimize. Если они значительно выросли, это указывает на необходимость очистки старых данных.

Решение: автоматизация удаления отменённых заказов по сроку

Ниже представлены пошаговые действия и код для реализации автоматического удаления отменённых заказов старше, например, 30 дней.

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

function wpcoder_delete_old_cancelled_orders() {
    $days = 30; // Срок хранения в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

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

Добавим еженедельное событие для запуска очистки.

function wpcoder_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpcoder_weekly_order_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpcoder_weekly_order_cleanup');
    }
}
add_action('wp', 'wpcoder_schedule_order_cleanup');

add_action('wpcoder_weekly_order_cleanup', 'wpcoder_delete_old_cancelled_orders');

Шаг 3. Отключение задачи при деактивации плагина/темы

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

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

  • Через 7 дней после внедрения зайдите в WooCommerce > Заказы, отфильтруйте отменённые заказы и проверьте, что заказы старше 30 дней отсутствуют.
  • Проверьте размер таблиц базы данных — они должны уменьшиться.
  • Для немедленной проверки вызовите функцию wpcoder_delete_old_cancelled_orders() вручную через WP-CLI или временно добавьте вызов в functions.php и обновите сайт.

Частые ошибки и их устранение

  • Функция не удаляет заказы: проверьте, что статус заказа правильно указан как wc-cancelled, а не просто cancelled. WooCommerce всегда добавляет префикс wc- к статусам в коде.
  • WP-Cron не срабатывает: на некоторых хостингах невозможно запускать WP-Cron автоматически. В этом случае настройте системный cron через хостинг или вызовите скрипт вручную.
  • Заказы не удаляются полностью: убедитесь, что в wp_delete_post передан параметр true для полного удаления, а не перемещения в корзину.

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

  • Используйте WP-Cron с разумным интервалом — слишком частые запуски могут нагрузить сервер.
  • При большом количестве заказов разбивайте удаление на части, чтобы избежать превышения времени выполнения. Например, обрабатывайте по 100 заказов за раз.
  • Всегда делайте резервное копирование базы перед автоматической очисткой.
  • Если у вас много заказов, рассмотрите использование WP-CLI для запуска очистки вручную или по расписанию через системный cron: wp post delete $(wp post list --post_type=shop_order --post_status=wc-cancelled --date_query_column=post_date --before='30 days ago' --field=ID) --force

Сравнение способов реализации

МетодПлюсыМинусы
PHP-скрипт с WP-CronПолностью автоматический, легко интегрируетсяWP-Cron не всегда надёжен, возможна нагрузка при большом объёме
WP-CLI командаБыстрая и точечная очистка, подходит для больших базНужен доступ к серверу и навыки работы с командной строкой
Плагины очистки заказовГрафический интерфейс, дополнительные опцииИзбыточные функции, нагрузка, зависимость от сторонних решений
Как создать эффективный кеш в WordPress с помощью перегрузки функций
22.11.2025
Успешная интеграция WooCommerce с Битрикс24 в WordPress
10.01.2026
Как использовать хук pre_get_posts для фильтрации записей в WordPress
20.04.2026
Как добавить поле в форму регистрации WordPress
26.11.2025
WordPress отладка проблем с кэшем и кэш-плагинами: практические решения
08.12.2025