如何在WooCommerce中减少特定订单状态的库存



我在WooCommerce上管理我的股票。

我想在订单状态变为特定状态时减少库存,例如(待定)或其他状态。

所以我用了这个代码:
function manageStock ($order_id, $old_status, $new_status, $instance ) {
if ($old_status === 'on-hold'){
wc_reduce_stock_levels($order_id);
}
}
add_action( 'woocommerce_order_status_changed', 'manageStock', 10, 4 );

但不幸的是不起作用。有别的办法解决这个问题吗?

库存已经减少"on-hold">,"processing">"completed">如您所见,在wc_maybe_reduce_stock_levels()函数源代码中,将该函数与以下钩子挂钩:

add_action( 'woocommerce_payment_complete', 'wc_maybe_reduce_stock_levels' );
add_action( 'woocommerce_order_status_completed', 'wc_maybe_reduce_stock_levels' );
add_action( 'woocommerce_order_status_processing', 'wc_maybe_reduce_stock_levels' );
add_action( 'woocommerce_order_status_on-hold', 'wc_maybe_reduce_stock_levels' );

所以不要直接用wc_reduce_stock_levels(),用wc_maybe_reduce_stock_levels()代替。

但是在WooCommerce上pending订单状态触发函数wc_maybe_increase_stock_levels(),增加缺货水平,所以我们需要先移除这个行为。

现在允许"待定"库存减少。订单状态,添加以下代码行:

add_action('init', function() {
remove_action( 'woocommerce_order_status_pending', 'wc_maybe_increase_stock_levels' );
add_action( 'woocommerce_order_status_pending', 'wc_maybe_reduce_stock_levels' );
});

代码放在活动子主题(或活动主题)的functions.php文件中。应该可以。

请注意,woocommerce_order_status_{$status_transition_to}是一个复合钩子,可以与任何其他自定义订单状态一起使用。

对于任何自定义订单状态(比如"shipped"例如),我们将使用:

add_action( 'woocommerce_order_status_shipped', 'wc_maybe_reduce_stock_levels' );

代码放在活动子主题(或活动主题)的functions.php文件中。应该可以。

最新更新