根据 Woocommerce 中特定订单状态的变化自动补货产品

Auto restock products on specific order status changes in Woocommerce

我拿起这个代码片段并一直在搞乱它。我遇到了一些语法错误…

代码如下:

class Comfythemes_Woocommerce_Auto_Stock_Restore {

    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_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;
        }
        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'] );
                }
            }
        }
    }
}

new Comfythemes_Woocommerce_Auto_Stock_Restore();

我在第 14 行和第 22 行遇到了一些错误...无法解决这个问题。有什么想法吗?

如何在 woocommerce 3 中的特定订单状态更改时获得此自动补货功能?

像这样尝试,这应该可以工作(我删除了两行的 & & 这可能是导致您出错的原因)

class Comfythemes_Woocommerce_Auto_Stock_Restore {

 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_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;
 }
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'] );
 }
 }
}
 }
}
new Comfythemes_Woocommerce_Auto_Stock_Restore()

抱歉,您使用的代码已完全过时且充满错误。

下面,基于 ,此 class 将根据您定义的订单状态更改 re-stock 产品:

if ( ! class_exists( 'WC_Auto_Stock_Restore' ) ) {
    class WC_Auto_Stock_Restore {

        function __construct() {
            add_action( 'woocommerce_order_status_processing_to_cancelled', array( $this, 'restore_order_stock' ), 10, 2 );
            add_action( 'woocommerce_order_status_completed_to_cancelled', array( $this, 'restore_order_stock' ), 10, 2 );
            add_action( 'woocommerce_order_status_on-hold_to_cancelled', array( $this, 'restore_order_stock' ), 10, 2 );
            add_action( 'woocommerce_order_status_processing_to_refunded', array( $this, 'restore_order_stock' ), 10, 2 );
            add_action( 'woocommerce_order_status_completed_to_refunded', array( $this, 'restore_order_stock' ), 10, 2 );
            add_action( 'woocommerce_order_status_on-hold_to_refunded', array( $this, 'restore_order_stock' ), 10, 2 );
        }

        public function restore_order_stock( $order_id, $order ) {
            $items = $order->get_items();

            if ( ! get_option('woocommerce_manage_stock') == 'yes' && ! count( $items ) > 0 )
                    return; // We exit

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

                if ( $product_id > 0 ) {
                    $product = $item->get_product();

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

                        // Get the product initial stock quantity (before update)
                        $initial_stock = $product->get_stock_quantity();

                        $item_qty = apply_filters( 'woocommerce_order_item_quantity', $item->get_quantity(), $this, $item );

                        // Update the product stock quantity
                        // Replace DEPRECATED methods: increase_stock() & discrease_stock()
                        wc_update_product_stock( $product, $item_qty, 'increase' );

                        // Get the product updated stock quantity
                        $updated_stock = $initial_stock + $item_qty;

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

                        // A unique Order note: Store each order note in an array…
                        $order_note[] = sprintf( __( 'Product ID #%s stock incremented from %s to %s.', 'woocommerce' ), $product_id, $initial_stock, $updated_stock);

                        // DEPRECATED & NO LONGER NEEDED - can be removed
                        //$order->send_stock_notifications( $product, $updated_stock, $item_qty );

                    }
                }
            }
            // Adding a unique composite order note (for multiple items)
            $order_notes = count($order_note) > 1 ? implode(' | ', $order_note) : $order_note[0];
            $order->add_order_note( $order_notes );
        }
    }
    $GLOBALS['wc_auto_stock_restore'] = new WC_Auto_Stock_Restore();
}

代码进入您活跃的子主题(或主题)的 function.php 文件。

已测试并有效 (仅适用于 WooCommerce 3+)


  • 3+
  • Accessing Order Items protected data in Woocommerce 3