WooCommerce: автоматическое удаление заказов по статусу и дате в 2024

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

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

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

Выбор статусов и срока удаления

Перед реализацией нужно определить, какие статусы удалить (например, 'cancelled', 'failed', 'pending') и за какой период (например, старше 30 дней). Это позволит избежать удаления важных заказов.

Реализация через WP-Cron

Оптимальный способ — использовать WP-Cron для регулярного запуска удаления. Добавим функцию в файл functions.php вашей темы или в плагин.

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

add_action( 'wpdev_auto_delete_orders', 'wpdev_delete_old_orders' );

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

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

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

    foreach ( $orders as $order_id ) {
        wp_trash_post( $order_id ); // Переместить заказ в корзину
        // Для полного удаления используйте wp_delete_post( $order_id, true );
    }
}

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

Чтобы убедиться, что скрипт работает:

  • Запустите WP-Cron вручную с помощью плагина WP Crontrol или вызовите функцию wpdev_delete_old_orders() через консоль WP-CLI (wp eval 'wpdev_delete_old_orders();').
  • Проверьте на странице заказов WooCommerce в админке, что старые заказы со статусами, указанными в массиве, переместились в корзину или удалились.
  • Посмотрите таблицу wp_posts в базе данных, отфильтровав по post_type = 'shop_order' и соответствующим статусам, чтобы убедиться в отсутствии старых записей.

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

  • Заказы не удаляются: проверьте, работает ли WP-Cron. На хостинге WP-Cron может быть отключен, тогда нужно настроить системный cron или запускать вручную.
  • Удаляются нужные заказы: убедитесь, что массив статусов $statuses_to_delete содержит только безопасные для удаления статусы.
  • Проблемы с датой: формат даты и временная зона должны совпадать с настройками сайта, иначе фильтр по дате не сработает корректно.
  • Производительность: если заказов очень много, ограничьте количество обрабатываемых заказов за один запуск, добавив пагинацию в запрос.

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

  • Используйте wp_trash_post() вместо wp_delete_post(), чтобы иметь возможность восстановить заказ при ошибочном удалении.
  • Добавьте логирование удалений в файл или базу — это поможет отслеживать работу скрипта и быстро реагировать на ошибки.
  • Для сайтов с большим количеством заказов разбивайте удаление на части, например, по 100 заказов за запуск, чтобы избежать таймаутов.
  • Если используете плагин кеширования, убедитесь, что кеш очищается после массового удаления заказов, чтобы не показывать устаревшую информацию.

Сравнение вариантов реализации автоматического удаления заказов

МетодПлюсыМинусы
WP-Cron с кастомным кодомГибкость, контроль, без сторонних плагиновЗависимость от WP-Cron, требует навыков разработки
Плагины для очистки базы WooCommerceПростота использования, готовые настройкиМожет быть избыточным, риск удаления лишнего
Ручное удаление через админкуБезопасность, контрольТрудозатратно, не подходит для больших магазинов
Как использовать хук pre_get_posts для фильтрации записей в WordPress
20.04.2026
Оптимизация загрузки шрифтов в WordPress для ускорения сайта
20.02.2026
WooCommerce: как настроить отключение кеширования для отдельных страниц
07.06.2026
WooCommerce: автоматическое удаление заказов по статусу и дате в 2024
01.07.2026
Как создать динамический файл robots.txt в WordPress
08.03.2026