WooCommerce保存变体后wp_mail在foreach中重复发送邮件问题
问题分析与修复方案
核心问题
die()滥用:直接在动作钩子中调用die()会中断WordPress正常执行流程,系统可能判定请求未完成,触发重试机制,这是20分钟后收到重复邮件的主要原因。- 邮件头逻辑问题:
$headers[]采用数组追加模式,若函数被多次触发,会重复添加From头,可能引发邮件发送异常重试。 - 钩子触发未做校验:
woocommerce_save_product_variation可能在变体保存的不同场景下被多次调用,未判断是否为用户主动保存动作,导致重复执行邮件发送。 - 语法错误:原代码中
$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
相关产品推荐
相关产品推荐

