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

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

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

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

Чтобы понять, что в вашем магазине накопились просроченные заказы, выполните следующие шаги:

  • Зайдите в WooCommerce → Заказы и отфильтруйте по статусу, например, «Ожидает оплаты» или «Отменён».
  • Обратите внимание на дату создания заказов. Если заказам больше нескольких недель или месяцев, их стоит удалять.
  • Проверьте размер таблицы wp_posts с типом shop_order и связанные с ними метаданные в wp_postmeta.

Для быстрой оценки можно использовать SQL-запрос:

SELECT COUNT(ID) AS total, post_status FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

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

Пошаговое решение: удаление заказов по просроченным срокам с помощью WP-Cron

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

Определитесь с условиями удаления. Например, удалить все заказы со статусом pending (ожидает оплаты) старше 7 дней.

2. Создание функции удаления заказов

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

function wpbe_delete_expired_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return;
    }
    global $wpdb;

    $days = 7; // количество дней для просрочки
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID заказов со статусом 'pending', старше $days
    $order_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < %s",
        $date_threshold
    ) );

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

    foreach ( $order_ids as $order_id ) {
        wp_delete_post( $order_id, true ); // true - принудительное удаление
    }
}

3. Создание задачи WP-Cron

Зарегистрируйте периодическую задачу, которая будет запускать функцию, например, раз в сутки:

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

add_action( 'wpbe_daily_expired_orders_cleanup', 'wpbe_delete_expired_orders' );

4. Отключение задачи при деактивации

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

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

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

  • Проверьте наличие задачи в WP-Cron: используйте плагин WP Crontrol или выполните wp cron event list через WP-CLI.
  • Создайте тестовый заказ со статусом pending и датой более 7 дней назад (через SQL или программно), подождите выполнение задачи.
  • Проверьте, что заказ удалён из базы (через админку и SQL).
  • Логи сервера или плагинов для логирования могут помочь отследить выполнение функции.

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

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

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

  • Не удаляйте заказы без резервного копирования базы данных.
  • Ограничивайте количество удаляемых заказов за один цикл, чтобы не перегрузить сервер.
  • Для больших сайтов добавьте параметры пагинации в запрос, например, обрабатывать по 100 заказов за раз.
  • Разграничивайте права доступа, чтобы код удаления выполнялся только с безопасных контекстов.
  • Рассмотрите использование плагина Clearfy Pro для комплексной очистки WooCommerce и оптимизации базы.

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

МетодПлюсыМинусыПример
WP-Cron + кастомный код Гибкость, отсутствие дополнительных плагинов Зависимость от работы WP-Cron, требует навыков PHP Код из статьи
Плагины очистки базы Простота установки, готовые функции Может быть избыточным, риск удаления лишнего Clearfy Pro, WP-Sweep
Ручное удаление через SQL Полный контроль, быстро Риск ошибок, отсутствие автоматизации SQL-запросы в phpMyAdmin
WooCommerce: автоматическое изменение статуса заказа по срокам
12.05.2026
Как удалить все посты определённого автора в WordPress
19.02.2026
WooCommerce: автоматическое удаление заказов по неактивности
28.05.2026
Как использовать AJAX для динамической загрузки контента в WordPress
01.02.2026
Как установить ограничения на размер и тип файлов в WordPress
26.03.2026