将自定义帖子类型设置为主页

时间:2016-06-11 作者:Domeniko

我正在尝试设置一个自定义帖子类型的单一帖子作为主页。我有自定义插件,它注册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?

    我使用了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\' );
    

1 个回复
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类型。尽管有类似的机制,但本机类型是“特殊的”,当您想要偏离默认操作时,通常会有特定于它们的怪癖和行为。

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register