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


16

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

 http://the_site.com/

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

理想情况下,我想使用更改查询 is_front_page()我的functions.php文件。我尝试了以下操作,并以首页为首页:

 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;
 }

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

我究竟做错了什么?总的来说,有没有更好的方法呢?


is_front_page()无法与pre_get_posts配合使用
Brad Dalton

Answers:


27

将静态页面设置为主页后,可以将其添加到您的页面中,您就可以functions.php开始了。这也将archive-POSTTYPE.php正确调用模板。

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}

此功能if(is_admin()) return;从一开始就需要,否则会与管理区域混淆。
brasofilo 2013年

1
虽然这对我有用,但我的主要和次要菜单因此消失了。
super9 2015年

几乎是正确的。这段代码正在更改所有wp_queries,因此应该是if(is_home())而不是if($ wp_query-> get .....)
Leo Caseiro

我使用的是相同的东西,但是在我的自定义页面模板而不是首页上,它没有显示任何结果(好像未添加任何自定义帖子)。有什么想法吗?
trainoasis

此解决方案不支持分页。任何/ page / 2网址仍显示前10个帖子。
rg89

6

将您的CPT存档重命名为home.php

然后使用pre_get_posts更改主页查询,以便仅显示CPT

function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
    }
  }

add_action('pre_get_posts','wpsites_home_page_cpt_filter');

将您的cpt替换为自定义帖子类型的名称。


2
最后,给出一个清晰,可行的解释!
杰克

1

感谢您的答复ljaas-我一直在寻找解决这个确切问题的方法。为了获得定制的帖子类型存档模板,我必须添加以下条件:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

2
嗨,Eli,欢迎来到WPSE。“答案”旨在回答最初的问题(stackexchange网站不是主题讨论论坛)。这将更适合发表评论
约翰内斯·皮尔

感谢约翰内斯的澄清。那就是我的想法,尽管由于没有可用的“添加评论”功能,我无法弄清楚如何对答案发表评论。这是对时间敏感的功能,还是我是盲人?
伊莱2013年

0

这对于在设置>阅读>首页显示中覆盖博客文章和静态页面更有效:

<?php
/**
 * Set custom post type archive as front page.
 *
 * @since 1.0.0
 */
function ql_set_as_front_page( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ql_is_front_page( $query ) ) {
        $query->set( 'page_id', '' );
        $query->is_page = false;
        $query->is_singular = false;
        $query->set( 'post_type', 'MYCPT' );
        $query->is_archive = true;
        $query->is_post_type_archive = true;
    }
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main WP Query.
 */
function ql_is_front_page( $query ) {
    if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
        return true;
    elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
        return true;
    else
        return false;
}

我将其与使用过滤器的模板覆盖结合使用,front_page_templatehome_template返回自定义模板。


0

对我来说,它破坏了分页:您选择索引或静态页面作为主页,就会显示分页链接,但是单击第2页时,我得到:

  • 如果是索引页(默认):404页
  • 在静态页面的情况下:与页面1相同的结果:然后将解释“ paged”自变量以显示页面类型分页,而不是帖子类型列表分页。

我认为它需要一些重写规则来捕获分页的参数并正确传递它。

无论如何,自定义模板页面应该是带有一些其他重写规则的解决方案。

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.