
本文详解 WordPress 中使用 WP_Query 实现分页时“始终显示第一页内容”的常见原因及修复方法,重点解决 paged 参数未生效、offset 干扰分页、next_posts_link() 传参错误等核心问题。
本文详解 wordpress 中使用 `wp_query` 实现分页时“始终显示第一页内容”的常见原因及修复方法,重点解决 `paged` 参数未生效、`offset` 干扰分页、`next_posts_link()` 传参错误等核心问题。
在 WordPress 主题开发中,使用 WP_Query 手动构建文章列表并启用分页是高频需求。但许多开发者会遇到一个典型问题:分页链接可点击,URL 也正确变为 /page/2/,但页面内容始终重复显示第一页的 16 篇文章——这并非前端样式或缓存问题,而是后端查询逻辑存在关键疏漏。
? 根本原因分析
你的代码中存在三个关键错误,共同导致分页失效:
offset 与 paged 冲突
'offset' => 5 强制跳过前 5 篇文章,而 WP_Query 在启用 paged 时会自动计算偏移量(offset = (paged - 1) * posts_per_page)。手动指定 offset 将覆盖分页机制,使所有分页请求均从第 6 篇开始取 16 篇,造成“每页内容相同”。next_posts_link() 传参错误
原代码中 next_posts_link( 'Next Page ', $the_query->max_num_pages ) 使用了未定义的 $the_query 变量。正确应传入当前查询对象 $all_catPosts->max_num_pages,否则函数无法判断总页数,返回空链接或默认回退到主查询分页。-
分页上下文未正确传递给分页函数
get_previous_posts_link() 和 get_next_posts_link() 默认作用于主查询($wp_query),而非你的自定义查询 $all_catPosts。必须配合 previous_posts_link() / next_posts_link() 的第二个参数(即最大页数)才能使其适配自定义查询。
WordPress API Pro下载生产级WordPress REST API集成,用于管理文章、页面、媒体、WooCommerce产品、Elementor内容、SEO元数据、ACF及JetEngine字段
✅ 正确实现方式(含修复后完整代码)
移除 offset,修正分页函数调用,并确保 paged 参数被正确识别:
<?php $cat = get_the_category();
$cat_name = !empty($cat) ? esc_html($cat[0]->name) : '';
$paged = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'category_name' => $cat_name,
'posts_per_page' => 16,
'paged' => $paged, // ✅ 必须显式传入
'orderby' => 'date',
'order' => 'DESC'
// ❌ 移除 'offset' => 5 —— 分页与 offset 不兼容
);
$all_catPosts = new WP_Query($args);
?>
<?php if ($all_catPosts->have_posts()) : ?>
<div class="min-h-screen flex items-center justify-center">
<div class="grid grid-cols-4 gap-4">
<?php while ($all_catPosts->have_posts()) : $all_catPosts->the_post(); ?>
<div class="p-5 rounded big_cat_container">
<section><a class="thumbnail_img" href="<?php%20the_permalink();%20?>">
<?php the_post_thumbnail('medium'); ?></a>
</section><h4 class="post_title">
<a href="<?php%20the_permalink();%20?>"><?php the_title(); ?></a>
</h4>
</div>
<?php endwhile; ?>
</div>
<!-- 分页导航(适配自定义查询) -->
<?php if ($all_catPosts->max_num_pages > 1) : ?>
<nav class="pagination" role="navigation"><div class="page-btn nav-next">
<?php // 上一页:需传入 max_num_pages 才能正确生成链接
previous_posts_link('← Previous Page', $all_catPosts->max_num_pages);
?>
</div>
<div class="page-btn nav-previous">
<?php // 下一页:同样需传入 max_num_pages
next_posts_link('Next Page →', $all_catPosts->max_num_pages);
?>
</div>
</nav><?php endif; ?>
</div>
<?php endif; ?><?php wp_reset_postdata(); // ✅ 恢复全局 $post 对象,必不可少 ?>
⚠️ 关键注意事项
- 永远不要在分页查询中使用 offset:若需跳过前 N 篇,应改用 posts_per_page + paged=1 配合 ignore_sticky_posts 或通过 SQL 过滤,或改用 WP_Query 的 post__not_in 参数。
- wp_reset_postdata() 不可省略:它重置全局 $post,避免后续循环(如侧边栏最新文章)受自定义查询影响。
- 分类获取需容错处理:get_the_category() 在非文章页(如首页、页面)可能返回空数组,务必检查 !empty($cat)。
-
分页链接函数选择:
- previous_posts_link() / next_posts_link() → 用于归档页分页(如分类、标签页),需传 max_num_pages
- get_previous_post_link() / get_next_post_link() → 用于单篇文章上下篇导航
? 进阶建议:使用 paginate_links() 实现更灵活分页
若需数字页码(如 « 1 2 3 … 10 »),推荐使用 paginate_links():
$big = 999999999;
$pagination = paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $all_catPosts->max_num_pages,
'prev_text' => '←',
'next_text' => '→',
'type' => 'list',
));
if ($pagination) echo '<div class="pagination">' . $pagination . '</div>';
遵循以上修正,你的分页将严格按 paged 参数加载对应页面数据,彻底告别“千篇一律”的第一页陷阱。










