作为主页的自定义帖子类型问题

时间:2012-04-11 作者:Armand

我编写了一个插件,它使用自定义帖子类型创建一系列页面。我有将CPT添加到“阅读”下拉菜单的代码,它工作得很好。

在这里。。。

add_filter( \'get_pages\',  \'add_wpwebinar_front\' );
function add_wpwebinar_front( $pages ) {
     $my_wpwebinar_pages = new WP_Query( array( \'post_type\' => \'wpwebinar\' ) );
     if ( $my_wpwebinar_pages->post_count > 0 ) {
         $pages = array_merge( $pages, $my_wpwebinar_pages->posts );
     }
     return $pages;
}
代码可以工作,但如果您选择自定义帖子类型作为主页,它会重定向到CPT实际页面。实例领域com将重定向到域。com/slug/pagename

为了解决这个问题,我找到了我添加的代码。。。

function enable_front_page_stacks( $query ){
global $post, $wp_query;
   if(\'\' == $query->query_vars[\'post_type\'] && 0 != $query->query_vars[\'page_id\'])
        $query->set(\'post_type\', \'wpwebinar\');
}
add_action( \'pre_get_posts\', \'enable_front_page_stacks\' );
这会将自定义帖子类型保留为主页。但是我有几个问题。

如果选择默认的“显示最新帖子”,则可以问题是,当您选择一个普通页面作为frontpage时。它继承了自定义的帖子类型模板,当然不会显示页面内容,因为没有相应的代码。

我确信修复很简单,但我不知道要更改什么。

有什么想法吗?我们将不胜感激。

1 个回复
SO网友:EAMann

错误出现在您添加的代码中:

function enable_front_page_stacks( $query ){
    global $post, $wp_query;
    if(\'\' == $query->query_vars[\'post_type\'] && 0 != $query->query_vars[\'page_id\'])
        $query->set(\'post_type\', \'wpwebinar\');
}
特别是$query->set(). 此调用将专门将post类型设置为;wpwebinar“;如果它没有显式设置为其他任何值。因此,只需点击一个常规页面,就会迫使它假定;wpwebinar“;并加载自定义帖子类型模板。

相反,请将功能更改为:

function enable_front_page_stacks( $query ){
    if(( ! isset($query->query_vars[\'post_type\']) || \'\' == $query->query_vars[\'post_type\']) && 0 != $query->query_vars[\'page_id\'])
        $query->query_vars[\'post_type\'] = array( \'page\', \'wpwebinar\' );
}
这是original enable_front_page_stacks() function I wrote, 但使用;wpwebinar“;而不是;堆栈(&Q);作为附加自定义帖子类型。

引用插件中的模板文件通常,我能给出的最佳指导原则包括向插件注册CPT,并根据主题决定CPT模板。这通常可以更好地进行样式设计,并允许最终用户完全控制站点设计。然而,有rare在插件本身中指定CPT模板是有意义的。

要解决这个问题,您需要连接到get_single_template() 函数告诉它从哪里获取文件。以下是典型的请求模式:

template-loader.php
--> if ( is_single() ) $template = get_single_template()

-- --> template.php -> get_single_template()
-- -- --> $templates[] = array( \'single.php\', \'single-{post_type}.php\' );
-- -- --> return get_query_template( \'single\', $templates )

-- -- -- --> template.php -> get_query_template( $type, $templates )
-- -- -- -- --> if ( empty($templates) ) $templates = array( \'{$type}.php\' );
-- -- -- -- --> return apply_filters( "{$type}_template", locate_template( $templates ) )
为了注册插件托管的CPT模板,您需要连接到此过滤器并指定其位置。

function load_plugin_cpt_template( $path ) {
    $path = dirname(__FILE__) . \'/single-wpwebinar.php\';

    return $path;
}
add_filter( \'wpwebinar_template\', \'load_plugin_cpt_template\' );
我使用dirname( __FILE__ ) 基于您的CPT模板与具有此功能的文件处于同一级别的假设。如果不是,则相应地调整包含路径。请注意,此功能将绝对覆盖任何single-wpwebinar.php 由主题指定。

作为保护措施,您可以检查的传入值$path 看看我们是否使用single.php 或者一个主题指定的覆盖,但这是我留给你们的练习。

我的网站上还有一个更完整的教程:http://jumping-duck.com/tutorial/theme-ready-custom-post-types-in-wordpress/.

结束

相关推荐