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

WordPress Ajax加载文章返回400 Bad Request错误求助

WordPress Ajax加载更多文章返回400错误排查与修复

问题现状

自定义博客首页初始通过WP_Query加载3篇文章,滚动触发Ajax加载更多时,前端收到0响应,控制台显示XHR状态码400(Bad Request),该脚本在其他站点可正常运行。

核心问题与修复步骤

1. 缺少Ajax动作处理函数(最关键原因)

前端Ajax请求指定了action: 'more_post_ajax',但后台未注册对应的处理钩子,导致admin-ajax.php无法识别请求,返回默认的0和400错误。

修复方法:在主题的functions.php中添加以下代码

// 处理登录用户的Ajax请求
add_action('wp_ajax_more_post_ajax', 'load_more_posts_callback');
// 处理未登录用户的Ajax请求(必须添加,否则前台游客无法使用)
add_action('wp_ajax_nopriv_more_post_ajax', 'load_more_posts_callback');

function load_more_posts_callback() {
    // 验证请求合法性
    check_ajax_referer('load_more_nonce', 'security');

    $paged = isset($_POST['pageNumber']) ? intval($_POST['pageNumber']) : 1;
    $ppp = isset($_POST['ppp']) ? intval($_POST['ppp']) : 3;

    $args = array(
        'posts_per_page' => $ppp,
        'post_type'      => 'post',
        'orderby'        => 'date',
        'order'          => 'DESC',
        'paged'          => $paged,
        'post_status'    => 'publish'
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) :
        while ($query->have_posts()) : $query->the_post(); ?>
            <li>
                <a class="link" href="<?php echo get_the_permalink(); ?>" rel="noopener noreferrer">
                    <img class="img" src="<?php the_post_thumbnail_url('full'); ?>" alt="" loading="lazy">
                    <div class="text">
                        <span><?php echo get_the_date('F j - Y'); ?></span> <span class="gray-dot__circle"></span> <span><?php echo gp_reading_time($post); ?> read</span>
                        <h3><?php echo get_the_title(); ?></h3>
                    </div>
                </a>
            </li>
        <?php endwhile;
        wp_reset_postdata();
    endif;

    wp_die(); // 必须终止输出,避免额外内容干扰
}

同时,在本地化脚本中添加nonce字段防止CSRF攻击:

if (is_page_template('blog.php')) {
    wp_register_script( 'loadmore-script', get_template_directory_uri() . '/js/loadmore.js', array( 'jquery' ), NULL, true);
    wp_enqueue_script( 'loadmore-script' );
    wp_localize_script('loadmore-script', 'blog_ajax', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'noposts' => __('No older posts found', 'outstanding'),
        'nonce'   => wp_create_nonce('load_more_nonce') // 添加nonce验证字段
        )
    );
}

前端Ajax请求中携带nonce参数:

str = {
    action: 'more_post_ajax',
    pageNumber: pageNumber,
    ppp: ppp,
    security: blog_ajax.nonce // 新增nonce验证字段
};

2. jQuery选择器不匹配

前端代码中使用.banking-fintech__flexbox作为容器选择器,但博客页面中实际的文章列表容器是.flexbox,会导致滚动触发逻辑失效。

修复方法:将前端代码中所有.banking-fintech__flexbox替换为.flexbox

// 原触发条件代码
if ($(window).scrollTop() >= $('.banking-fintech__flexbox').offset().top + $('.banking-fintech__flexbox').outerHeight() - window.innerHeight) {
// 修复后
if ($(window).scrollTop() >= $('.flexbox').offset().top + $('.flexbox').outerHeight() - window.innerHeight) {

// 原追加内容代码
$(".banking-fintech__flexbox").append($data).delay(2000);
// 修复后
$(".flexbox").append($data).delay(2000);

3. max_page赋值位置不规范

博客页面中$max_page = $query->max_num_pages;写在while循环内部,会被重复赋值,虽不影响功能但不符合代码规范。

修复方法:将该语句移到循环外部

<?php 
$args2 = array(
    'posts_per_page' => 3,
    'post_type' => 'post',
    'orderby' => 'date',
    'order'   => 'DESC',
    'paged' => 1,
);

$query = new WP_Query($args2);
$max_page = $query->max_num_pages; // 移到循环外部定义
?>
<section class="mainblock">
    <!-- ... 其他代码 ... -->
    <?php if ($query->have_posts()): while($query->have_posts()): $query->the_post(); ?>
        <!-- ... 文章列表项 ... -->
    <?php endwhile;
    echo '<input type="hidden" id="max_page" name="max_page" value="'.$max_page.'" />';
    endif; ?>
</section>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:14:58