Переходим в WooCommerce -> Настройки -> Товары -> Запасы
Задаем в поле «Удержание запаса» время
Затем в файле functions.php добавляем:
<?php class Woocommerce_Cancel_Orders { function __construct() { // заказ изменен с Обработка на Отменен add_action('woocommerce_order_status_processing_to_cancelled', array( $this, 'restore_order_stock' ), 10, 1); // заказ изменен с Выполнен на Отменен add_action('woocommerce_order_status_completed_to_cancelled', array( $this, 'restore_order_stock' ), 10, 1); // заказ изменен с На удержании на Отменен add_action('woocommerce_order_status_on-hold_to_cancelled', array( $this, 'restore_order_stock' ), 10, 1); // заказ изменен с В ожидании оплаты на Отменен add_action('woocommerce_order_status_pending_to_cancelled', array( $this, 'restore_order_stock' ), 10, 1); // add_action( 'woocommerce_order_status_processing_to_refunded', array( $this, 'restore_order_stock' ), 10, 1 ); // add_action( 'woocommerce_order_status_completed_to_refunded', array( $this, 'restore_order_stock' ), 10, 1 ); // add_action( 'woocommerce_order_status_on-hold_to_refunded', array( $this, 'restore_order_stock' ), 10, 1 ); } public function restore_order_stock($order_id) { $order = new WC_Order($order_id); if (! get_option('woocommerce_manage_stock') == 'yes' && ! sizeof($order->get_items()) > 0) { return; } $note = ''; foreach ($order->get_items() as $item) { if ($item['product_id'] > 0) { $_product = $order->get_product_from_item($item); if ($_product && $_product->exists() && $_product->managing_stock()) { $old_stock = $_product->stock; $qty = apply_filters('woocommerce_order_item_quantity', $item['qty'], $this, $item); $new_quantity = $_product->increase_stock($qty); do_action('woocommerce_auto_stock_restored', $_product, $item); $note .= '<br>' . $item['name'] . ' (' . $item['product_id'] . ') ' . $old_stock . '→' . $new_quantity; //$order->add_order_note(sprintf(__('Уровни запасов изменены: Продукт (%s) %s→%s', 'woocommerce'), $item['product_id'], $old_stock, $new_quantity)); $order->send_stock_notifications($_product, $new_quantity, $item['qty']); } } } if (!empty($note)) { $note = 'Уровни запасов изменены: ' . $note; $order->add_order_note($note); } } } new Woocommerce_Cancel_Orders();