TEMPLATE_INCLUDE(通过当前主题覆盖默认插件模板)

时间:2012-05-03 作者:Zach

这是this question/answer. 关于这个问题的评论提到template_include 优先于template_redirect 从插件加载模板时。

但是,将此挂起到template\\u include会破坏网站上的所有内容(任何其他页面视图),但使用布局替代的布局除外http://pastebin.com/LWpSrfim 但是使用template\\u include只预先添加内容(到放置在主题目录覆盖中的任何模板文件)——例如,下面仍然输出标准的单一视图。

编辑:源代码

<?php
class moulding_templates {
    public static function determine_template(){
        global $post,$wp_query;

        // custom post types
        $post_type_array = array(\'moulding_profiles\',\'moulding_combination\',\'moulding_collection\',\'idea_gallery\');
        foreach ($post_type_array as $post_type_single) {
            global $post;
            if (is_singular($post_type_single)) {
                moulding_templates::loadSingleTemplate($post);
            }
        }
        // custom taxonomies
        $taxonomy_array = array(\'profile_categories\',\'combination_categories\',\'wood_types\');
        foreach ($taxonomy_array as $taxonomy_single) {
            if (is_tax($taxonomy_single)) {
                moulding_templates::loadTaxonomyTemplate($taxonomy_single);
            }
        }
    }

    private static function loadSingleTemplate($post) {
        $template_name = \'moulding-templates/single-\'.$post->post_type.\'.php\';
        $template = locate_template(array($template_name), true);
        if(empty($template)) {
            include(MOULDINGS_BASE_DIR . \'includes/\' . $template_name);
            exit();
        }
    }
    private static function loadTaxonomyTemplate($taxonomy) {
        $template_name = \'moulding-templates/taxonomy-\'.$taxonomy.\'.php\';
        $template = locate_template(array($template_name), true);
        if(empty($template)) {
            include(MOULDINGS_BASE_DIR . \'includes/\' . $template_name);
            exit();
        }
    }
}
add_action(\'template_include\', array(\'moulding_templates\', \'determine_template\'));

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

所以template_redirect 用于规范化、提要等,如果您想更改所提供的模板template_include 首选。

不像template_redirect, template_include 是一个filter 它过滤模板页的路径。这意味着您不加载/包含模板,只需返回模板路径即可。WordPress直接包含返回的内容。

除了作为适当的钩子之外,它还允许函数被解除钩子或被覆盖,如果它将被分发的话,应该是这样。

Related question: Custom Taxonomy in plugin and template

正在运行的示例(GitHub Repo):https://github.com/stephenh1988/Event-Organiser/blob/master/includes/event-organiser-templates.php

示例用法:

 function wpse51038_maybe_alter_template($template){

    // is a specific custom taxonomy being shown?
    $taxonomy_array = array(\'profile_categories\',\'combination_categories\',\'wood_types\');
    foreach ($taxonomy_array as $taxonomy_single) {
        if ( is_tax($taxonomy_single) ) {
            //For plugins. You may want to check this template exists before over-riding
            $template = plugin_dir_path(\'path/to/my/tax-template.php\', __FILE__ );
            break;
        }
    }

  return $template;

 }
 add_filter(\'template_include\',\'wpse51038_maybe_alter_template\');
您可能想看看上面链接的相关问题-这显示了如何允许主题超越插件(比如他们的主题/子主题中是否有一个特别命名的模板文件)。

结束

相关推荐