#1 楼
您可以使用single_template
滤清器挂钩。/* Filter the single_template with our custom function*/
add_filter('single_template', 'my_custom_template');
function my_custom_template($single) {
global $post;
/* Checks for single template by post type */
if ( $post->post_type == 'POST TYPE NAME' ) {
if ( file_exists( PLUGIN_PATH . '/Custom_File.php' ) ) {
return PLUGIN_PATH . '/Custom_File.php';
}
}
return $single;
}
#2 楼
更新了答案更简洁的版本。
function load_movie_template( $template ) {
global $post;
if ( 'movie' === $post->post_type && locate_template( array( 'single-movie.php' ) ) !== $template ) {
/*
* This is a 'movie' post
* AND a 'single movie template' is not found on
* theme or child theme directories, so load it
* from our plugin directory.
*/
return plugin_dir_path( __FILE__ ) . 'single-movie.php';
}
return $template;
}
add_filter( 'single_template', 'load_movie_template' );
旧答案
在@Brainternet答案中添加了对主题文件夹中自定义帖子类型特定模板的检查。 />
function load_cpt_template($template) {
global $post;
// Is this a "my-custom-post-type" post?
if ($post->post_type == "my-custom-post-type"){
//Your plugin path
$plugin_path = plugin_dir_path( __FILE__ );
// The name of custom post type single template
$template_name = 'single-my-custom-post-type.php';
// A specific single template for my custom post type exists in theme folder? Or it also doesn't exist in my plugin?
if($template === get_stylesheet_directory() . '/' . $template_name
|| !file_exists($plugin_path . $template_name)) {
//Then return "single.php" or "single-my-custom-post-type.php" from theme directory.
return $template;
}
// If not, return my plugin custom post type template.
return $plugin_path . $template_name;
}
//This is not my custom post type, do nothing with $template
return $template;
}
add_filter('single_template', 'load_cpt_template');
现在,您可以让插件用户将模板从您的插件复制到其主题以覆盖它。
在此示例中,模板必须位于插件和主题的根目录中。 br />
评论
对我来说,使用locate_template而不是get_stylesheet_directory听起来像是更干净的选项(可在此处找到:code.tutsplus.com/tutorials/…)。
–费利克斯
16年6月14日在18:11
更新的答案无效,接受的答案(或您的旧答案)有效。
–爱德华
18-3-29在14:43
你是对的,@ Edward,那是可怕的更新。我根据Felix的建议再次对其进行了更新。另外这次我在发布之前测试了代码:)
–campsjos
18-4-3在15:40
#3 楼
我想指出的是,当您使用过滤器方法时,按如下所示对过滤器进行优先级排序非常重要:add_filter('single_template', 'my_custom_template', 99);
如果不这样做为此,有时WP会尝试在此过滤器之后重新检查。正因为如此,将我的头发拉了两个小时。
#4 楼
我为插件使用的方法更好。@campsjos在这里提到,而不是检查文件是否存在,您可以检查
locate_template
,它会检查到主题覆盖模板文件。这是很明显的。function my_plugin_templates() {
if (is_singular('movie')) {
if (file_exists($this->template_dir . 'single-movie.php')) {
return $this->template_dir . 'single-movie.php';
}
}
}
使用
template_include
过滤器钩子加载上述代码。add_filter('template_include' , 'my_plugin_templates');
#5 楼
感谢此页面,我能够为我解决相同的问题。作为参考,这是我最终得到的结果:
function pluginName_myposttype_single_template($single_template) {
$myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';
return get_post_type() === 'myposttype' && file_exists($myposttype_template) ? $myposttype_template : $single_template;
}
add_filter('single_template', 'pluginName_myposttype_single_template');
{$ type} _template过滤器挂钩对我不起作用
function pluginName_myposttype_single_template($single_template) {
$myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';
if ( file_exists($myposttype_template) ) {
$single_template = $myposttype_template;
}
return $single_template;
}
add_filter('single-myposttype_template', 'pluginName_myposttype_single_template');
#6 楼
这项功能适合我,请尝试一下,谢谢模板已加载到cpt文件中,该文件位于
custom_plugin-> app-> cpt-> cpt_article.php
模板位于
/> custom_plugin->应用程序->模板
add_filter( 'single_template', 'load_my_custom_template', 99, 1 );
function load_custom_templates($single_template) {
global $post;
if ($post->post_type == 'article' ) {
$single_template = trailingslashit( plugin_dir_path( __FILE__ ) .'app/templates' ).'single_article.php';
}
return $single_template;
}
#7 楼
上面是一个很好的答案,但是检查$ single var允许模板覆盖由主题/子主题提供的模板。/* Filter the single_template with our custom function*/
add_filter('single_template', 'your_cpt_custom_template');
function your_cpt_custom_template( $single ) {
global $wp_query, $post;
/* Checks for single template by post type */
if ( !$single && $post->post_type == 'cpt' ) {
if( file_exists( plugin_dir_path( __FILE__ ) . 'single-cpt.php' ) )
return plugin_dir_path( __FILE__ ) . 'single-cpt.php';
}
return $single;
}
评论
这不会检查在子级或主题中是否存在single-cpt.php。它仅检查将始终出现在任何主题中的single.php。
– newpxsn
15年10月28日在20:01
没错,当我写这篇文章时,我使用的是一个真正的裸主题,必须有更好的方法!
– DigitalDesignDj
15年11月20日在21:19
评论
真是个好答案。请分享我能获得所有模板可用钩子(例如single_template)的信息。
–古里
13年5月2日在18:18
@gowri过滤器由get_query_template()函数调用。这是一个变量钩子,因此第一部分{$ type} _template会根据传递给该函数的参数而有所不同。参见wp-includes / template.php了解一些常见的信息
–乳木果
13年5月7日在9:42
本教程介绍了single_template挂钩,并提供了很好的解释。一旦理解了钩子,@shea的注释就建议使用add_filter('single-movies_template','my_custom_template');比@Bainternet的答案更简单的方法。如链接教程中所示。 (此问题不适合新答案,因此无法单独添加。)
– Greg Perham
17 Sep 26'4:34
您可以将PLUGIN_PATH替换为plugin_dir_path(__FILE__),然后从文件名中删除第一个斜杠。完整路径如下所示:return plugin_dir_path(__FILE__)。 'Custom_File.php';
–碎料
18-2-13在6:49
PLUGIN_PATH引发了错误,这是一篇很棒的文章,显示了如何执行此操作,它对我很有效:wpsites.net/free-tutorials/…
–内森(Nathan)
19年5月2日在20:19