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

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

Просроченные заказы — это заказы, которые не были оплачены или обработаны в течение заданного времени и остаются в системе, занимая место и создавая путаницу в отчетах. Автоматическое удаление таких заказов помогает поддерживать базу данных в чистоте и облегчает управление магазином.

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

Первый шаг — понять, какие заказы считать просроченными. Обычно это заказы со статусом pending или failed, которые старше определенного количества дней. Для диагностики выполните SQL-запрос в базе данных или используйте WP-CLI:

wp wc order list --status=pending,failed --after='30 days ago'

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

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

1. Создание административной страницы с кнопкой подтверждения

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

add_action('admin_menu', function() {
    add_submenu_page(
        'woocommerce',
        'Удаление просроченных заказов',
        'Удаление заказов',
        'manage_woocommerce',
        'delete-expired-orders',
        'render_delete_expired_orders_page'
    );
});

function render_delete_expired_orders_page() {
    if (isset($_POST['delete_expired_orders_nonce']) && 
        wp_verify_nonce($_POST['delete_expired_orders_nonce'], 'delete_expired_orders_action')) {
        $count = delete_expired_orders();
        echo '<div class="notice notice-success is-dismissible"><p>Удалено ' . $count . ' просроченных заказов.</p></div>';
    }
?>
    <h1>Удаление просроченных заказов WooCommerce</h1>
    <form method="post">
        <?php wp_nonce_field('delete_expired_orders_action', 'delete_expired_orders_nonce'); ?>
        <p>Удалить все заказы со статусом <code>pending</code> и <code>failed</code>, старше 30 дней.</p>
        <input type="submit" class="button button-primary" value="Удалить просроченные заказы" />
    </form>
<?php
}

2. Функция удаления просроченных заказов

Функция выбирает заказы по заданным статусам и дате, затем удаляет их через WooCommerce API, чтобы корректно очистить все связанные данные.

function delete_expired_orders() {
    $args = [
        'status' => ['pending', 'failed'],
        'date_created' => '<' . (new WC_DateTime('-30 days'))->date('Y-m-d H:i:s'),
        'limit' => -1,
        'return' => 'ids',
    ];
    $orders_to_delete = wc_get_orders($args);
    $count = 0;
    foreach ($orders_to_delete as $order_id) {
        wp_delete_post($order_id, true); // жесткое удаление заказа
        $count++;
    }
    return $count;
}

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

После нажатия кнопки удаления зайдите в раздел Заказы WooCommerce и проверьте наличие заказов со статусом pending и failed, созданных более 30 дней назад. Их не должно быть.

Для дополнительной проверки можно использовать WP-CLI или SQL-запрос:

wp wc order list --status=pending,failed --after='30 days ago'

Если список пуст — скрипт работает корректно.

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

  • Отсутствие прав администратора: Убедитесь, что текущий пользователь имеет права manage_woocommerce для доступа к странице и выполнению удаления.
  • Неправильный формат даты: Используйте класс WC_DateTime для корректного формирования даты.
  • Заказы не удаляются: Возможно, в базе настроено сохранение удалённых заказов или работают плагины, блокирующие удаление. Проверьте логи ошибок и отключите сторонние плагины для теста.

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

  • Используйте wp_nonce_field и проверяйте nonce, чтобы избежать CSRF-атак.
  • Жесткое удаление (wp_delete_post($id, true)) удаляет заказ полностью, включая метаданные. Убедитесь, что резервное копирование есть.
  • Запуск удаления большого количества заказов может нагружать сервер. Для больших магазинов лучше реализовать пакетное удаление с помощью AJAX и WP Cron.
  • Регулярно очищайте базу и кеш, чтобы поддерживать производительность.

Сравнение вариантов удаления просроченных заказов

МетодПлюсыМинусы
Ручное удаление через админкуПросто и быстро для единичных заказовТрудоемко при большом количестве заказов
Автоматическое удаление с подтверждением (код выше)Контролируемый процесс, безопасное удалениеНе подходит для очень больших объемов без доработок
Пакетное удаление через WP-CronПозволяет удалять много заказов без перегрузкиСложнее реализовать, требует дополнительных проверок
Как сделать удалённый вывод данных в WordPress с помощью WP REST API
24.01.2026
Как изменить и добавить дополнительные поля в форму регистрации WordPress
07.04.2026
Как создать динамичный виджет в WordPress с применением AJAX
28.01.2026
Как установить ограничение на количество постов в выводах WordPress
04.02.2026
WooCommerce: автоматический возврат денег при отклонённом платеже
17.06.2026