Sticky post appears twice

时间:2013-10-06 作者:Alvaro

我正在尝试修改循环中每页的posts\\u数量。这样做:

function posts_per_page($query) {
    $query->query_vars[\'posts_per_page\'] = 3;
}
add_filter(\'pre_get_posts\', \'posts_per_page\', 11);
我的问题是,当我这样做时,粘性帖子会在循环中出现两次:第一次出现在循环的开头,第二次出现在其原始位置。因此,在这种情况下,第一个页面有4个帖子(3个无粘性循环+粘性帖子),粘性帖子稍后将与其他2个帖子一起出现在其“页面”中。

EDIT: SOLUTION

在做了大量研究之后,我意识到粘性帖子总是出现在第一页。如果原始的粘性帖子已经出现在第一页中,则只会显示粘性帖子(此帖子只会显示一个)。我需要确切地知道我的查询将有多少帖子,但是$wp\\u query->found\\u posts不包括粘性帖子。如果我做了$wp\\u query->found\\u posts+get\\u选项(\'sticky\\u posts\')就不正确了,因为它不考虑我之前说过的“第一页的贴子”,也不考虑未发布的贴子。

使用$wp\\u query->posts,我可以获得第一页中的真实帖子数,因此:

$sticky = count($wp_query->posts) - get_option( \'posts_per_page\' );

if ($sticky<0) {$sticky=0;}//In case there is only one page of results
现在$sticky将拥有真实数量的sticky帖子。

3 个回复
SO网友:user2019515

你所描述的不是问题,而是WordPress的正常行为。当你将一篇文章标记为粘性文章时,它将位于列表的顶部and 它也会出现在原来的位置上,除非原来的位置在第一页上。贴纸将出现在帖子顶部和原始位置,但不会在同一页上出现两次。

您可能希望执行以下操作:

<?php
while (have_posts()) : the_post();
    if ( !in_array( $post->ID, $do_not_duplicate ) ) { // check IDs         
// display posts ...
        the_title();

//store id in "do not duplicate
$do_not_duplicate = $post->ID;
    }
endwhile;
?>
次要编辑的源:http://wpengineer.com/1719/filter-duplicate-posts-in-the-loop/

SO网友:s_ha_dum

更正确的方法是使用set 方法

function posts_per_page($query) {
    $query->set(\'posts_per_page\',3);
}
add_filter(\'pre_get_posts\', \'posts_per_page\', 11);
试试看。

注意:我无法复制此多粘滞问题。如果这不能解决问题,请更详细地编辑您的问题。这可能是特定于主题的,也可能是由于插件。

SO网友:Meyer Auslander - Tst

考虑以下情况:

将粘帖放在顶部pre_get_posts 钩子,因为没有简单的方法来设置第一页的帖子数量。WordPress自然会发回所有粘性帖子+第一页上的帖子。尝试计算posts_per_page 基于sticky posts 以下并发症。

有许多情况需要考虑。有时sticky posts 小于posts_per_page, 有时更多,有时相等。每个案件都需要分开处理sticky posts 超过posts_per_page 如中所述an answer to a similar questionthe loop.

                global $wp_query, $post;
                // Setup manual paging scheme.
                $page_requested        = $wp_query->query_vars[\'paged\'] ? $wp_query->query_vars[\'paged\'] : 1;
                $number_per_page       = $wp_query->query_vars[\'posts_per_page\'];
                $first_post_to_display = ( $page_requested - 1 ) * $number_per_page + 1;
                $last_post_to_display  = $first_post_to_display + $number_per_page - 1;
                $current_post          = 1;
                // Re query posts without paging so it won\'t duplicate the sticky posts.
                $query = new WP_Query( array( \'nopaging\' => true ) );
                while ( $query->have_posts() ) :
                    $query->the_post();
                    $should_display_this_post = $current_post >= $first_post_to_display && $current_post <= $last_post_to_display;
                    if ( $should_display_this_post ) {
                        ?>
                  <Template code to output post content here>
 
                <?php } 
                 ++$current_post;
                 endwhile;
?>
说明:

在不分页的情况下重新查询所有帖子,以删除重复的帖子(同时保留sticky posts.posts_per_page.

结束

相关推荐

如何在POST类型中使用带下划线的MANAGE_$POST_TYPE_POSTS_COLUMNS?

我有一个帖子类型\'job_listing\' 我想使用manage_{$post_type}_posts_columns 在其中过滤。我试过了manage_job_listing_posts_columns 但由于帖子类型中的下划线,它无法正常工作。我尝试的代码是: add_filter(\'manage_job_listing_posts_columns\', \'add_more_column_to_post\', 10, 1); function add_more_colu