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

标签 php wordpress woocommerce orders email-notifications

Woocommerce 的正常行为是:

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

  • 我只想在订单状态达到“处理中”时发送“新订单”电子邮件(无论以前的状态)
    因此,最终目标是阻止 woocommerce 在订单状态“保留”时发送“新订单”电子邮件,并使其仅(并且始终)在状态变为“正在处理”时发送。
    首先我尝试过 WooCommerce send email notification to admin for specific order status非常适合在订单状态“处理”时成功触发“新订单”电子邮件的应答代码,但是电子邮件仍会在订单状态“保留”时发送(因此有时可能会发送两次)。
    尝试通过以下方式禁用处于“保留”状态的“新订单”电子邮件来解决此问题:
    管理 >> Woocommerce >> 设置 >> 电子邮件
    然后通过单击管理按钮禁用“新订单”订单电子邮件,不起作用(这完全禁用了电子邮件并且即使在由上述代码处理时触发它也完全停止发送)
    然后我尝试了 Disable WooCommerce New order email notification if order status is On hold答案代码。
    然而,它成功禁用了新订单电子邮件,但如果订单从“暂停”变为“处理中”,您根本不会收到任何电子邮件,并且如果新订单直接设置为处理并且您有之前的触发代码电子邮件,那么您也有收到 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 in this thread 提供)
    /** 
     * 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+: Allow re-sending New Order Notification in WooCommerce 5+

    关于php - 仅针对具有处理状态的付费订单发送 WooCommerce 新订单电子邮件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66174751/

    相关文章:

    woocommerce - 为什么订单完成后我不能添加项目元?

    PHP:变量在函数内部不起作用?

    php 删除 $_POST 上的键

    CSS 菜单下拉消失

    wordpress - 在wordpress中获取多个用户的元数据

    javascript - 使用按钮更改同一父容器中输入字段中的数字

    wordpress - template_include 停止处理 woocommerce 更新

    php 计数分组值

    php - 使用 php 和 pdo 插入的表单

    audio - 仅在首页中的音频播放器