如何在首页显示单个帖子,但有正常分页?

时间:2010-08-12 作者:Jan Fabry

我希望在我的头版上有一篇帖子(总是最新的),但让正常的页面工作。因此,首页有帖子1,下一页应该有帖子2-11(1-10也可以),然后是12-21或11-20,依此类推。我知道我能行change the number of posts depending on the context, 但在主页上将其设置为“1”意味着后续页面也只显示一篇帖子。

我的主要问题是/page/2/ 诸如此类的方法都有效,但是/page/1/ 始终重定向到真实的主页,/. 这意味着帖子2-10总是被跳过,因为第2页显示的是11-20。我currently 通过链接到我的存档文件来解决这个问题,但当你来到the first posts of the year 而且职位更少,也没有明显的方式继续下去。

4 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

我用the offset query parameter. 这允许我在pre_get_posts 这似乎是最干净的方法,无需新的查询。现在,主页上只显示一篇文章page/2/ 显示帖子2-11。所有链接继续工作,无需其他修改。

add_action(\'pre_get_posts\', \'set_offset_on_front_page\');
function _set_offset_on_front_page(&$query)
{
    if (is_front_page() && is_paged()) {
            $posts_per_page = isset($query->query_vars[\'posts_per_page\']) ? $query->query_vars[\'posts_per_page\'] : get_option(\'posts_per_page\');
            // If you want to use \'offset\', set it to something that passes empty()
            // 0 will not work, but adding 0.1 does (it gets normalized via absint())
            // I use + 1, so it ignores the first post that is already on the front page
            $query->query_vars[\'offset\'] = (($query->query_vars[\'paged\'] - 2) * $posts_per_page) + 1;
    }
}

SO网友:Hinek

好吧,也许这是一种奇怪或复杂的方式,但我有一个类似的问题(我想在头版上显示一条欢迎短信和特定类别的三篇最新帖子。所以我做到了:

创建了一个名为主页的新页面,并在其上添加了我的欢迎文字

  • 停用默认主页并将我的自定义主页设置为起始页创建了一个新的(复制和修改了现有的)页面模板,让它显示页面正文加载X类的三篇最新帖子并显示它们,下面有一个链接“更多”,链接到/类别/类别-X/
    1. 如下所示:http://hinek.de (对不起,佩奇是德语的)

      如果这可能是你的方式,你需要更多的信息或网页模板的代码样本,评论,我会编辑这篇文章。

  • SO网友:john010117

    我假设你在运行Wordpress 3.0。十、

    在头版上只显示一篇文章(无论哪一类)很容易。使用query_posts(\'post_per_page=1\') 在您的home.php 文件而不是调用get_template_part(\'loop\').

    之后要遵循正常的分页方法有点棘手。在你的loop.php 文件,我建议<?php global $paged; ?><?php if (have_posts()) : ?> 语句,并使用$paged 变量和query_posts() 函数修改查询,以便显示正确的帖子。

    你的loop.php 文件如下所示(注意:未测试):

    <?php
    global $paged;
    
    if (!is_front_page() && $paged && $post->post_type == \'post\') :
        query_posts(\'posts_per_page=10&paged=\' . ($paged - 1));
        if (have_posts()) :
            while (have_posts()) : the_post();
            // Rest of the loop
            endwhile;
        endif;
    endif;
    ?>
    
    我曾经$paged - 1 因为第2页将显示帖子1-10,第3页将显示帖子11-20,依此类推。

    SO网友:lfalin

    这个问题有点老了,但对于那些在现代找到这个问题的人来说,你永远不应该打电话query_posts. 来自Wordpress codex:

    query\\u posts()是一种过于简单且有问题的方法,它通过将页面的主查询替换为新的查询实例来修改页面的主查询。它是低效的(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

    。。。

    TL;DR从不使用query\\u posts();

    相反,你应该使用pre_get_posts 挂钩功能。php如下:

    function hwl_home_pagesize( $query ) {
        // Behave normally for secondary queries
        if ( is_admin() || ! $query->is_main_query() )
            return;
    
        if ( is_home() ) {
            // Display only 1 post for the home page
            $query->set( \'posts_per_page\', 1 );
            return;
        }
    
        // Otherwise, use whatever is set in the Wordpress Admin screen
        $query->set( \'posts_per_page\', get_option(\'posts_per_page\'); );
    }
    add_action( \'pre_get_posts\', \'hwl_home_pagesize\', 1 );
    
    但是,请注意,在某些情况下(例如调整立柱偏移),请使用pre_get_posts 钩子会弄坏你的分页。修复这一点并不是很难,但需要注意。这里有一个如何修复此问题的示例here.

    结束

    相关推荐