Май
20
2021

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

Переходим в 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();