讓 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() );
}

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

Hi Richer

對於你整合綠界、藍新的外掛,受用蠻多的
請問你有在接金流外掛的開發嗎?
我們公司做了一套QR Code收款系統,為了擴大使用效益,讓供應商也能快速建置商城並使用我們的收款系統,評估後WC是蠻符合我們的使用場景,所以我們要開發一組外掛
訂單結帳時能生成QR code,收款單受款後,銷帳通知送到WC,能自動變動訂單狀態為[已付款]

我們公司是亞買訊創意生活股份有限公司
我們專注在移工市場的零售銷售

希望能有機會討論一下合作的機會

您好
已經將內容加入檔案中,也成功於刷卡後才扣庫存。但如果是超商貨到付款,就無法因為狀態為處理中而扣庫存,手動更新狀態為處理中或者完成也都無法扣庫存,想請問這是只能套用在付款方式為刷卡跟超商代碼嗎?

您好,將以上內容加入functions.php 檔案,信用卡付款完成後,訂單狀態在處理中會扣庫存(在等待付款中不會扣庫存)–正常,但超商取貨付款狀態在”處理中”卻不會扣庫存,須將狀態變更為運送中或已完成才會扣庫存,請問這是正常的嗎?

發表留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料