首页自定义文章数量导致WordPress分页异常的问题求助
解决方案:修正分页逻辑+自定义分页导航
问题分析
当前代码通过offset=-2实现首页显示1篇(3-2=1),但found_posts的调整方式($found_posts - $offset)错误放大了总文章数统计值,导致WordPress按首页的posts_per_page=1计算总页数,生成不存在的无效页码。要解决这个问题,需要修正分页逻辑的核心计算,同时自定义分页导航仅保留「上一页」「下一页」。
修正后的代码
1. 调整主查询的文章数量与偏移量
替换原有的pre_get_posts和found_posts钩子代码:
add_action( 'pre_get_posts', 'custom_home_pagination_query', 1 ); function custom_home_pagination_query( $query ) { // 仅处理首页主查询 if ( ! $query->is_home() || ! $query->is_main_query() ) { return; } $ppp = get_option( 'posts_per_page' ); // 当前后台设置为3篇/页 $first_page_posts = 1; // 首页固定显示1篇 if ( $query->is_paged ) { // 分页页:跳过首页的1篇,计算偏移量 $offset = $first_page_posts + ( ( $query->query_vars['paged'] - 2 ) * $ppp ); $query->set( 'offset', $offset ); $query->set( 'posts_per_page', $ppp ); } else { // 首页:仅加载1篇最新文章 $query->set( 'posts_per_page', $first_page_posts ); } } add_filter( 'found_posts', 'custom_home_found_posts', 10, 2 ); function custom_home_found_posts( $found_posts, $query ) { if ( ! $query->is_home() || ! $query->is_main_query() ) { return $found_posts; } $ppp = get_option( 'posts_per_page' ); $first_page_posts = 1; // 计算分页页的有效文章总数(总文章数减去首页的1篇) $paged_posts = max( 0, $found_posts - $first_page_posts ); // 计算总页数:1(首页) + 剩余文章数的分页页数(向上取整) $total_pages = 1 + ceil( $paged_posts / $ppp ); // 调整found_posts值,让WordPress分页系统正确识别总页数 return $first_page_posts + ( $total_pages - 1 ) * $ppp; }
2. 自定义分页导航(仅显示上下页)
替换主题中默认的paginate_links()调用,用以下代码生成仅含「上一页」「下一页」的导航:
function custom_home_pagination() { global $wp_query; // 仅在首页生效 if ( ! is_home() ) { return; } $total_pages = $wp_query->max_num_pages; $current_page = get_query_var( 'paged' ) ?: 1; // 只有1页时不显示分页 if ( $total_pages <= 1 ) { return; } $pagination_html = ''; // 上一页链接 if ( $current_page > 1 ) { $prev_url = get_pagenum_link( $current_page - 1 ); $pagination_html .= '<a href="' . esc_url( $prev_url ) . '" class="pagination-prev">上一页</a>'; } // 下一页链接 if ( $current_page < $total_pages ) { $next_url = get_pagenum_link( $current_page + 1 ); $pagination_html .= '<a href="' . esc_url( $next_url ) . '" class="pagination-next">下一页</a>'; } // 输出分页容器 if ( $pagination_html ) { echo '<div class="custom-pagination">' . $pagination_html . '</div>'; } }
在主题首页模板(如home.php或index.php)的分页位置,调用这个函数:
<?php custom_home_pagination(); ?>
代码说明
- 主查询调整:首页直接固定
posts_per_page=1,分页页通过offset精准跳过首页的1篇内容,确保从第2篇开始每页加载3篇。 - 总页数修正:通过手动计算有效分页的总页数,调整
found_posts的统计值,让WordPress分页系统能正确识别真实的总页数,避免生成无效页码。 - 自定义导航:完全控制分页输出内容,只保留必要的上下页链接,从根源上规避错误页码的显示问题。
内容的提问来源于stack exchange,提问作者Christopher Bowman




