筛选博客文章时出现admin-ajax.php 400错误
解决WordPress AJAX筛选器400错误的排查指南
兄弟我太懂这种被AJAX 400错误逼疯的滋味了!折腾Stack Overflow半天没搞定?咱们来把WordPress admin-ajax.php的400问题拆解成几个必查点,一个个排除:
先盯紧action参数的注册匹配
WordPress的AJAX请求核心就是action参数,必须和后端注册的完全一致!你前端AJAX里传的action: 'filter_blog_posts',后端就得对应写:add_action('wp_ajax_filter_blog_posts', 'my_blog_filter_callback'); add_action('wp_ajax_nopriv_filter_blog_posts', 'my_blog_filter_callback'); // 未登录用户也要加这个别小看拼写错误,多一个下划线少个字母直接就触发400。
nonce验证绝对不能少
WordPress的CSRF防护是硬要求,没带有效nonce直接拒接请求。步骤要做全:- 前端页面里先埋好nonce:
<input type="hidden" id="filter_nonce" value="<?php echo wp_create_nonce('blog_filter_nonce'); ?>"> - AJAX请求里带上这个值:
jQuery.ajax({ url: '/wp-admin/admin-ajax.php', type: 'POST', data: { action: 'filter_blog_posts', nonce: jQuery('#filter_nonce').val(), // 你的筛选参数 }, // 其他配置 }); - 后端回调开头先验证:
function my_blog_filter_callback() { if (!wp_verify_nonce($_POST['nonce'], 'blog_filter_nonce')) { wp_send_json_error('无效的安全验证'); } // 你的筛选逻辑 wp_send_json_success($results); }
漏了任何一步都会触发400。
- 前端页面里先埋好nonce:
检查请求方法和数据格式
虽然admin-ajax.php支持GET,但用POST更稳妥。确认你AJAX的type是POST,另外数据格式要对:- 如果传表单数据,用
jQuery('#filter-form').serialize()直接序列化; - 如果传自定义对象,要么用
JSON.stringify()并设置contentType: 'application/json',要么直接传键值对形式;
服务器解析不了数据格式的话,也会返回400。
- 如果传表单数据,用
简化后端代码排查语法问题
有时候回调函数里的语法错误(比如少分号、未定义变量、数组越界)会导致请求失败。先把回调简化到极致:function my_blog_filter_callback() { if (!wp_verify_nonce($_POST['nonce'], 'blog_filter_nonce')) { wp_send_json_error('无效的安全验证'); } wp_send_json_success('测试成功'); }如果这个测试请求能成功,再一点点加回你的筛选逻辑,找到哪段代码出问题。
排查服务器和Permalink设置
- 如果你用了自定义Permalink结构,去WordPress后台「设置-固定链接」里重新保存一遍,刷新rewrite规则;
- 暂时关掉安全插件(比如Wordfence、iThemes Security),看看是不是被防火墙拦截了;
- 检查服务器日志,看看有没有更详细的错误信息(比如权限问题)。
内容的提问来源于stack exchange,提问作者Lee




