woocommerce автоматическое восстановление количества запасов при возврате заказа

Мне нужно автоматическое восстановление запасов WooCommerce при возврате заказа, пожалуйста, помогите мне в этом, я пробовал с 2 крючками

 add_action( 'woocommerce_product_set_stock','action_woocommerce_variation_set_stock', 10, 1 );
add_action( 'woocommerce_variation_set_stock', 'action_woocommerce_variation_set_stock', 10, 1 );

но эти крючки работают на интерфейсе, когда количество товара на складе уменьшается по заказу

Пожалуйста, решите эту проблему


person BugDecode    schedule 07.04.2017    source источник


Ответы (2)


Попробуйте использовать следующий крюк действия:

add_action( 'woocommerce_order_status_processing_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );
add_action( 'woocommerce_order_status_completed_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );
add_action( 'woocommerce_order_status_on-hold_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );
add_action( 'woocommerce_order_status_processing_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );
add_action( 'woocommerce_order_status_completed_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );
add_action( 'woocommerce_order_status_on-hold_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );
add_action( 'woocommerce_order_status_failed_to_refunded', 'YOUR_ACTION_NAME', 10, 1 );

function YOUR_ACTION_NAME( $order_id ) {
        $order = new WC_Order( $order_id );

        if ( ! get_option('woocommerce_manage_stock') == 'yes' && ! sizeof( $order->get_items() ) > 0 ) {
            return;
        }

        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 );

                    $order->add_order_note( sprintf( __( 'Item #%s stock incremented from %s to %s.', 'woocommerce' ), $item['product_id'], $old_stock, $new_quantity) );

                    $order->send_stock_notifications( $_product, $new_quantity, $item['qty'] );
                }
            }
        }
    } //End of function

замените YOUR_ACTION_NAME своим именем функции.

person Tarun Mahashwari    schedule 30.09.2017

Вот мой код:

/**
 * WooCommerce - do a custom action on order status change
 */
function jasom_custom_actions_on_order_status_change( $order_id, $checkout = null ) {

    $order = new WC_Order( $order_id );

    if (!get_option( 'woocommerce_manage_stock' ) == 'yes' && !sizeof( $order->get_items() ) > 0) {
        return;
    }

    if ($order->get_status() === 'refunded') {

        $changes = [];

        foreach ($order->get_items() as $item) {

            if ($item[ 'product_id' ] > 0) {

                $product = $item->get_product();

                if ($product && $product->exists() && $product->managing_stock()) {

                    $qty = $item->get_quantity(); // Get the item quantity

                    $new_quantity = $product->increase_stock( $qty );

                    do_action( 'woocommerce_auto_stock_restored', $product, $item );

                    $changes[] = $product->get_formatted_name() . ' ' . ( $new_quantity - $qty ) . '→' . $new_quantity;

                    $order->send_stock_notifications( $product, $new_quantity, $item[ 'qty' ] );
                }
            }
        }

        if ($changes) {
            $order->add_order_note( __( 'Stock levels increased:', 'woocommerce' ) . ' ' . implode( ', ', $changes ) );
        }
    }

}

add_action( 'woocommerce_order_status_changed', 'jasom_custom_actions_on_order_status_change' );
person Jasom Dotnet    schedule 03.08.2020