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

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

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

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

Как проверить, что заказ использует нужный купон

Заказы в WooCommerce хранятся как тип записи shop_order, а применённые купоны — в метаданных заказа и связанной с ним информации.

Для получения списка купонов заказа используется метод $order->get_used_coupons(), который возвращает массив строк с кодами купонов.

Пример проверки купонов в заказе

function has_specific_coupon( $order, $target_coupon_code ) {
    $used_coupons = $order->get_used_coupons();
    foreach ( $used_coupons as $coupon_code ) {
        if ( strtolower($coupon_code) === strtolower($target_coupon_code) ) {
            return true;
        }
    }
    return false;
}

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

Ниже приведён пример функции, которую можно добавить в файл functions.php вашей темы или в кастомный плагин. Она удаляет все заказы, где использовался указанный купон.

function wc_delete_orders_by_coupon( $coupon_code ) {
    $args = [
        'limit' => -1,
        'status' => 'any',
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);
    $deleted_count = 0;

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( has_specific_coupon( $order, $coupon_code ) ) {
            wp_trash_post( $order_id ); // Можно заменить на wp_delete_post для полного удаления
            $deleted_count++;
        }
    }

    return $deleted_count;
}

// Пример вызова
// echo 'Удалено заказов: ' . wc_delete_orders_by_coupon('TESTCOUPON');

Опция wp_trash_post помещает заказ в корзину, что безопаснее на случай ошибки. Для полного удаления используйте wp_delete_post( $order_id, true ).

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

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

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

add_action( 'wc_delete_orders_by_coupon_cron', function() {
    $deleted = wc_delete_orders_by_coupon('TESTCOUPON');
    error_log('Заказы с купоном TESTCOUPON удалены: ' . $deleted);
});

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте заказы по статусам, чтобы убедиться, что заказы с нужным купоном отсутствуют.
  • Для контроля можно временно включить логирование в функцию удаления (как в примере с error_log), чтобы проверить количество удалённых заказов.
  • Запустите функцию вручную из консоли или через вызов в теме для тестирования.

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

  • Функция не удаляет заказы: проверьте, что код купона передаётся в том же регистре, либо используйте strtolower для сравнения.
  • Удаление не происходит из-за отсутствия прав: убедитесь, что код запускается с правами администратора и что WP-Cron работает корректно.
  • Заказы не удаляются полностью: wp_trash_post кладёт заказ в корзину — для полного удаления используйте wp_delete_post($order_id, true).
  • Большое количество заказов вызывает таймаут: реализуйте удаление партиями с помощью пагинации или WP-CLI.
  • WP-Cron не запускается по расписанию: проверяйте состояние WP-Cron и убедитесь, что сайт получает трафик или используйте системный cron для wp-cron.php.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Для больших магазинов удаляйте заказы партиями, чтобы избежать превышения лимита памяти или времени выполнения.
  • Используйте WP-CLI для массовых операций в командной строке — это быстрее и стабильнее.
  • Если используете WP-Cron, контролируйте его выполнение через плагины типа WP Crontrol.
  • Ограничьте права запуска такого кода только администраторам.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление в админке Просто, не требует кода Неэффективно при большом количестве заказов Малое число заказов для удаления
Автоматический PHP-скрипт с WP-Cron Автоматизация, гибкость Потенциальные таймауты, требует контроля Средние и большие магазины, регулярное удаление
WP-CLI команды Быстро, стабильно, без нагрузок на веб Требует доступа к серверу Большие магазины, системные администраторы
Как избежать конфликтов плагинов в WordPress: практические советы и примеры кода
07.04.2026
Автоматическое удаление заказов WooCommerce по использованным купонам
01.07.2026
Автоматическое удаление неактивных клиентов в WooCommerce по сроку бездействия
26.04.2026
Как создать функцию автоподсказки в поиске WordPress с поддержкой AJAX
19.01.2026
Как добавить поддержку WebP в WordPress без плагинов
10.04.2026