WordPress通过Ajax无刷新发邮件卡在admin-ajax.php问题求助
存在的问题及修复方案
核心问题列表
- AJAX请求action值与后端钩子不匹配:前端JS提交的
action参数为fiveb_ajax_mail,但后端PHP注册的AJAX钩子是fiveb_function,两者不匹配导致admin-ajax.php找不到对应处理逻辑,无正确返回 - 响应格式不匹配:前端AJAX指定了
dataType: 'json'要求返回JSON格式,但后端直接输出纯文本字符串,导致JSON解析失败,请求进入fail回调无后续响应 - 复选框取值逻辑错误:
piclit_bcc有两个同名同class的表单元素(隐藏域值为0、复选框值为1),直接用jQuery('.piclit_bcc').val()永远只会取到第一个隐藏域的0,无法正确获取用户勾选状态 - PHP存在未定义变量错误:后端判断是否开启BCC时用了未定义的变量
$bcc,实际存储值的变量是$piclit_bcc,变量未定义会触发PHP报错,打断执行流程 - 未提交nonce校验字段:表单中生成了WordPress nonce校验字段,但AJAX提交时未包含该字段,会被后台安全拦截导致请求失败
- 无请求结果处理逻辑:AJAX的done和fail回调仅打印日志,没有对应展示成功/失败提示、关闭弹窗等交互逻辑,用户提交后看不到反馈就会认为页面卡住
修复后代码
修改后的Javascript代码
jQuery('#ajaxformid').submit(function(e) { e.preventDefault(); var piclit_email = jQuery( "#piclit_email" ).val(); if (piclit_email == '') { alert("Please fill in all fields to send an email."); return false; } var founder_piclit = jQuery( "#founder_piclit" ).val(); // 正确获取复选框勾选状态 var piclit_bcc = jQuery('.piclit_bcc:checkbox:checked').length ? 1 : 0; // 获取nonce校验字段 var nonce = jQuery('#fiveb_nonce_field').val(); var formData = { piclit_email: piclit_email, founder_piclit: founder_piclit, piclit_bcc: piclit_bcc, fiveb_nonce_field: nonce, // 修正action值与后端钩子对应 action: 'fiveb_function', }; jQuery.ajax({ type : 'POST', url : '<?php echo admin_url( 'admin-ajax.php' ); ?>', // 调整响应格式为text匹配后端输出 dataType : 'text', data : formData, }).done(function(data) { console.log(data); if(data.indexOf('email sent') !== -1) { jQuery('#ajax_success').show(); jQuery('#ajax_error').hide(); // 可选:2秒后隐藏提示+关闭弹窗,自行替换为你的弹窗关闭逻辑 setTimeout(function(){ jQuery('#ajax_success').hide(); },2000) } else { jQuery('#ajax_error').show(); jQuery('#ajax_success').hide(); } }).fail(function(data) { console.log(data); jQuery('#ajax_error').show(); jQuery('#ajax_success').hide(); }); });
修改后的PHP后端代码
function fiveb_function() { // 新增nonce安全校验 if (!isset($_POST['fiveb_nonce_field']) || !wp_verify_nonce($_POST['fiveb_nonce_field'], 'fiveb_ajax_nonce')) { echo '非法请求'; die(); } $subject = 'View A Founder PIC-LIT from piclits.com'; $piclit_email = strval($_REQUEST['piclit_email']); $founder_piclit = strval($_REQUEST['founder_piclit']); $piclit_bcc = intval($_REQUEST['piclit_bcc']); $headers = array(); // 修正未定义变量问题,重构收件人逻辑 if ($piclit_bcc) { $headers[] = 'Bcc: '.$piclit_email; $to = ''; } else { $to = $piclit_email; } $message = '<html><head><title>Founder PIC-LIT</title></head><body><table border="0" cellspacing="2" cellpadding="20" bgcolor="#ffffff" width="100%"><tbody><tr><td></td><td width="600"><p style="text-align: center">Hello!<br />View A Founder PIC-LIT from <a href="https://piclits.com">piclits.com</a>.</p></td><td></td></tr><tr><td></td><td><img src="'.$founder_piclit.'" alt="Founder PIC-LIT" width="600" style="display:block;width:100%" /></td><td></td></tr></tbody></table></body></html>'; $headers[] = 'From: PIC-LITS <hello@piclits.com>'; $headers[] = 'Content-Type: text/html; charset=UTF-8'; $sent_mail = wp_mail( $to, $subject, $message, $headers ); if ($sent_mail) { echo 'email sent'; die(); } else { echo 'There was an error. Sorry your email was not sent.'; die(); } } add_action("wp_ajax_fiveb_function", "fiveb_function"); add_action("wp_ajax_nopriv_fiveb_function", "fiveb_function");
内容的提问来源于stack exchange,提问作者studebaker
相关产品推荐
相关产品推荐

