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

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

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

Основная задача — настроить автоматическое удаление заказов по статусу и возрасту, чтобы оптимизировать базу и поддерживать производительность сайта.

Как автоматически удалять заказы в WooCommerce по расписанию

1. Использование WP-Cron для регулярной очистки

WooCommerce не предоставляет встроенный механизм для удаления заказов, но мы можем написать кастомный код, который будет запускаться по расписанию с помощью WP-Cron.

2. Код для удаления заказов по статусу и возрасту

Ниже пример функции, которая удаляет заказы со статусом cancelled и completed, которым больше 30 дней.

function wpnews_delete_old_woocommerce_orders() {
    $statuses_to_delete = array('cancelled', 'completed');
    $days_old = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'date_query'     => array(
                array(
                    'before' => $date,
                    'inclusive' => true,
                ),
            ),
            'posts_per_page' => 100,
            'fields'         => 'ids',
        );

        $orders = get_posts($args);

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

function wpnews_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpnews_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpnews_daily_order_cleanup');
    }
}

add_action('wpnews_daily_order_cleanup', 'wpnews_delete_old_woocommerce_orders');
add_action('wp', 'wpnews_schedule_order_cleanup');

Пошаговое руководство по внедрению

  1. Добавьте код выше в файл functions.php вашей дочерней темы или в отдельный плагин.
  2. Убедитесь, что WP-Cron работает корректно на вашем сайте (например, нет отключения real cron).
  3. Проверьте, что в базе есть заказы со статусом cancelled и completed, которым больше 30 дней.
  4. Дождитесь выполнения задачи (она запускается ежедневно) или выполните вручную через WP-CLI: wp cron event run wpnews_daily_order_cleanup.

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

  • В админке WooCommerce перейдите в «Заказы» и отфильтруйте по статусам Отменён и Завершён. Заказы старше 30 дней должны отсутствовать.
  • Используйте SQL-запрос для проверки в базе:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-completed') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);
    — результат должен быть 0 или близок к нему.
  • Проверьте логи сервера или WP-DEBUG, если задача не сработала.

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

  • WP-Cron не запускается автоматически: хостинг может блокировать WP-Cron. Решение — настроить системный cron на вызов wp-cron.php или запускать задачу вручную через WP-CLI.
  • Заказы не удаляются: проверьте права пользователя, от имени которого запускается код, и убедитесь, что функция wp_delete_post вызывается с параметром true для удаления без корзины.
  • Удаляются не те заказы: проверьте, что в запросе post_status указан корректно с префиксом wc-.

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

  • Не удаляйте заказы моложе 30 дней — дайте время на возможное восстановление или анализ.
  • Если заказов очень много, ограничьте количество удаляемых за раз (posts_per_page) и запускайте задачу чаще, чтобы не перегружать базу.
  • Резервное копирование базы перед внедрением автоматического удаления обязательно.
  • Для больших сайтов лучше использовать системный cron вместо WP-Cron для надежности.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, без кодаЗатратно по времени, риск ошибокМало заказов
WP-Cron с пользовательским кодомАвтоматизация, гибкостьЗависит от WP-Cron, требует настройкиСредние и крупные магазины
Системный cron + WP-CLIНадежно, быстроТребует доступа к серверу и навыковБольшие сайты с нагрузкой
Плагины для очистки заказовГотовое решение, интерфейсМогут быть избыточными, влиять на производительностьБыстрое внедрение без кода
Как установить и настроить WP GraphQL в WordPress для расширенного API
17.02.2026
Как удалить заблокированные или неактивные товары WooCommerce с помощью кода
20.04.2026
Как сделать автоматический импорт новостей в WordPress из RSS
09.01.2026
WooCommerce: как автоматически отключить AJAX добавление в корзину для определённых товаров
01.06.2026
Как использовать Hooks в WordPress для расширения функциональности
12.11.2025