粘帖是一件令人头痛的事,没有正确地在IMHO中实施。这个source code 很明显,粘性帖子只会移动到主页第一页的顶部(或任何自定义实例WP_Query
它模拟主页,粘性帖子不会从页面中删除。IMO,这应该是core的一部分,粘滞应该移到第一页的顶部,然后应该从查询中完全删除。
至于搜索引擎优化,我不确定这会有什么影响。搜索引擎优化(SEO)是一个非常高级的领域,我很难理解(可能我们中的很多人都在这个领域)。这也可能是问这样一个问题的错误堆栈,我认为站长堆栈是问SEO相关问题的最佳地方。
无论如何,回到粘滞的话题,我总是做以下事情(请遵循链接的源代码以便更好地理解):
设置ignore_sticky_posts
在主页上通过pre_get_posts
. 这将忽略粘性贴子功能。
仍然在里面pre_get_posts
, 获取粘性帖子的数组,并将其从查询中完全删除。这样,就不会因为使用偏移量等原因而不得不手动重新计算分页,这让人头疼
通过the_posts
过滤到主查询的循环中。
这样做的好处是,
粘性帖子不再是主查询的一部分
如果您只想从第2页删除粘性帖子,则无需重新计算分页。我以前做过,但有点乱
让我们看看代码:(NOTE 代码未经测试,需要PHP 5.4+)
add_action( \'pre_get_posts\', function ( $q )
{
if ( $q->is_home() // Only target the homepage
&& $q->is_main_query() // Only target the main query
) {
// Remove sticky posts
$q->set( \'ignore_sticky_posts\', 1 );
// Get the sticky posts array
$stickies = get_option( \'sticky_posts\' );
// Make sure we have stickies before continuing, else, bail
if ( !$stickies )
return;
// Great, we have stickies, lets continue
// Lets remove the stickies from the main query
$q->set( \'post__not_in\', $stickies );
// Lets add the stickies to page one via the_posts filter
if ( $q->is_paged() )
return;
add_filter( \'the_posts\', function ( $posts, $q ) use ( $stickies )
{
// Make sure we only target the main query
if ( !$q->is_main_query() )
return $posts;
// Get the sticky posts
$args = [
\'posts_per_page\' => count( $stickies ),
\'post__in\' => $stickies
];
$sticky_posts = get_posts( $args );
// Lets add the sticky posts in front of our normal posts
$posts = array_merge( $sticky_posts, $posts );
return $posts;
}, 10, 2 );
}
});