防止WooCommerce减少付款库存

时间:2013-12-11 15:29:19

标签: wordpress woocommerce

我正在开发一个通过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中触发的函数中,但仍然没有运气。

非常感谢任何帮助。

3 个答案:

答案 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。