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

Jai*_*tos 4 php wordpress orders email-notifications woocommerce

Woocommerce 的正常行为是:

  • 如果订单“待处理”(等待付款),则不会发送“新订单”电子邮件
  • 如果订单处于“保留”状态(等待确认),则会发送“新订单”电子邮件。
  • 如果订单立即从“待处理”设置为“处理中”(通过支付网关) - 它会发送“新订单”电子邮件。

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

因此,最终目标是阻止 woocommerce 在订单状态“保留”时发送“新订单”电子邮件,并使其仅(且始终)在状态变为“正在处理”时发送。

首先,我尝试过WooCommerce 向管理员发送电子邮件通知以获取特定订单状态答案代码,该代码非常适合成功触发订单状态“正在处理”的“新订单”电子邮件,但是电子邮件仍然会在订单状态“保留”时发送(因此有时可能会发送两次)。

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

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

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

然后,如果订单状态为“暂停应答代码” ,我尝试禁用 WooCommerce 新订单电子邮件通知。

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

return $order->get_status() === 'on-hold' ? '' : $recipient;
Run Code Online (Sandbox Code Playgroud)

到:

return $order->get_status() === 'processing' ? '' : $recipient;
Run Code Online (Sandbox Code Playgroud)

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

我基本上想记录我对此的挣扎并分享我当前的解决方案,因为似乎有相当多的人有同样的意图,但没有明确简洁和实际功能的方法来做到这一点。

Jai*_*tos 6

这就是我设法使其正常工作的方法,完全消除了所有新订单触发的可能性如 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' ) );
}
Run Code Online (Sandbox Code Playgroud)

并使用以下触发器(由@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 );
}
Run Code Online (Sandbox Code Playgroud)

它可能不干净,很可能不是最优化的方式,但这是我发现的唯一方法,可以成功地使“新订单”电子邮件仅在订单已付款(设置为处理状态)时发送,并希望它能有所帮助其他人。

自 WooCommerce 5+ 起: 允许在 WooCommerce 5+ 中重新发送新订单通知