WordPress分页失效,始终显示同一组文章求助
解决WordPress the_posts_pagination()分页失效问题
看起来你遇到的核心问题是自定义WP_Query查询没有包含分页参数,同时替换全局$wp_query的方式干扰了分页函数的正常工作。下面是具体的修复步骤和代码:
问题分析
- 你的查询代码
$wp_query->query('cat=-1,-4,-12')没有传递当前分页的页码(paged参数),导致每次查询都只会返回第一页的10篇文章。 the_posts_pagination()默认依赖全局$wp_query的分页数据,但你重新赋值了$wp_query却没有正确初始化分页相关属性,点击分页链接后依然显示第一页内容。
修复后的代码
我们调整查询逻辑,正确传递分页参数,同时优化全局变量的使用避免冲突:
<div class="row"> <?php // 获取当前分页页码,首页默认1 $paged = get_query_var('paged') ? get_query_var('paged') : 1; // 使用自定义查询变量,避免替换全局$wp_query $custom_query = new WP_Query(array( 'cat' => '-1,-4,-12', // 排除指定分类 'posts_per_page' => 10, // 显式指定每页10篇,避免受后台设置影响 'paged' => $paged // 传递分页参数 )); if ($custom_query->have_posts()) : while ($custom_query->have_posts()) : $custom_query->the_post(); ?> <div class="col-md-12"> <div class="single-blog-post"> <div class="blog-post-cat"><?php the_category(', '); ?></div> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <div class="blog-meta"><?php the_time('F j, Y'); ?> <?php the_author_posts_link(); ?></div> <div class="blog-details"> <div class="row"> <div class="col-md-6"> <div class="blog-thumbnail"> <?php if (has_post_thumbnail()) : ?> <?php the_post_thumbnail(); ?> <?php endif; ?> </div> </div> <div class="col-md-6"> <div class="blog-content"> <?php the_content(); ?> <a href="<?php the_permalink(); ?>" class="blog-readmore">Read More</a> </div> </div> </div> </div> </div> </div> <?php endwhile; // 传递自定义查询对象给分页函数,确保分页逻辑正确 the_posts_pagination(array( 'query' => $custom_query, 'mid_size' => 2, // 可选:调整分页链接显示的数量 'prev_text' => __('Previous', 'textdomain'), 'next_text' => __('Next', 'textdomain') )); wp_reset_postdata(); // 恢复全局$post变量,避免后续模板出错 else : // 没有文章时的提示 echo '<p>No posts found.</p>'; endif; ?> </div>
关键修改点说明
- 添加
paged参数:通过get_query_var('paged')获取当前页码,传递给WP_Query,确保查询对应分页的文章。 - 使用自定义查询变量:避免直接替换全局
$wp_query,减少对WordPress默认查询逻辑的干扰,同时在the_posts_pagination()中通过query参数指定我们的自定义查询对象。 - 显式指定
posts_per_page:虽然你后台设置了每页10篇,但显式指定可以确保查询逻辑不受后台设置影响,更可靠。 - 正确重置数据:使用
wp_reset_postdata()恢复全局$post变量,避免后续模板代码出现问题。
如果你坚持要替换全局$wp_query(不推荐,容易引发冲突),可以这样修改原代码:
<div class="row"> <?php $temp = $wp_query; $wp_query = null; $paged = get_query_var('paged') ? get_query_var('paged') : 1; $wp_query = new WP_Query(array( 'cat' => '-1,-4,-12', 'posts_per_page' => 10, 'paged' => $paged )); while ($wp_query->have_posts()) : $wp_query->the_post(); // ... 文章循环代码不变 ... endwhile; the_posts_pagination(); $wp_query = null; $wp_query = $temp; wp_reset_query(); // 恢复全局查询 ?> </div>
这种方式需要用wp_reset_query()来恢复全局$wp_query,但依然不如使用自定义查询变量稳妥。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

