WordPress前端AJAX发布文章报400错误排查求助
WordPress前端AJAX发布文章400 Bad Request错误排查修复
核心问题
WordPress的AJAX请求必须携带action参数,用来匹配wp_ajax_{action}和wp_ajax_nopriv_{action}钩子对应的处理函数,你的请求里缺失这个关键参数,这是触发400错误的主要原因。
分步修复
1. 修正AJAX代码
- 给FormData添加
action参数,值对应PHP钩子的后缀名my_ajax_handler - 用本地化的
my_ajax_object.ajax_url替代硬编码的地址,适配不同部署环境 - 补充错误回调,方便调试排查
修改后的AJAX代码:
jQuery(document).ready(function($) { $('#submit').on('click', function(e){ e.preventDefault(); let title = $('#title').val(); let content = $('#content').val(); var formData = new FormData(); formData.append('image', document.getElementById('image-input').files[0]); formData.append('var1', title); formData.append('var2', content); // 必须添加的action参数,和PHP钩子对应 formData.append('action', 'my_ajax_handler'); $.ajax({ // 使用本地化的AJAX地址 url: my_ajax_object.ajax_url, type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { console.log(response); }, // 新增错误回调,便于调试 error: function(xhr, status, error) { console.log('请求出错:', xhr.status, error); } }); }) });
2. 修正PHP代码
- AJAX处理函数末尾必须调用
wp_die(),终止输出,避免返回多余内容导致请求异常 - 修正
wp_insert_post的post_name参数:该字段是文章别名(slug),不要设置为pending(这是文章状态值) - 补充参数校验和错误反馈逻辑,让前端能明确知道问题所在
- 对用户输入做安全过滤,避免XSS等风险
修改后的PHP处理函数:
function my_ajax_handler() { // 先校验必要参数是否存在 if (!isset($_POST['var1']) || !isset($_POST['var2']) || !isset($_FILES['image'])) { wp_send_json_error('缺少必要参数'); } // 安全过滤用户输入 $post_title = sanitize_text_field($_POST['var1']); $post_content = wp_kses_post($_POST['var2']); $image = $_FILES['image']; $new_post = array( 'post_title' => $post_title, 'post_content' => $post_content, 'post_status' => 'publish', // 自动生成文章别名,替代错误的pending值 'post_name' => sanitize_title($post_title) ); $pid = wp_insert_post($new_post); // 检查文章创建是否成功 if (is_wp_error($pid)) { wp_send_json_error('文章创建失败: ' . $pid->get_error_message()); } add_post_meta($pid, 'meta_key', true); if (!function_exists('wp_generate_attachment_metadata')) { require_once(ABSPATH . "wp-admin" . '/includes/image.php'); require_once(ABSPATH . "wp-admin" . '/includes/file.php'); require_once(ABSPATH . "wp-admin" . '/includes/media.php'); } $attach_id = 0; if ($_FILES) { foreach ($_FILES as $file => $array) { if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) { wp_send_json_error('上传错误: ' . $_FILES[$file]['error']); } $attach_id = media_handle_upload($file, $pid); if (is_wp_error($attach_id)) { wp_send_json_error('图片处理失败: ' . $attach_id->get_error_message()); } } } if ($attach_id > 0) { update_post_meta($pid, '_thumbnail_id', $attach_id); } wp_send_json_success('文章发布成功,ID: ' . $pid); // 必须调用wp_die终止输出,避免返回多余内容 wp_die(); } add_action("wp_ajax_my_ajax_handler", "my_ajax_handler"); add_action("wp_ajax_nopriv_my_ajax_handler", "my_ajax_handler");
3. 额外优化建议
- 权限控制:如果允许未登录用户发布文章,建议将文章默认状态设为
pending待审核,避免垃圾内容直接发布 - 文件校验:添加图片类型、大小的验证逻辑,防止非法文件上传
- 表单验证:前端增加输入字段非空校验,减少无效请求
内容的提问来源于stack exchange,提问作者Amir Sandila
相关产品推荐
相关产品推荐

