仅针对虚拟订单禁用WooCommerce订单处理邮件的问题求助
解决方案:阻止WooCommerce向全虚拟/可下载商品订单发送处理邮件
问题分析
第一段代码报错原因:
remove_action调用逻辑错误,woocommerce_order_status_processing_notification的触发对象并非$order->get_email_recipients(),直接移除动作会干扰结账流程的正常执行。- 选择
woocommerce_order_status_processing钩子的时机不适合做邮件禁用操作,容易引发流程冲突。
第二段代码无效原因:
- 在
woocommerce_thankyou钩子中添加邮件禁用过滤器的时机过晚,订单处理邮件的发送逻辑已经提前执行,过滤器无法生效。
- 在
可行代码实现
以下代码可精准实现需求:自动完成全虚拟/可下载商品订单,并禁用对应订单的处理邮件发送
// 自动完成仅含虚拟/可下载商品的订单 add_action( 'woocommerce_order_status_processing', 'auto_complete_virtual_downloadable_orders', 10, 2 ); function auto_complete_virtual_downloadable_orders( $order_id, $order ) { $only_virtual = true; foreach ( $order->get_items() as $item ) { $product = $item->get_product(); if ( $product && ( !$product->is_virtual() && !$product->is_downloadable() ) ) { $only_virtual = false; break; } } if ( $only_virtual ) { $order->update_status( 'completed' ); } } // 禁用仅含虚拟/可下载商品订单的处理邮件 add_filter( 'woocommerce_email_enabled_customer_processing_order', 'disable_processing_email_for_virtual_orders', 10, 2 ); function disable_processing_email_for_virtual_orders( $enabled, $order ) { if ( !$order ) return $enabled; $only_virtual = true; foreach ( $order->get_items() as $item ) { $product = $item->get_product(); if ( $product && ( !$product->is_virtual() && !$product->is_downloadable() ) ) { $only_virtual = false; break; } } return $only_virtual ? false : $enabled; }
代码说明
auto_complete_virtual_downloadable_orders:在订单进入处理状态时,遍历所有商品判断是否仅含虚拟/可下载类型,若是则自动将订单标记为完成状态。disable_processing_email_for_virtual_orders:通过WooCommerce官方提供的邮件启用过滤器,直接返回false禁用符合条件订单的处理邮件发送,逻辑完全贴合WooCommerce原生机制,不会引发流程错误。
内容的提问来源于stack exchange,提问作者Acephalia
相关产品推荐
相关产品推荐

