WordPress wp_mail函数分步表单点击下一步仅第二次触发问题求助
代码调整方案
问题根因
- 前端未将当前步骤参数传给后端,且全局共用的计数变量
i逻辑不稳定,容易出现步骤计数错位; - 后端查询表单数据无过滤条件,默认取全表第一条记录的步骤值,无法匹配当前用户当前表单的最新步骤,且邮件触发时机可能早于步骤数据更新到数据库的时间,导致一直读取到上一步的状态。
前端代码调整
首先给每个下一步按钮添加自定义属性data-step,对应步骤值1/2/3,示例:
<!-- 第一步按钮 --> <button class="btn-next" data-step="1">下一步</button> <!-- 第二步按钮 --> <button class="btn-next" data-step="2">下一步</button> <!-- 第三步按钮 --> <button class="btn-next" data-step="3">下一步</button>
修改JS代码,点击时直接取按钮自带的步骤值传给后端:
let ajaxurl = 'admin-ajax.php'; jQuery(".btn-next").on("click", function(){ const currentStep = jQuery(this).data('step'); console.log(`第${currentStep}步按钮点击`); jQuery.post(ajaxurl, { action: 'send_mail', step: currentStep }); });
后端代码调整
接收前端传的步骤参数,添加数据库查询过滤条件,补充WordPress AJAX请求必填的结束逻辑:
function send_mail() { global $wpdb; // 接收并校验前端传的步骤参数 $current_step = isset($_POST['step']) ? intval($_POST['step']) : 0; if($current_step <= 0) { wp_die(); } // 替换为你实际的查询条件,比如当前表单记录ID、当前登录用户ID等,不能直接查全表 $current_form_id = 1; $results = $wpdb->get_results( $wpdb->prepare("SELECT * FROM my_table WHERE id = %d", $current_form_id) ); if(!empty($results)){ // 可选校验:确保前端传的步骤和数据库最新更新的步骤一致,防止恶意请求 $step_complete = intval($results[0]->step_completed); if($current_step !== $step_complete) { wp_die(); } // 按步骤发对应邮件 if($current_step == 1){ wp_mail('test@mail.com', '第一步骤完成', '第一步骤已完成'); } elseif($current_step == 2){ wp_mail('test@mail.com', '第二步骤完成', '第二步骤已完成'); } elseif($current_step == 3) { wp_mail('test@mail.com', '第三步骤完成', '第三步骤已完成'); } } wp_die(); // WordPress AJAX请求必须加该函数结束执行 } add_action('wp_ajax_send_mail', 'send_mail'); add_action('wp_ajax_nopriv_send_mail', 'send_mail');
补充注意事项
确保邮件发送请求的触发时机,在当前步骤的数据已经成功更新到数据库之后再调用,避免出现步骤校验不匹配的问题。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

