You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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. 边界页处理:当处于第1页时,上一页链接指向当前页;处于最后一页时,下一页链接指向当前页,既满足始终显示的需求,又避免无效跳转。
  2. URL安全性:使用esc_url()对生成的URL进行转义,确保符合安全规范。
  3. 兼容性:get_pagenum_link()是WordPress内置函数,会自动适配站点的 permalink 设置,比手动拼接URL更可靠。

内容的提问来源于stack exchange,提问作者Tiana C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:30:53