You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce保存变体后wp_mail在foreach中重复发送邮件问题

问题分析与修复方案

核心问题

  1. die()滥用:直接在动作钩子中调用die()会中断WordPress正常执行流程,系统可能判定请求未完成,触发重试机制,这是20分钟后收到重复邮件的主要原因。
  2. 邮件头逻辑问题:$headers[]采用数组追加模式,若函数被多次触发,会重复添加From头,可能引发邮件发送异常重试。
  3. 钩子触发未做校验:woocommerce_save_product_variation可能在变体保存的不同场景下被多次调用,未判断是否为用户主动保存动作,导致重复执行邮件发送。
  4. 语法错误:原代码中$arrayEmails定义后缺少分号,会引发代码执行异常。

修复后的代码

add_action( 'woocommerce_save_product_variation', 'bbloomer_save_custom_field_variations', 10, 2 );
function bbloomer_save_custom_field_variations( $variation_id, $i ) {
    // 仅在用户主动保存变体且请求合法时执行
    if ( ! isset( $_POST['save_variation'] ) || ! wp_verify_nonce( $_POST['woocommerce_meta_nonce'], 'woocommerce_save_data' ) ) {
        return;
    }

    $arrayEmails = array(
        'myemail@test.nl',
        'myemail@test.nl',
        'myemail@test.nl',
        'myemail@test.nl',
        'myemail@test.nl',
    );

    // 直接初始化数组,避免重复追加头部信息
    $headers = array( 'From: Mail sender <info@mailsender.nl>' );
    
    foreach( $arrayEmails as $email ) {
        wp_mail( $email, 'Mail subject', '<p>This is the mail content</p>', $headers );
    }
}

关键修复点

  • 移除die():让WordPress完成完整的保存流程,避免系统触发请求重试。
  • 添加请求合法性校验:通过wp_verify_nonce验证请求来源,同时检查save_variation标识,确保仅在用户主动保存变体时执行邮件发送。
  • 修正邮件头定义:直接初始化数组,避免多次触发时重复添加From头。
  • 修复语法错误:补充$arrayEmails定义后的分号,保证代码正常运行。

内容的提问来源于stack exchange,提问作者JanineML

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:50:43