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

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

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

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

1. Использование хука смены статуса заказа

Для отслеживания изменения статуса заказа используем хук woocommerce_order_status_changed. На событие смены статуса проверим новый статус и удалим товары из заказа, если он отменён.

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

add_action('woocommerce_order_status_changed', 'wc_auto_delete_products_on_cancel', 10, 4);
function wc_auto_delete_products_on_cancel($order_id, $old_status, $new_status, $order) {
    if ($new_status !== 'cancelled') {
        return; // Удаляем только при смене на отменён
    }

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        if (get_post_type($product_id) === 'product') {
            // Удаляем продукт полностью
            wp_delete_post($product_id, true);
        }
    }
}

3. Как внедрить

  • Добавьте этот код в файл functions.php вашей дочерней темы или создайте небольшой плагин.
  • Проверьте, что у вас есть резервные копии сайта и базы данных перед удалением продуктов.
  • Обновите статус нескольких тестовых заказов в WooCommerce на «Отменён» и проверьте удаление товаров.

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

Для проверки выполните следующие шаги:

  • Создайте тестовый заказ с несколькими товарами.
  • Смените статус заказа на «Отменён» в админке WooCommerce.
  • Перейдите в каталог товаров и убедитесь, что товары из отменённого заказа удалены.
  • Проверьте, что другие товары остались нетронутыми.

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

  • Товары не удаляются: Проверьте правильность подключения функции и нет ли ошибок PHP в журнале. Убедитесь, что статус заказа действительно меняется на cancelled.
  • Удаляются не те товары: Убедитесь, что функция получает правильный product_id и что проверка типа поста get_post_type($product_id) === 'product' срабатывает.
  • Нарушение логики бизнеса: Удаление товара из каталога необратимо. Для избежания потерь лучше сначала ставить товар в черновик или архивировать.

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

  • Всегда делайте резервные копии перед массовыми изменениями.
  • Если товаров много, реализуйте удаление через WP-Cron для снижения нагрузки.
  • Рассмотрите альтернативу — перевод товара в статус «черновик» вместо удаления для возможности восстановления.
  • Ограничьте удаление товаров только для определённых категорий или меток, чтобы избежать случайного удаления.

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

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

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        if (get_post_type($product_id) === 'product') {
            // Переводим товар в черновик
            wp_update_post(array(
                'ID' => $product_id,
                'post_status' => 'draft'
            ));
        }
    }
}

Таблица сравнения подходов удаления товаров

МетодОписаниеПлюсыМинусы
Удаление через wp_delete_postПолное удаление товара из базы данныхОсвобождает место, исключает повторное использованиеНевозможно восстановить, риск потери данных
Перевод в статус "черновик"Товар скрыт в каталоге, но сохраняется в базеМожно быстро восстановить, безопаснееНе освобождает место, товар всё еще в базе
Создать собственный шорткод WordPress с поддержкой параметров
05.11.2025
Как создать плагин для автоматического отключения неиспользуемых плагинов в WordPress
16.01.2026
Как создать собственный виджет WordPress: пошаговое руководство
09.11.2025
Как сделать постоянный AJAX запрос без кэширования в WordPress
10.12.2025
Изменение цены товара в WooCommerce после оформления заказа: проверенное решение
02.06.2026