WordPress 的文章模板文件是 single.php,如果要不同的自定义文章类型使用不同的模板文件可以把模板文件放在主题根目录 single-{post_type}.php,WordPress 检测到就会自动使用。

但是插件开发者怎么实现给自定义文章类型设置单独的模板文件呢?这里就要介绍两个非常实用的过滤器。

{$type}_template

{$type}_template 过滤器是 get_query_template() 函数最终返回的模板文件路径,$type 指的是页面类型,比如文章页就是 $type 就是 single.

下边的代码就是给 slider 自定义文章类型单独设置一个 PHP 模板:

/**

    *WordPress 不同自定义文章类型使用不同的模板文件

    *https://www.weixiaoduo.com/custom-post-type-template/

*/

functionBing_slider_custom_post_type_template($template){

    if($GLOBALS['post']->post_type=='slider')$single_template=plugin_dir_path(__FILE__).'slider-template.php';

    return$single_template;

}

add_filter('single_template','Bing_slider_custom_post_type_template');

以此类推,用 {$type}_template 过滤器还可以设置存档 (archive) 、分类 (category) 和标签 (tag) 等页面模板。

template_include

template_include 是最终要引入的模板的路径的过滤器,任何页面的模板都可以用这个来修改。

比如下边的代码用来给 slider 自定义文章类型单独设置一个 PHP 模板:

/**

    *WordPress 不同自定义文章类型使用不同的模板文件

    *https://www.weixiaoduo.com/custom-post-type-template/

*/

functionBing_slider_custom_post_type_template($template){

    if(is_single()&&$GLOBALS['post']->post_type=='slider')$single_template=plugin_dir_path(__FILE__).'slider-template.php';

    return$single_template;

}

add_filter('template_include','Bing_slider_custom_post_type_template');

template_include 可以过滤任何的模板文件路径,用它可以自定义所有模板文件路径。