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

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

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

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

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

Шаг 1. Подключение к хуку изменения статуса заказа

WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при изменении статуса заказа. Используем его, чтобы ловить переходы в статусы cancelled и refunded.

Шаг 2. Добавление кода в functions.php или в кастомный плагин

add_action('woocommerce_order_status_changed', 'auto_delete_cancelled_or_refunded_orders', 10, 4);
function auto_delete_cancelled_or_refunded_orders($order_id, $old_status, $new_status, $order) {
    if (in_array($new_status, array('cancelled', 'refunded'))) {
        wp_delete_post($order_id, true); // true — принудительное удаление без перемещения в корзину
    }
}

Этот код удалит заказ сразу после смены статуса на отменённый или возвращённый.

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

  • Создайте тестовый заказ в WooCommerce.
  • Измените его статус на cancelled или refunded через админку.
  • Проверьте, что заказ исчез из списка заказов.
  • Для уверенности можно проверить базу данных MySQL, например, запросом SELECT * FROM wp_posts WHERE ID = {ID_заказа} — запись должна отсутствовать.

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

  • Заказы не удаляются после смены статуса: проверьте, что код подключён и активен, а функция wp_delete_post вызывается. Убедитесь, что при тестировании статусы меняются именно на cancelled или refunded, а не на пользовательские.
  • Удаляются не все нужные заказы: если вы используете кастомные статусы, добавьте их в массив статусов в in_array.
  • Ошибка при удалении из-за прав: убедитесь, что пользователь, под которым работает код (обычно — процесс PHP), имеет права на удаление записей (обычно это не проблема).
  • Удаление слишком быстрое, нарушает логи: можно добавить проверку, например, удалять только заказы старше определённого времени, чтобы сохранить статистику за последнюю неделю.

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

  • Перед удалением заказов делайте резервную копию базы, так как восстановить данные из корзины WordPress невозможно.
  • Если объём заказов большой, добавьте ограничение по времени или по дате создания заказа, чтобы не удалять последние транзакции.
  • Можно реализовать отложенную очистку через WP-Cron, чтобы удалять заказы пакетно, не нагружая сервер.
  • Для дополнительной безопасности можно логировать удаляемые ID заказов в отдельный файл или таблицу.

Расширение: удаление заказов по дате и статусу через WP-Cron

Для автоматизации очистки заказов старше 30 дней со статусом cancelled или refunded можно добавить следующий код:

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

add_action('wc_delete_old_cancelled_refunded_orders', 'delete_old_cancelled_refunded_orders');

function delete_old_cancelled_refunded_orders() {
    $args = array(
        'status' => array('cancelled', 'refunded'),
        'date_created' => '<' . (time() - 30 * DAY_IN_SECONDS),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

Этот код запускает ежедневную очистку заказов старше 30 дней, что снижает нагрузку и сохраняет актуальность данных.

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

МетодПреимуществаНедостатки
Удаление сразу при смене статусаМгновенное удаление, простота реализацииРиск потери данных, невозможность отката
Удаление по расписанию (WP-Cron)Контроль по дате, меньше ошибок, можно логироватьЗадержка удаления, чуть более сложная реализация
Ручное удаление через админкуБезопасно, пользователь контролирует процессТрудоёмко, не подходит для большого количества заказов
WooCommerce: как отменить заказ после оплаты с помощью кода
05.06.2026
Как создать многоуровневую навигацию в WordPress без плагинов
01.01.2026
Как удалить пустые категории в WordPress с помощью кода
12.03.2026
Автоматический импорт CSV в WordPress: пошаговое руководство
08.01.2026
Как удалить и запретить удаление записей в WordPress
03.02.2026