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

WordPress加载更多文章时admin-ajax.php返回400错误原因排查

解决WordPress加载更多文章时admin-ajax.php 400 Bad Request错误

我帮你梳理几个大概率导致这个400错误的原因,结合你给出的代码片段一步步排查:

1. 没加Nonce验证(最常见的坑)

WordPress对AJAX请求有安全验证要求,没带合法的nonce直接就会返回400。你现在的代码里没看到传递nonce的逻辑,得补上:

先在wordpress_my_load_more_scripts函数里添加wp_localize_script,把必要的参数传给JS:

function wordpress_my_load_more_scripts() {
    global $wp_query;
    
    wp_enqueue_script('jquery');
    wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/myloadmore.js', array('jquery') );
    
    // 重点:这里把AJAX需要的参数传给前端JS
    wp_localize_script( 'my_loadmore', 'loadmore_params', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('load_more_posts_nonce'), // 生成安全验证串
        'current_page' => get_query_var('paged') ? get_query_var('paged') : 1,
        'max_page' => $wp_query->max_num_pages,
        'action' => 'my_load_more_action' // 这个要和后面注册的AJAX动作名完全一致
    ) );
    
    wp_enqueue_script( 'my_loadmore' );
}
add_action( 'wp_enqueue_scripts', 'wordpress_my_load_more_scripts' );

然后你的AJAX处理函数里必须验证这个nonce:

function my_load_more_posts() {
    // 先验证nonce,不对直接终止请求
    if ( !wp_verify_nonce( $_POST['nonce'], 'load_more_posts_nonce' ) ) {
        die('验证失败');
    }
    
    // 这里写你的文章查询逻辑
    $paged = $_POST['page'];
    $args = array(
        'post_type' => 'post',
        'paged' => $paged
    );
    $query = new WP_Query($args);
    
    if ( $query->have_posts() ) :
        while ( $query->have_posts() ) : $query->the_post();
            // 输出你的文章模板,比如调用主题的content模板
            get_template_part('content');
        endwhile;
    endif;
    wp_reset_postdata();
    die();
}
// 一定要同时注册登录和未登录用户的AJAX动作
add_action( 'wp_ajax_my_load_more_action', 'my_load_more_posts' );
add_action( 'wp_ajax_nopriv_my_load_more_action', 'my_load_more_posts' );

2. AJAX动作名不匹配

如果你的JS里传的action值和PHP里注册的动作名对不上,也会直接400。比如JS里写的是action: 'load_more',但PHP里注册的是wp_ajax_my_load_more_action,这就完全不搭,必须一字不差。

3. 请求参数缺漏或格式错了

检查你的myloadmore.js里的AJAX请求,确保用POST方式,并且传对了参数:

jQuery(document).ready(function($) {
    $('.load-more-btn').click(function(e) {
        e.preventDefault();
        var button = $(this);
        // 获取当前页码,要么从按钮的data属性取,要么用后台传过来的参数
        var page = button.data('page') || loadmore_params.current_page;
        
        $.ajax({
            url: loadmore_params.ajaxurl,
            type: 'POST', // 必须用POST,GET会被WordPress拦截
            data: {
                action: loadmore_params.action,
                nonce: loadmore_params.nonce,
                page: page + 1 // 请求下一页的内容
            },
            beforeSend: function() {
                button.text('加载中...');
            },
            success: function(response) {
                if (response) {
                    // 把新文章追加到列表容器里
                    $('.posts-container').append(response);
                    button.data('page', page + 1);
                    // 如果已经到最后一页,隐藏按钮
                    if (page + 1 >= loadmore_params.max_page) {
                        button.hide();
                    } else {
                        button.text('加载更多文章');
                    }
                } else {
                    button.hide();
                }
            },
            error: function(xhr) {
                // 打印错误信息,方便排查
                console.log('请求错误:', xhr.responseText);
            }
        });
    });
});

4. 循环查询参数传错了

如果你的文章列表是自定义查询(不是WordPress默认的主循环),那global $wp_query拿到的max_num_pages就不对,得换成你自定义查询的对象。比如:

// 假设你是用自定义查询来显示文章的
$custom_query = new WP_Query(array(
    'post_type' => 'post',
    'posts_per_page' => 6
));
// 传递max_page参数时要用这个
'max_page' => $custom_query->max_num_pages

快速排查小技巧

打开浏览器的开发者工具(按F12),切换到Network标签,找到admin-ajax.php的请求,看Request Payload里的参数是不是都传对了,Response里的错误提示是什么——这能帮你快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:58:09