我正在开发一个通过WooCommerce处理车辆租赁的插件。默认的WooCommerce行为是在付款后立即减少订单中的商品库存。长话短说,我需要防止这种情况发生(我将实施一个自定义功能,只减少所选租赁日期的库存)。
在WC_Order类中,我找到了一个名为payment_complete()的函数(class-wc-order.php,第1278行)。
在此功能中如下:
if ( apply_filters( 'woocommerce_payment_complete_reduce_order_stock', true, $this->id ) )
$this->reduce_order_stock(); // Payment is complete so reduce stock levels
在我看来,我只需要包含
add_filter( 'woocommerce_payment_complete_reduce_order_stock', '_return_false' );
在我的插件中,以防止股票在付款时减少,但不幸的是,这不起作用。我也尝试将我的add_filter()包装在init中触发的函数中,但仍然没有运气。
非常感谢任何帮助。
答案 0 :(得分:1)
这是旧的,但如果您不想让WooCommerce管理库存,您可以告诉整个商店不要管理选项中的库存。或者,单独在每个产品上。
研究reduce_order_stock()
课程中的WC_Abstract_Order
方法表明,在这些情况下,股票不会减少。
/**
* Reduce stock levels
*/
public function reduce_order_stock() {
if ( 'yes' == get_option('woocommerce_manage_stock') && sizeof( $this->get_items() ) > 0 ) {
// Reduce stock levels and do any other actions with products in the cart
foreach ( $this->get_items() as $item ) {
if ( $item['product_id'] > 0 ) {
$_product = $this->get_product_from_item( $item );
if ( $_product && $_product->exists() && $_product->managing_stock() ) {
$qty = apply_filters( 'woocommerce_order_item_quantity', $item['qty'], $this, $item );
$new_stock = $_product->reduce_stock( $qty );
$this->add_order_note( sprintf( __( 'Item #%s stock reduced from %s to %s.', 'woocommerce' ), $item['product_id'], $new_stock + $qty, $new_stock) );
$this->send_stock_notifications( $_product, $new_stock, $item['qty'] );
}
}
}
do_action( 'woocommerce_reduce_order_stock', $this );
$this->add_order_note( __( 'Order item stock reduced successfully.', 'woocommerce' ) );
}
}
然而,OP的观察是正确的,但包括一个错字。 __return_false()
函数前面有2个下划线而不是1,所以正确的代码是:
add_filter( 'woocommerce_payment_complete_reduce_order_stock', '__return_false' );
从那里我将自定义库存减少功能添加到woocommerce_payment_complete
挂钩。
答案 1 :(得分:0)
function filter_woocommerce_can_reduce_order_stock( $true, $instance ) {
return false;
};
add_filter( 'woocommerce_can_reduce_order_stock','filter_woocommerce_can_reduce_order_stock', 10, 2 );
这帮我解决了这个问题!
答案 2 :(得分:-1)
您应该使用remove_filter函数来代替add_filter。