如何为WordPress自定义分页构建真实的上/下一页URL?
自定义WordPress分页:始终显示上一页/下一页并生成真实URL
需求背景
要求无论是否存在实际的上一页或下一页内容,分页栏必须始终显示“上一页(Prev)”和“下一页(Next)”文本。
参考实现思路
通过关闭paginate_links自动生成的前后链接,手动添加固定显示的上下页按钮:
$page_links = paginate_links(array( // 关闭自动生成上下页链接,改为手动添加 'prev_next' => FALSE, // 返回数组格式便于后续处理 'type' => 'array', // 其他自定义参数 )); // 手动添加上下页链接(占位符需替换为真实URL) $prev_link = '<a href="#">'.__('Previous').'</a>'; $next_link = '<a href="#">'.__('Next').'</a>'; array_unshift($page_links, $prev_link); $page_links[] = $next_link; // 输出最终分页HTML echo implode($page_links);
遇到的问题
上述代码中$prev_link和$next_link的href使用了占位符#,需要替换为真实有效的上一页/下一页URL。
当前完整业务代码
<?php if( get_query_var('paged') ) { $page = get_query_var( 'paged' ); } else { $page = 1; } // 分页变量定义 $row = 0; $press_per_page = 16; // 每页显示的媒体内容数量 $press_listing = get_field( 'press_info' ); $total = count( $press_listing ); $pages = ceil( $total / $press_per_page ); $min = ( ( $page * $press_per_page ) - $press_per_page ) + 1; $max = ( $min + $press_per_page ) - 1; if( have_rows('press_info') ): ?> <?php while( have_rows('press_info') ): the_row(); $row++; // 跳过当前页之前的内容 if($row < $min) { continue; } // 超出当前页范围则终止循环 if($row > $max) { break; } ?> <div class="press"> <a target="_blank" href="<?php the_sub_field('press_external_link'); ?>"><div class="press-logo"><img src="<?php the_sub_field('press_logo'); ?>"></div> <div class="press-info"> <p><?php the_sub_field('press_title'); ?></p> </div></a> </div> <?php endwhile; // 分页模块 $page_links = paginate_links(array( 'base' => get_permalink() . 'page/%#%' . '/', 'format' => '?paged=%#%', 'current' => $page, 'total' => $pages, 'prev_next' => FALSE, 'type' => 'array', )); // 待替换真实URL的上下页链接 $prev_link = '<div class="the-pagination"><a href="#" class="prev-link">'.__('Prev').'</a>'; $next_link = '<a href="#" class="next-link">'.__('Next').'</a></div>'; array_unshift($page_links, $prev_link); $page_links[] = $next_link; echo implode($page_links);?> <?php else : ?> <p><?php _e('Sorry, no posts matched your criteria.'); ?></p> <?php endif; ?>
解决方案
利用WordPress内置函数和当前页码计算真实的上下页URL,修改分页模块代码即可:
修改后的分页代码片段
// 分页模块 $page_links = paginate_links(array( 'base' => get_permalink() . 'page/%#%' . '/', 'format' => '?paged=%#%', 'current' => $page, 'total' => $pages, 'prev_next' => FALSE, 'type' => 'array', )); // 计算上下页页码:边界页保持自身页码,避免无效跳转 $prev_page = ($page > 1) ? $page - 1 : 1; $next_page = ($page < $pages) ? $page + 1 : $pages; // 生成真实URL(WordPress内置函数自动适配 permalink 规则) $prev_url = esc_url(get_pagenum_link($prev_page)); $next_url = esc_url(get_pagenum_link($next_page)); // 构建包含真实URL的上下页链接(保留原有HTML结构) $prev_link = '<div class="the-pagination"><a href="'.$prev_url.'" class="prev-link">'.__('Prev').'</a>'; $next_link = '<a href="'.$next_url.'" class="next-link">'.__('Next').'</a></div>'; array_unshift($page_links, $prev_link); $page_links[] = $next_link; echo implode($page_links);
关键说明
- 边界页处理:当处于第1页时,上一页链接指向当前页;处于最后一页时,下一页链接指向当前页,既满足始终显示的需求,又避免无效跳转。
- URL安全性:使用
esc_url()对生成的URL进行转义,确保符合安全规范。 - 兼容性:
get_pagenum_link()是WordPress内置函数,会自动适配站点的 permalink 设置,比手动拼接URL更可靠。
内容的提问来源于stack exchange,提问作者Tiana C.
相关产品推荐
相关产品推荐

