我想使用自定义的帖子类型存档作为网站的首页,以便
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;
}
但是首页返回了“主页”的内容,似乎忽略了自定义查询。
我做错了什么?总的来说,有没有更好的方法?
最合适的回答,由SO网友:Ijaas 整理而成
将静态页面设置为主页后,可以将其添加到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;
}
SO网友:Elio
在“设置”>“阅读”>“首页显示”中覆盖博客帖子和静态页面对我来说效果更好:
<?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_template
和
home_template
返回自定义模板。