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

WordPress分页定制:实现首页多区块文章展示及第二页起切换专属模板

解决方案与最佳实现方式

这个问题的核心是固定的offset和posts_per_page参数导致分页逻辑混乱——你当前的查询不管页码是多少,都从第8篇开始取6篇,自然会重复首页的内容。要实现你要的效果,必须根据当前页码动态计算偏移量和每页显示数,同时确保分页组件能正确识别总页数。

关键逻辑梳理

先明确各页面的内容范围:

  • 首页(第1页)第三个区块:展示第8-13篇(共6篇)
  • 第2页:展示第14-25篇(共12篇)
  • 第3页及以后:每页展示12篇,依次往后

所以我们需要根据当前页码$paged动态调整offset和posts_per_page的值:

  • 当$paged == 1时,offset=7(跳过前7篇),posts_per_page=6
  • 当$paged >=2时,offset=7+6 + ($paged-2)*12 = 13 + ($paged-2)*12(跳过前13篇,再加上前面页数的内容量),posts_per_page=12

代码实现(推荐用WP_Query替代query_posts)

query_posts会干扰主查询,容易引发后续内容显示异常,建议用WP_Query来实现自定义查询,同时确保分页逻辑正确:

1. 自定义查询部分

<?php
// 获取当前页码,首页默认为1
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

// 根据页码动态设置查询参数
if ($paged == 1) {
    $args = array(
        'paged' => $paged,
        'offset' => 7,
        'posts_per_page' => 6,
        'post_status' => 'publish' // 确保只取已发布的文章
    );
} else {
    // 计算偏移量:前7篇(首页前两个区块) + 首页第三个区块的6篇 + 前面页数的内容量
    $offset = 7 + 6 + ($paged - 2) * 12;
    $args = array(
        'paged' => $paged,
        'offset' => $offset,
        'posts_per_page' => 12,
        'post_status' => 'publish'
    );
}

// 初始化自定义查询
$custom_query = new WP_Query($args);

// 循环输出文章
if ($custom_query->have_posts()) :
    while ($custom_query->have_posts()) : $custom_query->the_post();
        // 这里替换成你的文章区块HTML代码,示例:
        ?>
        <div class="post-block">
            <h3><?php the_title(); ?></h3>
            <div class="post-excerpt"><?php the_excerpt(); ?></div>
        </div>
        <?php
    endwhile;
    ?>

2. 分页部分

由于用了自定义查询,the_posts_pagination需要传入total参数(总页数),否则会默认使用主查询的页数,导致分页按钮显示错误。我们需要手动计算总页数:

<div class="list-item">
    <?php
    // 计算总可展示文章数(减去首页前两个区块的7篇)
    $total_available_posts = wp_count_posts()->publish - 7;
    
    // 根据当前页码计算总页数
    if ($paged == 1) {
        // 首页已展示6篇,剩余文章按每页12篇计算
        $remaining_posts = $total_available_posts - 6;
        $total_pages = 1 + ceil($remaining_posts / 12);
    } else {
        $total_pages = ceil($total_available_posts / 12);
    }

    the_posts_pagination(array(
        'show_all' => false,
        'end_size' => 0,
        'mid_size' => 1,
        'prev_text' => __('Previous'),
        'next_text' => __('Next'),
        'add_args' => false,
        'add_fragment' => '',
        'screen_reader_text' => __('Posts navigation'),
        'type' => 'list',
        'total' => $total_pages, // 传入自定义总页数
        'current' => $paged, // 当前页码
    ));
    ?>
</div>
<?php
else :
    // 没有更多文章时的提示
    echo '<p>No more posts to display.</p>';
endif;

// 重置查询,避免影响后续内容输出
wp_reset_postdata();
?>

注意事项

  • 为什么不用query_posts?因为它会替换主查询的全局变量,可能导致侧边栏、页脚等依赖主查询的内容出错,WP_Query是更安全的自定义查询方案。
  • 总页数计算要准确:必须减去首页前两个区块的7篇文章,再根据不同页面的每页显示数来计算,确保分页按钮能正确指向最后一页。
  • 测试前记得清除WordPress缓存,避免分页显示异常。

内容的提问来源于stack exchange,提问作者Slava Nikitina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:37:28