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

WordPress wp_ajax出现400 Bad Request错误,如何解决?

修复WordPress wp_ajax 400 Bad Request错误

1. 修正前端Fetch请求的Body格式

直接传递JavaScript对象作为body会导致请求以JSON格式发送,但WordPress的wp_ajax接口默认只解析**表单编码(application/x-www-form-urlencoded)**的数据,这是触发400错误的核心原因。

修复代码:

submitButton.addEventListener('click', (e) => {
    e.preventDefault();
    console.log(siteURL, requestType.value, issuerEmail.value, requestMessage.value);
    
    // 用FormData包装请求参数
    const formData = new FormData();
    formData.append('action', 'submit_support_ticket');
    formData.append('reqType', requestType.value);
    formData.append('issuerEmail', issuerEmail.value);
    formData.append('reqMessage', requestMessage.value);

    fetch(ajaxurl, {
        method: 'POST',
        body: formData
    }).then(res => res.json())
      .then(data => {
          console.log(data);
          // 处理页面提示
          if(data.status === 'success') {
              successMessage.style.display = 'block';
              errorMessage.style.display = 'none';
          } else {
              errorMessage.style.display = 'block';
              successMessage.style.display = 'none';
          }
      }).catch(e => console.log(e));
});

2. 修正后端处理函数的响应逻辑

wp_ajax钩子要求处理完成后必须终止脚本执行,且不能直接return数组,需用wp_send_json()输出标准JSON响应(自动设置HTTP头并终止脚本)。

修复代码:

public function submit_support_ticket()
{
    // 校验必要参数是否存在
    if (!isset($_POST['reqType'], $_POST['issuerEmail'], $_POST['reqMessage'])) {
        wp_send_json([
            'status' => 'error',
            'message' => '缺少必要参数'
        ]);
    }

    $request_type = sanitize_text_field( $_POST['reqType'] );
    $request_issuer = sanitize_email( $_POST['issuerEmail'] );
    $request_message = sanitize_textarea_field( $_POST['reqMessage'] );

    // 验证邮箱格式有效性
    if (!is_email($request_issuer)) {
        wp_send_json([
            'status' => 'error',
            'message' => '邮箱格式无效'
        ]);
    }

    $subject = '';
    switch( $request_type ){
        case '1':
            $subject = '问题类型1';
            break;
        case '2':
            $subject = '问题类型2';
            break;
        case '3':
            $subject = '问题类型3';
            break;
        case '4':
            $subject = '问题类型4';
            break;
        default:
            $subject = '未知类型的支持请求';
    }

    $to = 'user@example.com';
    $headers[] = 'From: Sistema Ticketing WordPress <no-reply@example.com>';
    $headers[] = 'Cc: User <user@example.com>';

    if( wp_mail( $to, $subject, $request_message, $headers ) ){
        wp_send_json([
            'status' => 'success',
            'message' => '工单提交成功,我们会尽快回复您'
        ]);
    } else {
        wp_send_json([
            'status' => 'error',
            'message' => '邮件发送失败,请稍后重试'
        ]);
    }
}

3. 补充CSRF安全验证(强烈推荐)

为防止跨站请求伪造,添加WordPress nonce验证:

  • 前端页面输出nonce(在表单所在模板/插件代码中添加):
    wp_nonce_field('submit_support_ticket_nonce', 'ticket_nonce');
    
  • 前端将nonce加入FormData:
    formData.append('ticket_nonce', document.getElementById('ticket_nonce').value);
    
  • 后端验证nonce:
    public function submit_support_ticket()
    {
        // 先验证nonce
        if (!isset($_POST['ticket_nonce']) || !wp_verify_nonce($_POST['ticket_nonce'], 'submit_support_ticket_nonce')) {
            wp_send_json([
                'status' => 'error',
                'message' => '验证失败,请重试'
            ]);
        }
    
        // 后续逻辑...
    }
    

4. 允许未登录用户提交(按需添加)

如果工单系统对未登录用户开放,需补充wp_ajax_nopriv_前缀的钩子:

// 在插件构造函数中添加
add_action('wp_ajax_submit_support_ticket', [$this, 'submit_support_ticket']);
add_action('wp_ajax_nopriv_submit_support_ticket', [$this, 'submit_support_ticket']);

内容的提问来源于stack exchange,提问作者OHICT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:55:15