我正在尝试设置一个自定义帖子类型的单一帖子作为主页。我有自定义插件,它注册CPT称为堆栈,我用它来构建各种单页滚动页面。它有自己的自定义模板等。。一切正常。然而,我无法从堆栈中选择帖子作为主页。
这是我注册自定义帖子类型的代码部分,我不知道,也许参数和重写规则在这种特定情况下非常重要,以便能够从后端的阅读选项中选择CPT帖子作为主页。
$rewrite = array(
\'slug\' => \'stacks\',
\'with_front\' => true,
\'pages\' => true,
\'feeds\' => true,
);
$args = array(
\'label\' => __( \'Stacks\', \'Stacks\' ),
\'labels\' => $labels,
\'supports\' => array( \'title\', ),
\'hierarchical\' => true,
\'public\' => true,
\'show_ui\' => true,
\'show_in_menu\' => true,
\'menu_position\' => 20,
\'menu_icon\' => \'dashicons-admin-post\',
\'show_in_admin_bar\' => false,
\'show_in_nav_menus\' => true,
\'can_export\' => true,
\'has_archive\' => false,
\'exclude_from_search\' => false,
\'publicly_queryable\' => true,
\'rewrite\' => $rewrite,
\'capability_type\' => \'page\',
);
register_post_type( \'stacks\', $args );
我从Google和Stack Exchange找到了各种来源。
- How to use a custom post type as front page?
- How do you use a CPT as the default home page?
- How do you use a CPT as the default home page?我想这些答案在以前的WordPress版本中适用,但现在不适用了。
我使用了Stack Exchange页面上的代码。
function wpa18013_add_pages_to_dropdown( $pages, $r ){
if(\'page_on_front\' == $r[\'name\']){
$args = array(
\'post_type\' => \'stacks\'
);
$stacks = get_posts($args);
$pages = array_merge($pages, $stacks);
}
return $pages;
}
add_filter( \'get_pages\', \'wpa18013_add_pages_to_dropdown\', 10, 2 );
当我将上述代码添加到我的函数中时。在我的插件中,我可以从后端的阅读选项中选择CPT帖子作为主页。然而,当我转到主页时,Url是127.0.0.1/website/stacks/stackhome,而不是127.0.0.1/website这些堆栈交换答案中给出的代码的第二部分对我不起作用。应该负责自定义帖子类型中添加的URL路径的代码。。。当我将此代码添加到函数时。php和转到主页,CPT的url路径消失了,但自定义帖子类型的内容和模板也消失了。。。它只显示启用wp主题的常规页眉、空白主要内容部分和页脚。
function enable_front_page_stacks( $query ){
if(\'\' == $query->query_vars[\'post_type\'] && 0 != $query->query_vars[\'page_id\'])
$query->query_vars[\'post_type\'] = array( \'page\', \'stacks\' );
}
add_action( \'pre_get_posts\', \'enable_front_page_stacks\' );
SO网友:Rarst
这里有很多细微差别,具体取决于您想要完成的内容。我没有信心从你的问题中完全理解。
一般而言,WP逻辑流程如下:
URL转换为查询变量进入主查询实例查询帖子模板加载器使用条件标记(使用主查询)确定模板模板模板在主查询上运行循环您似乎需要两件事:让主页显示CPT,让主页为其使用特殊模板。因此,您需要调整两件事:查询的帖子和使用的模板。
基本实现可能如下所示:
class Stacks {
public function __construct() {
add_action( \'init\', array( $this, \'init\' ) );
add_action( \'pre_get_posts\', array( $this, \'pre_get_posts\' ) );
add_action( \'template_include\', array( $this, \'template_include\' ) );
}
public function init() {
// your registration code
}
public function pre_get_posts( $wp_query ) {
if ( $wp_query->is_main_query() && $wp_query->is_home() ) {
$wp_query->set( \'post_type\', \'stacks\' );
}
}
public function template_include() {
if ( is_home() ) {
return get_stylesheet_directory() . \'/stacks.php\';
}
}
}
$stacks = new Stacks();
请注意,CPT的创建并不等同于本机post类型。尽管有类似的机制,但本机类型是“特殊的”,当您想要偏离默认操作时,通常会有特定于它们的怪癖和行为。