2013-12-11 113 views
0

我正在處理通過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上觸發,但仍然沒有運氣。

任何幫助非常感謝。

回答

-1

而不是add_filter,您應該使用remove_filter函數。

+0

你能解釋一下嗎?當然,我需要在該鉤子上添加一個過濾器來返回false並阻止reduce_order_stock()函數運行?我試圖改變過濾器,但它不起作用,股票仍然減少付款。 – iainc

+0

您不會刪除過濾器,您需要返回「false」值。 – helgatheviking

1

這是舊的,但如果你不想WooCommerce管理股票,你可以告訴整個商店不要管理期權中的股票。或者,單獨在每個產品上。

研究WC_Abstract_Order類中的reduce_order_stock()方法顯示,在這些情況下庫存不會減少。

/** 
* 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鉤。

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); 

這幫我解決了這個問題!