WordPress调用admin-ajax.php返回400错误及响应0问题求助
WordPress admin-ajax.php返回400 Bad Request、响应为0的解决方案
核心原因
这个错误本质是WordPress无法匹配到你提交的action对应的后台处理钩子,直接终止请求返回默认值0,同时抛出400状态码。针对你提供的代码,按以下步骤排查修改即可:
排查&修改步骤
- 确认ajax钩子注册逻辑的位置
你写的两个ajax钩子代码:
add_action( 'wp_ajax_nopriv_filter_ajax', 'filter_ajax' ); add_action( 'wp_ajax_filter_ajax', 'filter_ajax' );必须放在主题functions.php文件、或者插件的全局加载文件中,不能被
is_admin()之类的条件判断包裹,否则前端请求时钩子不会被注册,WordPress识别不到filter_ajax这个action。- 确认ajax钩子注册逻辑的位置
- 添加ajax请求校验nonce(绝大部分安全插件/WordPress核心安全策略要求必须传,否则直接拦截请求)
你当前的请求没有携带nonce校验参数,很容易被安全规则拦截,修改代码如下:
修改后的PHP+JS完整代码
add_action( 'wp_footer', function () { ?> <script type='text/javascript' id='ajax'> const ajaxUrl = "<?php echo admin_url('admin-ajax.php'); ?>"; // 新增:输出WordPress生成的校验nonce const ajaxNonce = "<?php echo wp_create_nonce('filter_ajax_nonce'); ?>"; async function httpRequest(url = '', data = {}, method = 'POST') { const response = await fetch(url, { method: method, credentials: 'same-origin', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cache-Control': 'no-cache', }, body: new URLSearchParams(data) }); return response.text(); } document.querySelector('#roll-title-btn').addEventListener('click', async function() { const searchTerm = document.getElementById('roll-title'); if (searchTerm.value.trim().length) { const result = await httpRequest(ajaxUrl, { action: 'filter_ajax', 'roll-title': searchTerm.value, // 新增:携带nonce参数 nonce: ajaxNonce }); console.log(result); } }) </script> <?php } ); add_action( 'wp_ajax_nopriv_filter_ajax', 'filter_ajax' ); add_action( 'wp_ajax_filter_ajax', 'filter_ajax' ); function filter_ajax() { // 新增:校验nonce合法性,不合法直接终止请求 if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'filter_ajax_nonce')) { wp_die('非法请求'); } echo "TESTING"; wp_die(); }- 添加ajax请求校验nonce(绝大部分安全插件/WordPress核心安全策略要求必须传,否则直接拦截请求)
- 确认前端请求的路径正确性
打开浏览器控制台的网络标签,查看发送到admin-ajax.php的请求地址,是否和你站点的后台地址一致,没有出现路径错误、多斜杠、跨域问题。
- 确认前端请求的路径正确性
验证方法
修改后再次触发请求,正常情况下控制台会直接输出TESTING,如果还是返回0,可以在filter_ajax函数第一行加日志输出,确认请求是否走到了处理函数中。
内容的提问来源于stack exchange,提问作者Ramanath
相关产品推荐
相关产品推荐

