如何阻止WooCommerce实物订单设为已完成时发送完成邮件(不影响虚拟产品)
解决方案
可以通过添加自定义代码,基于订单内的产品类型控制「订单完成」邮件的发送逻辑,既保留A类虚拟产品的邮件通知,又阻止B类含实物产品的订单在手动标记完成时发送该邮件。
实现代码
将以下代码添加到当前WordPress主题的functions.php文件末尾,或使用代码片段插件(如Code Snippets)管理:
add_filter( 'woocommerce_email_enabled_order_completed', 'disable_completion_email_for_physical_orders', 10, 2 ); function disable_completion_email_for_physical_orders( $enabled, $order ) { // 遍历订单内所有商品 foreach ( $order->get_items() as $item ) { $product = $item->get_product(); // 若存在非虚拟商品(B类订单),禁用邮件发送 if ( ! $product->is_virtual() ) { return false; } } // 所有商品均为虚拟商品(A类订单),允许发送邮件 return $enabled; }
代码说明
- 借助WooCommerce内置的
woocommerce_email_enabled_order_completed过滤器,拦截「订单完成」邮件的发送判断流程 - 遍历订单内的每一件商品,只要检测到非虚拟商品(对应你的B类含实物配送产品),就返回
false阻止邮件发送 - 对于全虚拟商品的订单(你的A类产品),保持默认的启用状态,确保自动完成时正常发送邮件
测试建议
- 创建A类虚拟产品订单,确认下单后系统自动标记完成并发送「订单完成」邮件
- 创建B类含实物的产品订单,手动添加物流追踪码后标记为已完成,检查是否未发送「订单完成」邮件
内容的提问来源于stack exchange,提问作者diogui
相关产品推荐
相关产品推荐

