第二页及以后的贴纸

时间:2016-04-28 作者:Garth Dryland

今天我更新了一篇旧博客文章,并将其设置为粘滞,以显示有关最新更改的信息。这是一篇典型的帖子,以站点更新作为日志的标题,你可以说,过去的更改是按日期列出的。

我发现,如果帖子来源于第二页或第二页,那么粘性帖子仍然会出现在第二页或它来自的任何页面上,但是如果帖子来源于第一页,那么帖子就会从可见的博客帖子中消失。

在我看来,粘性帖子应该只显示为粘性帖子,而不是出于任何原因在博客中显示两次。

如果你能解释为什么会这样,我很想听听。

更改每页的帖子数量会显示其与帖子是否位于第一页相关,如果是且是粘性的,则会消失并仅显示为粘性,但如果是粘性的,则从第二页或第二页开始,它在该页上和第一页上都保持可见。

这似乎是一个奇怪的函数,值得修复。我看不出有任何理由一篇粘性文章应该在博客中出现两次,事实上,如果搜索引擎将其确定为重复内容,可能会损害SEO。

对一些输入感兴趣,如果可以做些什么来确保一篇粘性文章只显示为一篇粘性文章,而不是同时显示在博客的其他页面上。

1 个回复
SO网友:Pieter Goosen

粘帖是一件令人头痛的事,没有正确地在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 );
    }
});

相关推荐

如何修改WP_INCLUDE/BLOCKS/LATEST_posts.php

我是WordPress开发的初学者,希望得到一些帮助。我在一个简单的WordPress网站上工作。基本上,用户希望在主页上显示最新的帖子。我使用了最新帖子块,并将其设置为显示整个帖子内容,现在用户不希望帖子标题链接到单个帖子页面(因为帖子的内容显示在主页上)。如何安全地修改模板文件,使其像h2标记一样使用,而不是在主题中使用的href标记。我知道您可以创建子主题并修改wp_content 文件,但我不确定如何处理中的文件wp_include. 我读到一些关于修改functions.php 但我不确定,如果