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

|

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

Неоплаченные заказы (статус "pending", "failed" или "on-hold") могут накапливаться в базе данных WooCommerce, создавая нагрузку на систему и усложняя управление заказами. Особенно это актуально для магазинов с большим потоком клиентов. Автоматическое удаление таких заказов через определённое время помогает поддерживать базу в порядке и освобождать ресурсы.

Как определить, что проблема есть?

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

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

WooCommerce не предоставляет встроенной функции для удаления заказов по времени, но можно добавить кастомный cron-задачу, которая будет выполнять эту операцию.

1. Добавляем cron-задачу

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

if (!wp_next_scheduled('wc_delete_old_unpaid_orders')) {
    wp_schedule_event(time(), 'hourly', 'wc_delete_old_unpaid_orders');
}

add_action('wc_delete_old_unpaid_orders', 'wc_delete_old_unpaid_orders_callback');

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

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed', 'wc-on-hold'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];
    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // true - удаляет без возможности восстановления
        }
    }
}

2. Проверка работы крона

Для проверки, сработал ли cron, можно временно добавить логирование в файл:

function wc_delete_old_unpaid_orders_callback() {
    $days = 3;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed', 'wc-on-hold'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];
    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }

    error_log('Удалено заказов: ' . count($old_orders));
}

Логи можно посмотреть в wp-content/debug.log при включенном WP_DEBUG_LOG.

3. Запуск cron вручную для теста

Используйте WP-CLI для запуска задачи вручную:

wp cron event run wc_delete_old_unpaid_orders

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

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

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

Альтернативы: плагины и код

ВариантПлюсыМинусыКомпромисс
Код из статьиПолный контроль, нет лишних плагиновНужны навыки кода, поддержка своими силамиПодходит для опытных разработчиков
Плагины автоочистки заказов (например, WooCommerce Order Cleanup)Простота использования, настройки через UIМожет быть избыточным, нагрузка на сайтПодходит для новичков и средних магазинов
Как удалить все посты из определённой категории в WordPress через код
30.01.2026
WooCommerce: как автоматически удалять неоплаченные заказы через заданное время
24.07.2026
Оптимизация базы данных WordPress: удаляем избыточные данные для ускорения сайта
18.11.2025
Создаем собственный виджет в WordPress на PHP: подробное руководство
05.11.2025
WooCommerce: как автоматически удалять заказы по определённому статусу
24.05.2026
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙