如何在用户邮箱验证后触发带正确样式的WooCommerce默认欢迎邮件
解决BitForm邮箱确认后触发WooCommerce新用户邮件样式问题
问题分析
你遇到的核心问题是:邮箱确认后触发邮件时,Kadence Email Customizer的自定义模板(包括样式、页脚)没有被正确加载。这是因为直接调用trigger()或woocommerce_created_customer动作时,WooCommerce邮件对象未完全初始化,Kadence的模板过滤钩子没有被触发。
解决方案
以下代码会确保邮件对象完整初始化,同时触发Kadence需要的模板加载逻辑,保证邮件样式和格式正确:
add_action('updated_user_meta', 'send_woocommerce_welcome_email_after_confirmation', 10, 4); function send_woocommerce_welcome_email_after_confirmation($meta_id, $user_id, $meta_key, $meta_value) { // 仅处理bf_activation从0更新为1的场景 if ($meta_key !== 'bf_activation' || $meta_value != 1) { return; } // 验证旧值为0,避免重复触发邮件 $old_activation_value = get_user_meta($user_id, 'bf_activation', true); if ($old_activation_value != 0) { return; } // 确保WooCommerce及邮件组件已加载 if (!class_exists('WooCommerce') || !isset(WC()->mailer)) { return; } $user = get_userdata($user_id); if (!$user) { return; } $mailer = WC()->mailer(); $email_class = 'WC_Email_Customer_New_Account'; // 初始化邮件对象(若未自动加载) if (!isset($mailer->emails[$email_class])) { $mailer->emails[$email_class] = new $email_class(); $mailer->emails[$email_class]->init(); } $email = $mailer->emails[$email_class]; // 强制加载Kadence自定义邮件模板路径 add_filter('woocommerce_email_template_base_path', function($default_path) { $kadence_template_path = WP_CONTENT_DIR . '/uploads/kadence-email-customizer/woocommerce/'; return file_exists($kadence_template_path) ? $kadence_template_path : $default_path; }, 10); // 填充邮件必要数据 $email->object = $user; $email->recipient = $user->user_email; $email->find = ['{user_login}', '{user_email}', '{blogname}', '{site_url}']; $email->replace = [$user->user_login, $user->user_email, get_option('blogname'), get_option('siteurl')]; // 应用主题和标题的过滤钩子 $email->subject = apply_filters('woocommerce_email_subject_customer_new_account', $email->get_option('subject'), $user); $email->heading = apply_filters('woocommerce_email_heading_customer_new_account', $email->get_option('heading'), $user); // 发送邮件,确保完整模板被渲染 $email->send( $email->recipient, $email->subject, $email->get_content(), $email->get_headers(), $email->get_attachments() ); }
关键修复点
- 重复触发防护:检查
bf_activation的旧值是否为0,避免用户多次触发确认动作时重复发送邮件。 - 邮件对象初始化:手动实例化并调用
init()方法,确保WooCommerce邮件的所有配置(包括Kadence的模板过滤)都被加载。 - 模板路径强制加载:通过
woocommerce_email_template_base_path过滤器指定Kadence的自定义模板目录,确保样式和页脚被正确渲染。 - 完整数据填充:手动设置邮件的占位符替换变量,保证邮件内容的动态数据正确显示。
内容的提问来源于stack exchange,提问作者Pomas
相关产品推荐
相关产品推荐

