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
相关产品推荐
相关产品推荐

