如何在首页上显示一个帖子,但分页正常?
-
16-10-2019 - |
题
我想在我的头版上有一个帖子(始终是最新的),但让正常的分页工作。因此,首页具有帖子1,下一页应具有帖子2-11(1-10也很好),然后是12-21或11-20,依此类推。我知道我可以 根据上下文更改帖子数, ,但是将其设置为主页上的“ 1”意味着其他页面也仅显示一个帖子。
我的主要问题是 /page/2/
等等,但是 /page/1/
总是重定向到真实的主页, /
. 。这意味着帖子2-10总是跳过,因为第2页显示11-20。我 目前 通过链接到我的存档来解决这个问题,但这不是理想的选择 年度第一篇文章 而且帖子较少,没有明显的延续方式。
解决方案
我用 这 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;
}
}
其他提示
好的,也许这是一种奇怪或复杂的方法,但是我也有类似的问题(我想在首页上显示一个欢迎文本和特定类别的三个最新帖子。所以我做到了:
- 创建了一个名为Home的新页面,并将我的欢迎文本放在上面。
- 停用默认主页并将我的自定义主页设置为开始页面
- 创建了一个新的(已复制和修改现有)页面模板
- 让它显示页面主体
- 加载X类的三个最新帖子并显示它们
- 在其下面有一个链接“更多”,该链接在/类别/category-x/上链接
看起来这样: http://hinek.de (页面是德语,对不起)
如果这可能是您的方式,并且您需要更多的Infos或页面模板的代码示例,请评论,我将编辑此帖子。
我假设您正在运行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,依此类推。
这个问题有点古老,但是对于那些在现代发现这个问题的人来说,你永远不要打电话 query_post. 。从WordPress法典:
query_posts()是通过用查询的新实例替换页面来修改页面的主要查询的过度简单和有问题的方法。它效率低下(重新运行SQL查询),在某些情况下会完全失败(尤其是在处理邮政分页时)。
...
tl; dr不要使用query_posts()
相反,您应该使用 pre_get_posts
hook in 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
钩子可以打开分页。解决此问题不是超级固定的,但这是值得注意的。有一个如何解决此问题的示例 这里.