You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

筛选博客文章时出现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直接拒接请求。步骤要做全:

    1. 前端页面里先埋好nonce:
      <input type="hidden" id="filter_nonce" value="<?php echo wp_create_nonce('blog_filter_nonce'); ?>">
      
    2. AJAX请求里带上这个值:
      jQuery.ajax({
          url: '/wp-admin/admin-ajax.php',
          type: 'POST',
          data: {
              action: 'filter_blog_posts',
              nonce: jQuery('#filter_nonce').val(),
              // 你的筛选参数
          },
          // 其他配置
      });
      
    3. 后端回调开头先验证:
      function my_blog_filter_callback() {
          if (!wp_verify_nonce($_POST['nonce'], 'blog_filter_nonce')) {
              wp_send_json_error('无效的安全验证');
          }
          // 你的筛选逻辑
          wp_send_json_success($results);
      }
      

    漏了任何一步都会触发400。

  • 检查请求方法和数据格式
    虽然admin-ajax.php支持GET,但用POST更稳妥。确认你AJAX的typePOST,另外数据格式要对:

    • 如果传表单数据,用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

火山引擎 最新活动