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

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

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

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

Для диагностики зайдите в раздел WooCommerce > Заказы и проверьте, сколько заказов со статусом pending или on-hold не были оплачены длительное время (например, больше 7 дней). Если таких заказов много — автоматизация удаления будет полезна.

Также проверьте размер таблицы wp_posts и wp_postmeta в базе данных, чтобы оценить нагрузку.

Пошаговое решение: настройка автоматического удаления неоплаченных заказов

1. Создаем функцию удаления заказов старше заданного срока

function wc_delete_old_unpaid_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return;
    }

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

    $args = array(
        'limit'        => -1,
        'status'       => array( 'pending', 'on-hold' ),
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

2. Регистрируем событие WP-Cron для регулярного запуска

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

add_action( 'wc_cron_delete_old_orders', 'wc_delete_old_unpaid_orders' );

3. Очистка при деактивации плагина (если код в плагине)

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

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

  • Подождите 24 часа или запустите cron вручную с помощью WP-CLI: wp cron event run wc_cron_delete_old_orders
  • Проверьте в админке WooCommerce, что заказы со статусом pending и on-hold, созданные более 7 дней назад, исчезли.
  • Мониторьте таблицы базы данных на предмет уменьшения числа записей заказов.

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

  • Заказы не удаляются: Проверьте, активен ли WP-Cron. На некоторых серверах cron не запускается автоматически — настройте системный cron или используйте плагин для имитации cron.
  • Удаляются нужные заказы: Проверьте условие в $args по дате и статусу. Можно добавить логирование для отладки.
  • Ошибки типа «класс WooCommerce не найден»: Убедитесь, что WooCommerce активирован до запуска функции.
  • Проблемы с производительностью при большом числе заказов: используйте постраничный запрос с 'limit' => 100 и обрабатывайте партиями.

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

  • Не используйте wp_delete_post без параметра true, чтобы не оставлять «мусор» в базе — важно удалять полностью.
  • Добавьте логирование удалений для аудита, например, через error_log или отдельный файл.
  • Если заказов много, разбивайте удаление на части, чтобы избежать превышения лимита времени выполнения скрипта.
  • Для улучшения производительности можно использовать WP-CLI и запускать скрипт вручную в ночное время.

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

МетодПлюсыМинусы
Код в functions.php или плагинеКонтроль, нет лишних плагинов, гибкостьТребует навыков, может не работать без cron
Плагины для очистки WooCommerceУдобство, UI для настроекДополнительная нагрузка, зависит от обновлений плагина
Ручное удаление через админкуПростотаТрудозатратно, риск пропуска
WooCommerce: как установить лимит на количество товаров в корзине
18.06.2026
Как автоматически удалять старые версии постов в WordPress
18.03.2026
Как создать динамические виджеты в WordPress с использованием REST API
31.03.2026
Как отключить AJAX подгрузку комментариев в WordPress
27.03.2026
Как удалить или изменить атрибуты товаров WooCommerce через функции
11.05.2026