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
相关产品推荐
相关产品推荐

