错误出现在您添加的代码中:
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/.