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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:36:00