这应该是一个比较常见的功能需求了,虚拟物品由于不需要进行送货,用户付款后即可算作订单完成,以便网站统计订单后进行更多操作,用户也可能籍此获得一些其他的优惠或者权益。这一切都需要前一个订单在没有人工干预的状态下自动完成。
首先,官方文档中给出了直接完成订单的代码:
1 2 3 4 5 6 7 8 | add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order'); function custom_woocommerce_auto_complete_order( $order_id ) { if ( ! $order_id ) { return; } $order = wc_get_order( $order_id ); $order->update_status( 'completed' ); } |
以上代码并没有对订单做任何判断。
我们需要做的是对订单内的物品进行统计,只有当所有商品都为虚拟物品的时候,订单才会自动完成。
恩下面这段代码也不是我自己写的,这里只是想研究一下。来自:https://www.skyverge.com/blog/how-to-set-woocommerce-virtual-order-status-to-complete-after-payment/
其中第一个参数$order_status要求为’processing’,也就是订单已支付,等待管理员处理的状态;并且到第二个参数订单号中再读取一下这个订单原来的状态,必须为等待支付,或者支付失败…不知道为什么要加一个failed的状态。从官方文档中得知failed状态一般为支付等待期内,没有收到款项,系统自动给的状态,这里去掉或许会更好,但并不影响代码执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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; } |
以上代码亲测有效,已用在自己的项目中,特此记录。
本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1669.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
通过使用register_order_status_name的功能,现在您可以轻松注册自定义WooCommerce订单状态
function register_shipment_arrival_order_status() {
register_post_status( ‘wc-arrival-shipment’, array(
‘label’ => ‘Shipment Arrival’,
‘public’ => true,
‘show_in_admin_status_list’ => true,
‘show_in_admin_all_list’ => true,
‘exclude_from_search’ => false,
‘label_count’ => _n_noop( ‘Shipment Arrival (%s)’, ‘Shipment Arrival (%s)’ )
) );
}
https://www.cloudways.com/blog/create-woocommerce-custom-order-status