分页错误-再次显示相同的帖子

时间:2018-03-09 作者:SamHammonds
             <div class="col-sm-10">
                <div class="row">
                    <?php query_posts(\'offset=1\'); ?>
                        <?php if ( have_posts() ) : ?>
                         <?php while ( have_posts() ) : the_post(); ?>
                             <div class="col-sm-6">
                                 <a class="post-link" href="<?php echo get_permalink(); ?>">
                                 <div class="post">
                                     <div class="post-image">
                                      <?php the_post_thumbnail(); ?>
                             </div>
                                 <div class="post-title">
                                     <h1><?php the_title(); ?></h1>
                                <div class="post-excerpt">
                                    <p><?php the_excerpt(); ?><p>
                                </div>
                                 </div>
                                 </div>
                            </a>
                             </div>
                         <?php endwhile; ?>
                         <div class="post-nav">
               <div class="nav-previous"><?php next_posts_link( \'Older Posts\' ); ?></div>
               <div class="nav-next"><?php previous_posts_link( \'Newer Posts\' ); ?></div>
             </div>
                        <?php endif; ?>
                </div>
        </div>
        <div class="col-sm-2">
            <?php get_template_part("template-parts/sidebar"); ?>
    </div>
 </div>
</div>
1 个回复
SO网友:Tom J Nowell

<?php query_posts(\'offset=1\'); ?>
这是你的问题。分页功能在主查询中起作用,但您在每一页的开头替换主查询,您唯一告诉它的是偏移量是1,它怎么知道您想要第2页?!

因此,我将提出一种显著改进的方法。一种不会使数据库查询数量翻倍、污染主查询并且速度显著更快的查询:

这个pre_get_posts 滤器

query_posts 不会修改WP检索到的帖子,WP仍然会去获取它们。该函数将替换查询,因此让我们修改原始查询以获取我们想要的内容,例如。

function add_offset_to_query( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( \'offset\', \'1\' );
    }
}
add_action( \'pre_get_posts\', \'add_offset_to_query\' );
请记住,尽管分页依赖于offset 参数,因此此查询永远不会真正使用分页。

你还需要把这个放进去functions.php. WP使用查询来决定加载哪个模板,因此在加载模板时,查询已经运行。

一个好的经验法则是:

切勿使用query_posts, 假装它不存在,没有有效的用途,它只会带来痛苦和头痛如果你需要更改WP获取的帖子,请使用pre_get_postsWP_Query 循环get_posts, get_pages, etc等所有用途WP_Query, 节省一些时间,省去中间人,而不是学习许多奇怪的选择

结束

相关推荐

Custom posts - tag pagination

我使用以下代码输出属于tag:add_filter(\'pre_get_posts\', \'query_post_type\'); function query_post_type($query) { if(is_category() || is_tag() && empty( $query->query_vars[\'suppress_filters\'] ) ) { $post_type = get_query_var(\'pos