You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress调用admin-ajax.php返回400错误及响应0问题求助

WordPress admin-ajax.php返回400 Bad Request、响应为0的解决方案

核心原因

这个错误本质是WordPress无法匹配到你提交的action对应的后台处理钩子,直接终止请求返回默认值0,同时抛出400状态码。针对你提供的代码,按以下步骤排查修改即可:

排查&修改步骤

    1. 确认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。

    1. 添加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();
    }
    
    1. 确认前端请求的路径正确性
      打开浏览器控制台的网络标签,查看发送到admin-ajax.php的请求地址,是否和你站点的后台地址一致,没有出现路径错误、多斜杠、跨域问题。

验证方法

修改后再次触发请求,正常情况下控制台会直接输出TESTING,如果还是返回0,可以在filter_ajax函数第一行加日志输出,确认请求是否走到了处理函数中。

内容的提问来源于stack exchange,提问作者Ramanath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:45:03