这是可行的,正如我在评论中所说的,您需要遵循以下步骤
统计粘性帖子的数量。这可以通过简单的计数来完成get_option( \'sticky_posts\' )
以数组的形式保存粘性帖子的ID
您还需要获得每页的帖子数量。你不想在这里硬编码。每页的帖子数量存储在get_option( \'posts_per_page\' )
, 所以你要用这个
现在重要的部分是利用偏移量重新计算要在主查询的第一页上显示的帖子数量。根据OP中的示例,如果将每页的帖子数设置为7,并且有4篇粘性帖子,那么我们只需要主查询中的三篇帖子,而不是站点默认设置的七篇帖子。从第2页开始,我们仍然需要在主查询中显示正常的7篇帖子,因为这里没有粘性帖子
但是,该偏移量将影响$max_num_pages
属性,这意味着在大多数情况下,最后一页将丢失。为了纠正这一点,我们需要调整找到的帖子数量,基本上是将我们的偏移量添加到实际找到的帖子数量中,以纠正页面数量。这将通过found_posts
滤器
(注意:此代码现在已测试并正常工作)
以下是代码的基本思想:
add_action( \'pre_get_posts\', function ( $q )
{
if ( $q->is_main_query() && $q->is_home() ) {
$count_stickies = count( get_option( \'sticky_posts\' ) );
$ppp = get_option( \'posts_per_page\' );
$offset = ( $count_stickies <= $ppp ) ? ( $ppp - ( $ppp - $count_stickies ) ) : $ppp;
if (!$q->is_paged()) {
$q->set(\'posts_per_page\', ( $ppp - $offset ));
} else {
$offset = ( ($q->query_vars[\'paged\']-1) * $ppp ) - $offset;
$q->set(\'posts_per_page\',$ppp);
$q->set(\'offset\',$offset);
}
}
});
add_filter( \'found_posts\', function ( $found_posts, $q )
{
if( $q->is_main_query() && $q->is_home() ) {
$count_stickies = count( get_option( \'sticky_posts\' ) );
$ppp = get_option( \'posts_per_page\' );
$offset = ( $count_stickies <= $ppp ) ? ( $ppp - ( $ppp - $count_stickies ) ) : $ppp;
$found_posts = $found_posts + $offset;
}
return $found_posts;
}, 10, 2 );