WordPress Ajax请求返回400(Bad request)错误,寻求问题排查
排查WordPress Ajax返回400 Bad Request的问题
从你给出的代码片段来看,最核心的问题大概率是没给Ajax处理函数注册WordPress专属的钩子,再加上前端请求可能缺少关键参数,才导致了400错误。下面一步步帮你定位解决:
1. 必须为Ajax函数注册钩子
WordPress的Ajax请求是通过admin-ajax.php统一处理的,你需要给send_message_function注册wp_ajax_*和wp_ajax_nopriv_*钩子,否则系统找不到对应的处理逻辑,直接返回400。
修改你的functions.php,添加这两行代码:
// 允许登录用户触发这个Ajax请求 add_action('wp_ajax_send_message', 'send_message_function'); // 允许未登录用户触发(如果你的功能需要对外开放的话) add_action('wp_ajax_nopriv_send_message', 'send_message_function');
这里的send_message是你前端请求里必须传递的action参数值,要和钩子名称的后缀完全一致。
2. 前端Ajax请求必须包含action参数
确保你的main.js里的Ajax请求正确传递了action参数,示例代码如下:
jQuery.ajax({ url: WPaAjax.ajaxurl, // 用wp_localize_script传递的正确地址 type: 'POST', data: { action: 'send_message', // 必须和钩子后缀匹配 // 这里可以加其他需要传递的参数,比如表单数据 }, success: function(response) { console.log(response); // 应该能打印出'YES!' }, error: function(xhr) { console.log(xhr.statusText); } });
如果前端没传这个action参数,admin-ajax.php根本不知道要调用哪个函数,直接返回400错误。
3. 其他可能的排查点
- 确认请求地址正确:在浏览器控制台打印
console.log(WPaAjax),检查ajaxurl的值是不是正确的wp-admin/admin-ajax.php路径。 - 请求方法与参数传递:优先用POST请求(WordPress对POST的兼容性更好),确保所有参数都放在
data对象里,不要拼在URL上(GET请求也可以,但容易出现参数丢失或编码问题)。 - 安全验证(可选但推荐):虽然不是400错误的直接原因,但为了安全,建议添加nonce验证。修改你的
load_scripts函数:
function load_scripts() { wp_enqueue_script('jquery'); wp_enqueue_script('main_js', get_stylesheet_directory_uri() . '/dist/scripts/main.js', array('jquery'), true); wp_localize_script('main_js', 'WPaAjax', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('send_message_nonce') // 生成验证串 )); }
前端请求里加上_wpnonce: WPaAjax.nonce,再在PHP函数开头验证:
function send_message_function() { if (!wp_verify_nonce($_POST['_wpnonce'], 'send_message_nonce')) { wp_die('非法请求'); } echo 'YES!'; exit; }
按照上面的步骤调整后,应该就能解决400错误的问题了。
内容的提问来源于stack exchange,提问作者drake035
相关产品推荐
相关产品推荐

