仅为具有处理状态的已付款订单发送 WooCommerce 新订单电子邮件通知

Send WooCommerce New Order email notification only for paid orders with processing status

Woocommerce 的正常行为是:

我只想在订单状态达到“处理中”时发送“新订单”电子邮件(无论之前的状态如何)

所以最终 objective 是阻止 woocommerce 在订单状态为“保留”时发送“新订单”电子邮件,并使其仅在状态变为“处理中”时(并且总是)发送。

首先,我尝试了 答案代码,该代码非常适合在订单状态为“处理中”时成功触发“新订单”电子邮件,但是电子邮件仍然收到发送订单状态为“保留”(因此有时可能会发送两次)。

尝试通过以下方式禁用处于“保留”状态的“新订单”电子邮件来解决此问题:

管理员 >> Woocommerce >> 设置 >> 电子邮件

然后通过单击管理按钮禁用“新订单”订单电子邮件,这是行不通的(这完全禁用了电子邮件,即使在上述代码处理时触发它也完全停止发送)

然后我尝试了 答案代码。

但是它成功地禁用了新订单电子邮件,但是如果订单从“暂停”变为“处理中”,您根本收不到任何电子邮件,如果新订单直接设置为处理并且您有之前触发电子邮件的代码,那么您也有收到 2 封电子邮件的问题。切换状态自:

return $order->get_status() === 'on-hold' ? '' : $recipient;

至:

return $order->get_status() === 'processing' ? '' : $recipient;

完全禁用“新订单”电子邮件。

我主要是想记录下我的挣扎,并分享我目前的解决方案,因为似乎有很多人有同样的意图,但没有清晰简洁和实际可行的方法来做到这一点。

这是我设法使它正常工作的方法,完全消除了所有新订单触发器的可能性(as provided here by woocommerce):

/**
 * Unhook and remove WooCommerce all default "New Order" emails.
 */

add_action( 'woocommerce_email', 'unhook_those_pesky_emails' );

function unhook_those_pesky_emails( $email_class ) {
    // New order emails
    remove_action( 'woocommerce_order_status_on-hold_to_processing_notification', array( $email_class->emails['WC_Email_New_Order'], 'trigger' ) );
    remove_action( 'woocommerce_order_status_pending_to_on-hold_notification', array( $email_class->emails['WC_Email_New_Order'], 'trigger' ) );
    remove_action( 'woocommerce_order_status_pending_to_processing_notification', array( $email_class->emails['WC_Email_New_Order'], 'trigger' ) );
}

并使用以下触发器(由@LoicTheAztec 提供)

/** 
 * trigger "New Order" email on "processing" status
 */

add_action( 'woocommerce_order_status_processing', 'process_new_order_notification', 20, 2 );
function process_new_order_notification( $order_id, $order ) {
    // Send "New Email" notification (to admin)
    WC()->mailer()->get_emails()['WC_Email_New_Order']->trigger( $order_id );
}

它可能不干净,很可能不是最优化的方式,但这是我发现成功制作“新订单”电子邮件的唯一方式,仅在订单已支付(设置为处理状态)时发送,并且希望它能帮助别人。

Since WooCommerce 5+: