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

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

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

Основные признаки необходимости такого решения:

  • Товар создаётся автоматически в момент оформления заказа.
  • Отмена заказа означает, что товар больше не нужен и должен быть удалён.
  • Нельзя оставлять «мертвые» товары, чтобы не вводить покупателей в заблуждение.

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

Для автоматизации процесса потребуется использовать хук woocommerce_order_status_cancelled — он срабатывает при смене статуса заказа на «Отменён». При этом нужно получить все товары из заказа и удалить те, которые должны исчезнуть.

Ниже — пример кода, который удаляет продукты, связанные с отменённым заказом:

add_action('woocommerce_order_status_cancelled', 'delete_products_after_order_cancelled', 10, 1);
function delete_products_after_order_cancelled($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        if (!$product_id) continue;

        // Здесь можно добавить условие, чтобы удалять только нужные товары
        // Например, по категории или тегу
        $product = wc_get_product($product_id);
        if ($product && has_term('unique-products', 'product_cat', $product_id)) {
            wp_delete_post($product_id, true); // true — принудительное удаление без корзины
        }
    }
}

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

  • Хук woocommerce_order_status_cancelled запускает функцию после смены статуса заказа.
  • Перебираются все позиции заказа, извлекается ID товара.
  • Проверяется, что товар принадлежит категории unique-products — замените на свою категорию по необходимости.
  • Удаляется товар из базы данных с помощью wp_delete_post с флагом true для окончательного удаления.

Пошаговое внедрение решения

  1. Подключитесь к сайту через FTP или используйте редактор тем (желательно дочерняя тема или плагин для кастомного кода).
  2. Добавьте приведённый выше код в файл functions.php вашей дочерней темы или создайте собственный плагин.
  3. Замените условие has_term('unique-products', 'product_cat', $product_id) на вашу логику фильтрации товаров для удаления (если необходимо).
  4. Сохраните изменения и очистите кеш сайта, если используется кеширование.
  5. Создайте тестовый заказ с товаром из нужной категории и отмените его через админ-панель WooCommerce.

Как проверить, что решение работает

  • Создайте заказ с товаром, который должен удаляться после отмены.
  • Перейдите в админку WooCommerce, измените статус заказа на «Отменён».
  • Перейдите в каталог товаров и убедитесь, что товар исчез.
  • Проверьте базу данных (таблица wp_posts) — товара с данным ID больше нет.

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

  • Товар не удаляется: проверьте, что хук подключён и код не вызывает ошибок. Включите режим отладки WordPress (WP_DEBUG).
  • Удаляются все товары, а не только нужные: добавьте фильтрацию товаров по категории, тегу или метаполям, чтобы удалить только целевые позиции.
  • Ошибка прав доступа: убедитесь, что пользователь с правами администратора выполняет действия, а функция удаления вызывается на сервере.
  • Удаление не окончательное: параметр true в wp_delete_post гарантирует полное удаление без помещения в корзину.

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

  • Не удаляйте товары массово без проверки, какие именно нужно удалить — это может привести к потере важных данных.
  • Добавляйте логирование действий удаления через error_log или собственные таблицы для отладки.
  • Используйте условия, чтобы не нагружать систему лишними запросами.
  • Если товары связаны с другими постами (например, ревью, галереями), учитывайте это при удалении.

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

МетодПлюсыМинусы
Удаление в хуке woocommerce_order_status_cancelledАвтоматизация, гибкость фильтрацииНужен код, риск удаления нужных товаров без фильтрации
Ручное удаление товаров после отменыПолный контроль, минимальный риск ошибокТрудозатратно, не автоматизировано
Использование сторонних плагинов для автоматизацииПростота внедренияМожет быть избыточно, нет гибкости, нагрузка на сайт
Автоматическое удаление старых загруженных файлов в WordPress
10.04.2026
Как создать автоматический импорт данных из Яндекс.Метрики в WordPress
27.02.2026
Как убрать дублированный контент в WordPress: практические методы и примеры
01.01.2026
Автоматический импорт данных из Google Sheets в WordPress: практическое руководство
18.01.2026
Автоматическое изменение стоимости товара в WooCommerce при выборе атрибутов
04.05.2026