You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

首页自定义文章数量导致WordPress分页异常的问题求助

解决方案:修正分页逻辑+自定义分页导航

问题分析

当前代码通过offset=-2实现首页显示1篇(3-2=1),但found_posts的调整方式($found_posts - $offset)错误放大了总文章数统计值,导致WordPress按首页的posts_per_page=1计算总页数,生成不存在的无效页码。要解决这个问题,需要修正分页逻辑的核心计算,同时自定义分页导航仅保留「上一页」「下一页」

修正后的代码

1. 调整主查询的文章数量与偏移量

替换原有的pre_get_postsfound_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.phpindex.php)的分页位置,调用这个函数:

<?php custom_home_pagination(); ?>

代码说明

  • 主查询调整:首页直接固定posts_per_page=1,分页页通过offset精准跳过首页的1篇内容,确保从第2篇开始每页加载3篇。
  • 总页数修正:通过手动计算有效分页的总页数,调整found_posts的统计值,让WordPress分页系统能正确识别真实的总页数,避免生成无效页码。
  • 自定义导航:完全控制分页输出内容,只保留必要的上下页链接,从根源上规避错误页码的显示问题。

内容的提问来源于stack exchange,提问作者Christopher Bowman

火山引擎 最新活动