
本文介绍如何在 wordpress 中为静态页面(而非文章)实现分页导航,通过自定义 wp_query 查询所有页面并调用 paginate_links() 生成带链接的页码,使用户可在多个独立页面间跳转。
在 WordPress 默认机制中,paginate_links() 主要用于文章归档(如博客列表)的分页,而静态页面(post_type = 'page')通常不参与分页逻辑——因为页面默认是独立、非序列化的。但实际开发中,常有需求将多个页面组织成“多步骤向导”“产品功能介绍”或“分章节文档”,此时需在页面底部添加类似「1 2 3 下一页」的导航,且每个数字对应一个真实页面(如 /page-1/、/page-2/),而非文章分页。
实现该效果的核心思路是:将页面视为可分页的数据集,通过 WP_Query 查询所有(或指定条件的)页面,并启用 paged 参数支持分页;再配合 paginate_links() 生成语义化、SEO 友好的分页链接。
以下是完整、可直接集成到主题模板(如 page.php 或自定义页面模板)中的代码示例:
'page',
'post_status' => 'publish',
'posts_per_page' => 5,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
'orderby' => 'menu_order title', // 按菜单顺序+标题排序,确保可控性
'order' => 'ASC'
);
$pages_query = new WP_Query($args);
?>
have_posts()) : ?>
have_posts()) : $pages_query->the_post(); ?>
str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $pages_query->max_num_pages,
'prev_text' => __('« 上一页', 'textdomain'),
'next_text' => __('下一页 »', 'textdomain'),
'type' => 'list', // 输出为 结构,便于样式控制
));
?>
✅ 关键说明与注意事项:
- URL 重写支持:上述代码依赖 WordPress 的分页参数(如 ?paged=2)。若希望使用更友好的结构(如 /pages/page/2/),需确保已启用「固定链接」并在 .htaccess 中正确配置重写规则(标准 WordPress 设置即可满足)。
- 页面排序至关重要:由于页面无天然时间顺序,务必通过 'orderby' => 'menu_order title' 明确排序依据,否则分页结果可能不稳定。建议在后台页面列表中设置「页面属性 → 顺序」值以统一控制。
- 性能优化提示:若站点页面数量庞大(>500),全量查询所有页面可能影响性能。此时可改用 'post__in' => [123, 456, 789] 指定 ID 列表,或结合 meta_query 筛选带特定自定义字段的页面。
- 主题兼容性:paginate_links() 输出的 HTML 结构取决于 'type' 参数('list' / 'array' / 'plain'),推荐使用 'list' 并配合 CSS 定制样式,避免与主题原有分页样式冲突。
- 不要遗漏 wp_reset_postdata():它用于恢复主循环的 $post 全局变量,防止后续 the_title()、the_content() 等函数输出错误内容。
该方案无需插件,轻量可靠,适用于主题深度定制场景。如需进一步封装为短代码或小工具,亦可基于此逻辑扩展。










