it-swarm.cn

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

我想在我的头版上留一个帖子(总是最新的),但让正常的分页工作。所以首页有帖子1,下一页应该有帖子2-11(1-10也很好),然后是12-21或11-20,依此类推。我知道我可以 根据上下文改变帖子的数量 ,但在主页上将其设置为“1”意味着其他页面也只显示一个帖子。

我的主要问题是/page/2/等工作,但/page/1/总是重定向到真正的主页,/。这意味着总是跳过帖子2-10,因为第2页显示11-20。 I 当前 通过链接到我的档案来解决这个问题,但当你来到 年度的第一篇帖子时,这并不理想 并且帖子较少且没有明显的继续方式。

8
Jan Fabry

我用 offset查询参数 解决了它。这允许我在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;
    }
}
6
Jan Fabry

好吧,也许这是一个奇怪或复杂的方法来做到这一点,但我有一个类似的问题(我想在首页上显示欢迎文本和特定类别的三个最新帖子。所以我做了:

  1. 创建了一个名为home的新页面,并将欢迎文本放在上面。
  2. 取消激活默认主页并将我的自定义主页设置为起始页
  3. 创建了一个新的(复制和修改现有的)页面模板
    1. 让它显示页面正文
    2. 加载类别X的三个最新帖子并显示它们
    3. 在它下面有一个链接“更多”链接/ category/category-x /

看起来像这样: http://hinek.de (页面是德文,对不起)

如果这可能是你的方式,你需要更多的信息或页面模板的代码示例,评论和我将编辑这篇文章。

3
Hinek

我假设你正在运行Wordpress 3.0.x?

首页只显示一个帖子(无论哪个类别)很容易。在home.php文件中使用 query_posts('post_per_page=1') 而不是调用get_template_part('loop')

在那之后遵循正常的分页方法有点棘手。在loop.php文件中,我建议在<?php if (have_posts()) : ?>语句之前放置<?php global $paged; ?>,并使用$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,依此类推。

1
john010117

这个问题有点旧,但对于那些在现代时代发现这个问题的人来说,你永远不应该调用 query_posts 。来自Wordpress codex:

query_posts()是一种过于简单化和有问题的方法来修改页面的主要查询,方法是用新的查询实例替换它。它是低效的(重新运行SQL查询)并且在某些情况下会彻底失败(特别是在处理帖子分页时)。

...

TL; DR不使用query_posts();

相反,您应该在functions.php中使用pre_get_posts钩子,如下所示:

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钩子会破坏您的分页。解决这个问题并不是很难,但需要注意的是。有一个如何解决这个 这里 的例子。

0
lfalin