讓 WooCommerce 在付款完成才扣庫存數量

日前有網友提問到可否在我開發的 RY WooCommerce Tools 當中加入付款完成才進行扣除庫存的功能。
不過這次讓網友小小的失望,因為我並不會替該外掛加入這功能,最主要是因為風險考量的關係,所以我不打算將其寫入外掛當中,反而是另外寫這篇文章來教大家,如何自行達成這功能。

在開始教學之前,要先說明為什麼我不願意將這功能直接加入我的外掛當中。

風險是可能會導致你的庫存數量為負數

以下就讓我來舉個例子說明一下。
商品A 的庫存數量為 1 。
使用者A 在晚上八點的時候下單購買 商品A 並且選擇 超商代碼繳費。
使用者B 在晚上十點的時候也來想要購買 商品A ,看還有庫存數量 1 (使用者A 尚未繳費,所以庫存數量為 1)下單並且信用卡繳費完成,這時候庫存變為 0。
使用者A 隔天早上出門買早餐順便去超商繳費,完成繳費後 商品A 的庫存數量就會變成 -1 了。
這時候請問最後一件 商品A 應該出貨給誰?事先成立訂單的 使用者A 還是先繳費的 使用者B 。別問我,這就是我不願意在寫入外掛的原因了。

那如果只有開放信用卡結帳就不會有問題嗎?
整個結帳的流程為,確認前往付款(訂單成立),使用者離開網站到綠界的結帳頁面,輸入信用卡號,等待並輸入綠界的簡訊驗證,然後再回到網站(觸發繳費成功)。
中間還是會有數分鐘的時間差存在。

如果你清楚可能遭遇的風險且願意承擔,那麼就繼續看下去吧!

 

首先,開啟你佈景主題的 functions.php 檔案,然後將下列的內容加入其中。
記住,如果你檔案的結尾是 ?> 的情況下,要加入在他之前。

add_action('woocommerce_init', 'reduce_when_paid');

function reduce_when_paid() {
	// 設定未付款不進行扣除庫存的動作
	add_filter('woocommerce_can_reduce_order_stock', 'not_reduce_before_paid', 10, 2);

	// 當狀態變更為 處理中 進行扣除庫存
	add_action('woocommerce_order_status_processing', 'wc_maybe_reduce_stock_levels');
}

function not_reduce_before_paid($do, $order) {
	return ! is_null( $order->get_date_paid() );
}

如此一來,各位就可以將商品庫存扣除訂購數量這件事情,由原先的訂單成立之時調整為付款成功或是狀態變更為處理中之時。
會加入狀態變更為處理中也會扣除數量是因為,如果你在後台直接將訂單狀態調整為【處理中】的情況下,會註記付款完成但是不會觸發付款完成事件。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *