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

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

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

Чаще всего пользователи сталкиваются с задачей убрать товар, если заказ отменён и товар больше не должен отображаться в магазине. Без автоматизации это требует ручного контроля, что неудобно и ошибочно.

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

  • Перейдите в WooCommerce → Заказы, найдите заказ со статусом "Отменён".
  • Откройте его и запомните ID товара, который в заказе.
  • Перейдите в товары WooCommerce и проверьте наличие этого товара.
  • Если товар есть, значит автоматического удаления нет.

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

Подключение к хуку смены статуса заказа

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

Пример кода для functions.php темы или кастомного плагина

add_action('woocommerce_order_status_changed', 'auto_delete_product_on_order_cancelled', 10, 4);
function auto_delete_product_on_order_cancelled($order_id, $old_status, $new_status, $order) {
    if ($new_status !== 'cancelled') {
        return;
    }

    // Получаем все позиции заказа
    foreach ($order->get_items() as $item_id => $item) {
        $product_id = $item->get_product_id();
        $product = wc_get_product($product_id);

        if ($product) {
            // Проверяем, не является ли товар важным (например, проверка по мета)
            $protected = get_post_meta($product_id, '_protected_from_auto_delete', true);
            if ($protected) {
                continue; // пропускаем защищённые товары
            }

            // Удаляем товар (без перемещения в корзину)
            wp_delete_post($product_id, true);
        }
    }
}

Объяснение кода

  • Функция срабатывает при смене статуса заказа на cancelled.
  • Перебирает все товары в заказе и получает их ID.
  • Проверяет наличие мета-ключа _protected_from_auto_delete для исключения важных товаров.
  • Удаляет товар с помощью wp_delete_post с параметром true, чтобы миновать корзину.

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

  1. Создайте тестовый заказ с одним или несколькими товарами.
  2. Отмените заказ через админку WooCommerce.
  3. Перейдите в раздел «Товары» и убедитесь, что товар(ы) из отменённого заказа удалены.
  4. Если товар защищён мета-ключом, он останется в базе.

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

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

  • Хук не подключен или приоритет слишком низкий — увеличьте приоритет в add_action.
  • Функция не вызывается из-за ошибки синтаксиса — проверьте логи PHP.
  • Товары защищены от удаления — проверьте мета-ключ _protected_from_auto_delete.

Удаляются не те товары или лишние

  • Убедитесь, что в заказе нет товаров с вариациями, которые требуют отдельной обработки.
  • Добавьте логирование для отладки, например error_log('Deleting product ID: '.$product_id);.

Ошибки прав доступа

  • Проверьте, что пользователь, от имени которого выполняется скрипт, имеет права на удаление товаров.

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

  • Не удаляйте товары без проверки — используйте мета-ключи или категории для исключения важных товаров.
  • Для массовых заказов с большим количеством товаров добавьте ограничение на количество удаляемых товаров за один вызов, чтобы избежать тайм-аутов.
  • Резервное копирование базы перед внедрением автоматического удаления — обязательная мера.
  • Логируйте действия удаления товаров для последующего аудита.

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

МетодПреимуществаНедостатки
Ручное удаление товаровПростота, контрольТрудоемко, риск ошибок
Автоматическое удаление через код (как выше)Полный контроль, кастомизацияТребует навыков, возможны ошибки
Плагин для управления товарами и заказамиУдобство интерфейса, поддержкаМожет быть избыточным, нагрузка на сайт
Как установить уникальные слаги для таксономий в WordPress
27.03.2026
Как создать автоматическое отправление отчетов в WordPress
05.02.2026
WooCommerce: автоматическое изменение стоимости товара при изменении атрибутов с поддержкой вариантов
24.07.2026
Как удалить неиспользуемые изображения в WordPress: автоматический подход
31.01.2026
Как использовать хуки для расширения функционала WordPress
23.12.2025