如何针对特定配送方式禁用WooCommerce订单完成邮件通知
实现WooCommerce自提订单禁用完成邮件通知
需求:仅当客户选择配送方式「Retirada no local」(自提)时,禁用WooCommerce的订单完成邮件通知。
你找到的参考代码针对的是「新订单邮件」,且逻辑是仅保留指定配送方式的邮件,和需求逻辑相反。我们可以基于这个思路修改,针对「订单完成邮件」的收件人过滤器,实现当配送方式为「Retirada no local」时清空收件人,从而禁用该邮件。
以下是修改后的代码:
function disable_completion_email_for_local_pickup( $recipient, $order = false ) { // 校验订单对象是否有效 if ( ! $order || ! is_a( $order, 'WC_Order' ) ) { return $recipient; } // 获取订单的配送方式显示名称 $shipping_method = $order->get_shipping_method(); // 当配送方式匹配「Retirada no local」时,清空收件人以禁用邮件 if ( $shipping_method === 'Retirada no local' ) { $recipient = ''; } return $recipient; } // 针对客户订单完成邮件添加过滤器,优先级10,接受2个参数 add_filter( 'woocommerce_email_recipient_customer_completed_order', 'disable_completion_email_for_local_pickup', 10, 2 );
代码说明:
- 使用
woocommerce_email_recipient_customer_completed_order钩子,这是WooCommerce专门控制客户订单完成邮件收件人的过滤器 - 核心逻辑:当配送方式匹配目标名称时,将收件人设为空字符串,WooCommerce会因无收件人停止发送该邮件
- 保留订单对象有效性校验,避免触发错误
如果你的自提配送方式后台slug(如local_pickup)和前台显示名称不一致,可改用以下基于slug判断的代码,适配性更强:
function disable_completion_email_for_local_pickup( $recipient, $order = false ) { if ( ! $order || ! is_a( $order, 'WC_Order' ) ) { return $recipient; } // 遍历订单的配送方式,匹配目标slug foreach ( $order->get_shipping_methods() as $shipping_method ) { if ( $shipping_method->get_method_id() === 'local_pickup' ) { // 替换为你的自提方式slug $recipient = ''; break; } } return $recipient; } add_filter( 'woocommerce_email_recipient_customer_completed_order', 'disable_completion_email_for_local_pickup', 10, 2 );
内容的提问来源于stack exchange,提问作者gmedeirosn
相关产品推荐
相关产品推荐

