本篇文章更新時間:2023/05/19
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
預設內建針對數位虛擬商品下單流程還是有一個確認是否收到款項的過程。 結帳後建立訂單到客戶刷卡完,通常金流這塊,WooCommerce 網站只會讓該筆訂單到「處理中」的狀態。
雖然這也沒有什麼問題,就是通常有兩個以下情況:
- 完成訂單後才會開通某個商品更進階權限的需求
- 已經刷卡了,除非認定是盜刷,主動向銀行取消支付,不然其實也等同支付了。要人工去特別轉「完成」的訂單狀態有點多一步驟。
所以「如果是虛擬的數位商品」就「自動」於收款後將訂單狀態「轉為完成」,這樣的修正也算是一種強化使用體驗。程式碼如下:
// 自動完成只有虛擬商品的訂單狀態
function mxp_check_order_status_completed($order_id, $old_status, $new_status) {
if ($new_status == 'processing') {
$check_virtual_product = true;
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product(); // Get the product object
// 確認訂單中商品是否「全部」都是虛擬數位商品
if ($product && $product->is_virtual()) {
// 是虛擬的,不做任何事
// $check_virtual_product = true;
} else {
// 有不是虛擬的,把識別參數改一下狀態並離開判斷
$check_virtual_product = false;
break;
}
}
if ($order && $check_virtual_product === true) {
$order->update_status('completed', '(系統)已自動完成訂單。', true);
}
}
}
add_action('woocommerce_order_status_changed', 'mxp_check_order_status_completed', 10, 3);
上述範例的邏輯僅適用於「整個訂單中都是數位虛擬商品」的條件。避免如果有夾帶一般需要出貨的商品,可能因為訂單轉成「完成」後就忘記出貨。
所以這邊後續還需要注意,如果是這樣情況下的訂單,那虛擬數位商品有授權要處理的話,也要另外做開通。(又或是改成「處理中」就算開通了的情境)