如何在首页上显示单个帖子但页面正常?


9

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

我的主要问题是该方法可以/page/2/正常工作,但/page/1/总是重定向到实际的主页/。这意味着帖子2-10总是被跳过,因为第二页显示11-20。我目前通过链接到我的存档解决这个问题,但是当你来到这个不理想的一年的第一帖,并有较少的职位,并继续没有明显的方式。

Answers:


7

我解决了它使用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;
    }
}

如果这可行,那么OP应该使用它。
john010117

之所以这样做,是因为我写了这个问题和这个答案。但是感谢您的建议,它们使我走上了正确的轨道。
Jan Fabry

是否有可能使它在archive.php或category.php上运行,仅在第1页上显示最新的2条帖子,同时保持正确的分页?谢谢!
阿米特(Amit)

@Amit:如果is_front_page()is_archive()或替换is_category(),我想您可以到达所需的位置。
1月Fabry

3

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

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

看起来像这样:http : //hinek.de(页面以德语显示,对不起)

如果这是您的理想选择,并且您需要更多信息或页面模板的代码示例,请发表评论,我将对此信息进行编辑。


之所以有效,是因为您仅在“ ...的邮件……类别”类别中显示帖子,因此可以转到该类别页面并使用常规分页。我想显示所有类别的帖子,所以这种方法对我不起作用。您没有地方让人们可以浏览所有类别的所有帖子?
Jan Fabry

1

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

在首页仅显示一个帖子(无论哪个类别)都很容易。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,依此类推。


更改paged参数不会破坏其他任何内容,例如next_posts_link?。也许最好在pre_get_posts钩子中修改查询,所以我不创建新查询?是的,这是WP 3
扬法布里

AFAIK,不应该影响next_posts_link。当然,找出答案的唯一方法是实际尝试。
john010117 2010年

1
哎呀,如果我尝试编辑paged参数的pre_get_posts钩,redirect_canonical在踢,想用新的替换URL paged参数。在这种情况下,我可以禁用重定向,但是会next_posts_link使用一个$paged设置为新值的全局变量,但是我不知道该使用哪个代码,因此不正确。
Jan Fabry

您是否真的尝试使用我的代码并查看它是否有效?我对这个pre_get_posts钩子不太熟悉,所以在那里没有太多帮助。另外,如果您担心,请尝试$paged直接修改变量(例如$paged = $paged - 1):)next_posts_link()
john010117 2010年

0

这个问题有点老了,但是对于那些在现代时代发现这个问题的人,永远不要调用query_posts。从Wordpress Codex:

query_posts()是通过将页面的主查询替换为查询的新实例来简化页面主查询的过于简单和有问题的方法。它效率低下(重新运行SQL查询),在某些情况下(特别是在处理帖子分页时,通常会完全失败)。

...

TL; DR永远不要使用query_posts();

相反,您应该pre_get_posts按以下方式使用functions.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挂钩可能会使您的分页出错。解决这个问题并不困难,但需要注意。还有一个如何解决这个问题的例子在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.