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

如何避免WordPress分页页面出现重复文章?

解决自定义循环排除置顶文章后分页重复的问题

我懂你遇到的这个头疼问题——自定义循环排除置顶文章后首页显示正常,但翻到第二、第三页时文章居然重复出现了。核心原因是你用了自定义WP_Query,但分页函数the_posts_pagination()是基于WordPress主查询来计算分页逻辑的,两者没同步导致了分页错乱。

问题根源拆解

当你使用自定义查询时,the_posts_pagination()默认会读取主查询的分页参数和总页数,而你的自定义查询的分页逻辑和主查询完全脱节:比如主查询可能仍包含置顶文章,总页数计算和你的自定义查询不一致,导致分页时加载重复的内容。

解决方案一:为自定义查询匹配专属分页逻辑

把the_posts_pagination()替换成paginate_links(),手动传入自定义查询的分页参数,让分页和你的自定义循环对齐:

<?php 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
$rest = new WP_Query(array( 
    'post__not_in' => get_option('sticky_posts'), 
    'paged' => $paged, 
)); 
?>

<?php if($rest->have_posts()) { ?>
    <?php while($rest->have_posts()) { ?>
        <?php $rest->the_post(); ?>
        <?php get_template_part('template/main/main-content'); ?>
    <?php } ?>

    <?php 
    // 用paginate_links替代默认分页,匹配自定义查询的总页数
    echo paginate_links(array(
        'total' => $rest->max_num_pages, // 自定义查询的总页数
        'current' => $paged, // 当前页码
        'prev_text' => __('上一页'),
        'next_text' => __('下一页'),
        'mid_size' => 2, // 中间显示的页码数量
    ));
    ?>

<?php } else { ?>
    <p> no post available </p>
<?php } ?>

<?php wp_reset_postdata(); // 这里要用wp_reset_postdata(),而非wp_reset_query(),因为是自定义WP_Query ?>

这里要注意:wp_reset_query()是针对query_posts()的,自定义WP_Query应该用wp_reset_postdata()来恢复主查询的全局$post变量,避免后续代码出现错误。

解决方案二:修改主查询(更推荐的最佳实践)

其实完全不需要自定义循环,通过pre_get_posts钩子修改主查询,直接排除置顶文章,这样分页函数就能自动正常工作,也更贴合WordPress的设计逻辑:

在主题的functions.php文件中添加以下代码:

function exclude_sticky_posts_on_list_pages($query) {
    // 只针对前台主查询生效,可根据需求调整条件(比如排除首页)
    if (!is_admin() && $query->is_main_query() && !is_front_page()) {
        $query->set('post__not_in', get_option('sticky_posts'));
    }
}
add_action('pre_get_posts', 'exclude_sticky_posts_on_list_pages');

之后模板里直接用默认循环即可,分页会自动适配:

<?php if(have_posts()) { ?>
    <?php while(have_posts()) { ?>
        <?php the_post(); ?>
        <?php get_template_part('template/main/main-content'); ?>
    <?php } ?>
    <?php the_posts_pagination(); ?>
<?php } else { ?>
    <p> no post available </p>
<?php } ?>

这种方法的优势是不用手动处理分页逻辑,WordPress会自动帮你计算总页数、当前页码,彻底避免自定义查询带来的分页冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:34:06