问题描述
我正在编写一个自定义帖子类型的插件。其中一部分我通过短信输出到模板。但是其他部分需要一个自定义的帖子模板,我想出了如何使用 CPT 的模板层次结构。但是自定义模板是在主题中,我认为插件应该是 self-contained,至少要开始。
那么这里最好的做法是什么?我们如何在 CPT 插件中包含模板文件?你能指点一下我们如何做好这个例子吗?
谢谢你的帮助。
最佳解决方案
So what’s the best practice here?
我会说,让主题处理它并提供一个默认的插件的组合。
您可以使用 single_template
过滤器来切换模板。在你的回调中,看看主题是否提供了 post 类型的模板,如果没有做,什么都不做。
<?php
add_filter('single_template', 'wpse96660_single_template');
function wpse96660_single_template($template)
{
if ('your_post_type' == get_post_type(get_queried_object_id()) && !$template) {
// if you're here, you're on a singlar page for your costum post
// type and WP did NOT locate a template, use your own.
$template = dirname(__FILE__) . '/path/to/fallback/template.php';
}
return $template;
}
我喜欢这种方法最好。结合它提供了一套完整的”template tags”(例如 the_content
,the_title
),支持任何与您的帖子类型相关的自定义数据,并为终端用户提供了大量定制功能以及一些声音默认值。 Bbpress 做得很好:包含用户模板,如果它找到并提供了大量的模板标签。
或者,您可以使用 the_content
过滤器的回调,只需更改内容中的内容。
<?php
add_filter('the_content', 'wpse96660_the_content');
function wpse96660_the_content($content)
{
if (is_singular('your_post_type') && in_the_loop()) {
// change stuff
$content .= '<p>here we are on my custom post type</p>';
}
return $content;
}
次佳解决方案
如果请求是针对您的帖子类型,您可以挂接到 template_include
并返回您的插件文件
add_filter( 'template_include', 'insert_my_template' );
function insert_my_template( $template )
{
if ( 'my_post_type' === get_post_type() )
return dirname( __FILE__ ) . '/template.php';
return $template;
}
但这样会大大改变外观。仍然没有干净的解决方案。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。