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

Php 仅针对处于处理状态的已付款订单发送新订单电子邮件通知,php,wordpress,woocommerce,orders,email-notifications,Php,Wordpress,Woocommerce,Orders,Email Notifications,商业的正常行为是: 如果订单“待定”(等待付款),则不会发送“新订单” 订购“电子邮件 如果订单“暂停”(等待确认),则发送“新订单”电子邮件 如果订单立即从“待定”设置为“处理”(通过 支付网关)-它发送“新订单”电子邮件 我只想在订单状态达到“处理”时发送“新订单”电子邮件(无论以前的状态如何) 因此,最终的目标是阻止woocommerce在订单状态为“保留”时发送“新订单”电子邮件,并使其仅在状态变为“处理”时发送(并且始终发送) 首先,我尝试了应答代码,该代码非常适合在订单状态为“处

商业的正常行为是:

  • 如果订单“待定”(等待付款),则不会发送“新订单” 订购“电子邮件
  • 如果订单“暂停”(等待确认),则发送“新订单”电子邮件
  • 如果订单立即从“待定”设置为“处理”(通过 支付网关)-它发送“新订单”电子邮件
我只想在订单状态达到“处理”时发送“新订单”电子邮件(无论以前的状态如何)

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

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

尝试通过转到以下位置禁用“保留”状态下的“新订单”电子邮件来解决此问题:

管理>>电子商务>>设置>>电子邮件

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

然后我试着回答密码

但是,它成功地禁用了新订单电子邮件,但是如果订单从“保留”变为“处理”,则您根本不会收到任何电子邮件,如果新订单直接设置为“处理”,并且您具有以前触发电子邮件的代码,则您也会遇到接收2封电子邮件的问题。从以下位置切换状态:

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

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


我基本上是想记录我在这方面的努力,并分享我目前的解决方案,因为似乎有相当多的人有同样的意图,但没有明确、简洁和实际的功能方式来完成这项工作。

这就是我设法使其正常工作的原因,完全消除了所有新的订单触发可能性():

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

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

自WooCommerce 5+以来:

重要提示:请参阅此线程:
return $order->get_status() === 'processing' ? '' : $recipient;
/**
 * 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' ) );
}
/** 
 * 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 );
}