默認(rèn)情況下,WooCommerce的虛擬下載商品在用戶支持付成功后會自動標(biāo)記為“已完成”。但是如果我們的虛擬商品不是可以下載的商品,如優(yōu)惠券,在線充值碼等等,支付成功后,訂單就不能自動標(biāo)記為已完成,這樣的用戶體驗(yàn)顯然是不好的,下面我們來稍微給WooCommerce加點(diǎn)料,讓非下載虛擬商品也支持自動完成功能。
復(fù)制以下代碼到主題的functions.php里面即可。
add_filter( 'woocommerce_payment_complete_order_status', 'virtual_order_payment_complete_order_status', 10, 2 );
function virtual_order_payment_complete_order_status( $order_status, $order_id ) {
$order = new WC_Order( $order_id );
if ( 'processing' == $order_status &&
( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) {
$virtual_order = null;
if ( count( $order->get_items() ) > 0 ) {
foreach( $order->get_items() as $item ) {
if ( 'line_item' == $item['type'] ) {
$_product = $order->get_product_from_item( $item );
if ( ! $_product->is_virtual() ) {
// 如果不是虛擬商品,完成判斷,退出循環(huán)
$virtual_order = false;
break;
} else {
$virtual_order = true;
}
}
}
}
// 如果是虛擬商品,返回已完成
if ( $virtual_order ) {
return 'completed';
}
}
// 對于非虛擬商品,返回訂單狀態(tài)
return $order_status;
}
其實(shí)這是一個很常見的需求,真不知道為什么WooCommerce不提供一個選項(xiàng)來支持這樣的功能,非要讓我們自己動手。


