根据上下文(例如,首页,搜索,存档)每页显示不同数量的帖子


21

在“阅读设置”中,可以设置显示的帖子数量,该数量会影响在所有上下文中显示的帖子数量。我想在首页上显示一定数量的帖子,而在归档,搜索结果等页面上显示不同数量的帖子。

阅读设置博客页面每页最多显示

我意识到我可以通过编辑主题文件并在其中更改查询参数来做到这一点,但我希望可以更轻松地访问简单的设置页面。很久以前,我遇到了一个可以做到这一点的插件,但是现在找不到它。

有谁知道一个插件可以做到这一点,或者甚至我可以将一个函数放到functions.php中来完成相同的功能?


您可能会想到@ chip-bennett的“每页不同帖子”插件:chipbennett.net/plugins/cbnet-different-posts-per-page,它以图形方式完成您想要的工作。
Tom Auger

Answers:


23

我相信在插件中执行此操作的最佳方法pre_get_posts是在遇到动作挂钩时运行以下示例函数。该$wp_query对象可用,这意味着您的条件标记可用,但是在WordPress获得帖子之前,这意味着您在运行第一个查询之前更改查询变量,而不是像在主题中使用query_posts()那样添加第二个查询文件。

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');

我在自己的网站上使用此功能。可以轻松将其剪切并粘贴到这里。
kevtrout 2010年

0

您可以使用query_posts进行自定义循环,并按is_home,is_archive等指定帖子数。

只是一个简单的if语句以及query_posts


是的,我在问题中提到了这一点。我正在寻找一种实现方法,因此不必编辑多个主题文件即可更改设置。谢谢。
道格

1
这样做是个坏主意。WordPress已经运行查询。如果输入query_posts主题,则将忽略原始查询,并进行另一个冗余的查询。
KrzysiekDróżdż

-1

除了这个问题。如果像这样将新页面添加到index.php中,是否有人知道如何确定此函数函数custom_posts_per_page($ query)的post_per_page:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>

-1

我意识到我可以通过编辑主题文件并在其中更改查询参数来做到这一点,但我希望可以更轻松地访问简单的设置页面。

为了完整起见,我发现query_posts结合使用$query_string串联效果很好。

我将这段代码放在index.php(我的主题没有category.php)中...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

当然,我们在这里要做的是修改循环的内部查询字符串,从而覆盖每页默认的帖子数

它可以使我在主页上显示完整的帖子的列表较少,而在其他地方(类别,日期等)仅显示帖子摘要的列表中,提供较小的列表。

但是,请注意,与接受的答案不同,此方法将两次运行查询,因此它不是一个很好的解决方案。


杰夫,我一直在寻找一个集中的位置来控制在不同情况下返回的帖子数量。仅当您使用index.php处理所有上下文时(大多数主题都不会这样做),您的答案才能做到。除了增加对数据库的调用(这会影响性能)之外,您的技术还可以以意外的方式更改对条件标签(例如is_home()或is_front_page)的响应。最后,如果要在页面上添加辅助循环,则不应使用query_posts,而应使用“ new WP_Query”(或get_posts)。
道格

@doug这不是二级循环,它覆盖了主循环-是的,这个特定的主题使用index.php呈现所有内容,这非常简单。在这里,我觉得这是一个更合理的答案,但是如果您希望我可以提出自己的问题,并在某种程度上冒犯您,请回答。
Jeff Atwood

实际上,我误读了您的倒数第二段,并认为帖子的“较大”和“较小”列表在同一页面上,因此上面的我的最后一句话是无关紧要的。是的,如果您愿意,将所有代码放入index.php是完全合法的。如果是这种情况,那么您的方法便是一种快速简便的方法,因此在20小时锁定结束后,我将删除我的反对投票。即使这样,由于已经提到的原因(由您,我和WP Codex提出),发送新查询而不是像kevtrout的回答那样修改原始查询还是不理想的。
Doug
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.