默认情况下,WooCommerce的虚拟下载商品在用户支持付成功后会自动标记为“已完成”。但是如果我们的虚拟商品不是可以下载的商品,如优惠券,在线充值码等等,支付成功后,订单就不能自动标记为已完成,这样的用户体验显然是不好的,下面我们来稍微给WooCommerce加点料,让非下载虚拟商品也支持自动完成功能。
复制以下代码到主题的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() ) { // 如果不是虚拟商品,完成判断,退出循环 $virtual_order = false; break; } else { $virtual_order = true; } } } } // 如果是虚拟商品,返回已完成 if ( $virtual_order ) { return 'completed'; } } // 对于非虚拟商品,返回订单状态 return $order_status; }
其实这是一个很常见的需求,真不知道为什么WooCommerce不提供一个选项来支持这样的功能,非要让我们自己动手。