仅针对 Woocommerce 中的特定订单状态和付款方式减少库存

Reduce stock only for specific order statuses and payment method in Woocommerce

我正在为客户开发一些自定义 Woocommerce 功能。他们使用 BACS 支付网关处理人工支付。

但是,网关目前为满足我们的需求而过早地减少库存,即当订单为 "On Hold" 时。我只想在订单标记为 "Processing" 或 "Complete" 时减少库存(避免重复减少)。

我已经设法防止库存在 "on hold" 时使用以下代码段自行减少:

function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {
if ( $order->has_status( 'on-hold' ) ) {
$reduce_stock = false;
}
return $reduce_stock;
}
add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );

虽然我不太确定如何进行。虽然上面的代码有效,但添加以下条件不会:

else if ( $order->has_status( 'processing' ) || $order->has_status( 'completed' ) ) {
$reduce_stock = true;
}

简而言之,我希望库存根据以下库存状态发生变化:

非常感谢任何帮助!

使用挂钩在 woocommerce_order_status_changed 中的自定义函数,您将能够针对 'processing' 和 'completed' 订单状态更改减少订单商品库存.

我在你的函数中添加了一个条件,只针对订单的 "BACS" 支付网关。

add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );
function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {
    if ( $order->has_status( 'on-hold' ) && $order->get_payment_method() == 'bacs' ) {
        $reduce_stock = false;
    }
    return $reduce_stock;
}

add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );
function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){
    // Only for 'processing' and 'completed' order statuses change
    if ( $new_status == 'processing' || $new_status == 'completed' ){
    $stock_reduced = get_post_meta( $order_id, '_order_stock_reduced', true );
        if( empty($stock_reduced) && $order->get_payment_method() == 'bacs' ){
            wc_reduce_stock_levels($order_id);
        }
    }
}

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

已测试并有效