如何在WordPress中使用自定义帖子类型存档作为首页?

时间:2011-10-12 02:33:23

标签: php wordpress

我想将自定义帖子类型存档用作网站的首页,以便

 http://the_site.com/

是根据我的archive-{post-type}.php文件显示的自定义帖子类型存档。

理想情况下,我想在is_front_page()文件中使用functions.php更改查询。我尝试了以下操作,将一个名为“Home”的页面作为我的首页:

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

但首页返回“Home”的内容,似乎忽略了自定义查询。

我做错了什么?总的来说,还有更好的方法可以解决这个问题吗?

注意:我确实在WordPress Answers发布了此内容,但该社区相对较小。

4 个答案:

答案 0 :(得分:8)

将最终解决方案作为答案发布(Isaac将其作为评论),仅供仍在寻找的人使用。

通过functions.php添加过滤器,Isaac走在正确的轨道上。他做错了是调用is_front_page(),因为我们在pre_get_posts并且查询尚未执行,因此无效。

但我们确实拥有当前的页面ID。所以我们仍然可以通过在WordPress选项寄存器中查找名为page_on_front的选项来解决这个问题,该选项返回用户设置为首页的页面ID。

(有关所有WordPress选项的概述,请访问浏览器中的<yourwordpressinstallation>/wp-admin/options.php。)

这使得以下解决方案成为as suggested by Ijaas

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query) {
    // Compare queried page ID to front page ID.
    if(!is_admin() && $wp_query->get("page_id") == get_option("page_on_front")) {

        // Set custom parameters (values based on Isaacs question).
        $wp_query->set("post_type", "album");
        $wp_query->set("posts_per_page", -1);

        // WP_Query shouldn't actually fetch the page in our case.
        $wp_query->set("page_id", "");

    }
}

您可能必须更改一些条件标记,以确保所有插件仍然有效,具体取决于查询的更改程度。

希望这有助于某人。

更新:如上所述below,将!is_admin()添加到if - 语句,以确保该功能仅在前端运行。如果您只想为初始查询运行此操作,则还可以添加主查询检查$wp_query->is_main_query()

答案 1 :(得分:3)

回应Robberts解决方案:

  

于2013年5月6日12:04回答

&& !isAdmin()添加到if函数中,它也会替换所有管理页面的帖子类型查询。 万一有人对此有疑问。

编辑: 同时将&& $wp_query->is_main_query()添加到if语句会阻止它影响窗口小部件和菜单

所以我有总代码

if($wp_query->get("page_id") == get_option("page_on_front") && !isAdmin() && $wp_query->is_main_query()) {}

答案 2 :(得分:0)

为了使该查询起作用,您必须将该代码添加到页面模板,创建页面,将模板设置为刚刚创建的页面的模板,然后将该页面设置为Settings =&gt;中的主页阅读管理区域。

顺便说一句,is_front_page()函数只有在您从管理菜单中设置为主页的页面上才返回true。

另一个选项是修改index.php,但如果你这样做,is_front_page()将始终返回false。在这种情况下,您需要使用is_home()代替。

我希望有所帮助。

答案 3 :(得分:0)

Isaac,你是对的,我没有彻底阅读你的问题,我假设你想要以“简单”的方式做到这一点。

无论如何,我把你的代码放在我的测试网站上,实际上它没有用。我查看了我的SQL日志,结果证明您的代码在查询wp_posts.post_status = 'private'中生成了这个。

所以,我尝试将行$query->set('post_status', 'public');添加到你的函数中,它运行得很好。

总之,试试这个:

add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
    global $wp_the_query;
    if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
        $query->set('post_status', 'public');
    }
    return $query;
}