从我的主题中的子文件夹加载模板文件?

时间:2011-03-11 作者:MrStack

我在一个网站上工作,将有多达30个模板。

我不想让我的主题文件夹根目录下的所有模板把所有东西都弄得乱七八糟。

我知道如何修改get_page_templates() 文件中的函数wp-admin/includes/theme.php 让它扫描我的主题文件夹中的子目录。但我不想手动更改核心文件-如何将筛选器应用于get_page_templates() 用我放进去的过滤器functions.php ?

正如您在下面看到的代码是我第一次尝试这一点,但当我将代码放入其中时,它还不起作用function.php.

但是,我可以将这些更改放入核心文件中wp-admin/includes/theme.php 但这不是一个好的做法,应该始终正确避免,因为自动更新可以消除它。

function get_page_templates_override() 
{
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme][\'Template Files\'];
$page_templates = array();

if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
        $basename = str_replace($base, \'\', $template);

        // modifide this by commenting it out so that sub dirs arent blocked
        // if ( false !== strpos($basename, \'/\') )
        //  continue;

        // modified this with FILE_USE_INCLUDE_PATH so sub dirs get scanned
        $template_data = implode( \'\', file( $template, FILE_USE_INCLUDE_PATH ));

        $name = \'\';
        if ( preg_match( \'|Template Name:(.*)$|mi\', $template_data, $name ) )
            $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
            $page_templates[trim( $name )] = $basename;
        }
    }
}
return $page_templates;
}
add_filter(\'get_page_templates\',\'get_page_templates_override\', 1);

3 个回复
SO网友:Rarst

那部分非常坚硬,看这个question about loading page templates from plugin directory.

有了相关代码的当前状态,我就不想在这方面花费时间了。尤其是因为您想要它是为了方便(将模板放在子目录中),而不是为了功能(比如从插件文件夹加载)。

SO网友:scribu

这里有几张票:#13265#11216.

此外,如果在每个模板前面加上固定字符串,则看起来不那么凌乱:

template-a.php
template-b.php
等等。

SO网友:Grant Palin

值得一提的是,从WP 3.4(大约一年前)开始,现在可以将模板文件放在主题根目录下的目录中,WordPress将根据需要检测并使用它们。

根据http://nacin.com/2012/03/29/page-templates-in-subdirectories-new-in-wordpress-3-4/.

结束

相关推荐

Adding goodies to themes

如何在主题更新时向Arjuna-X等主题添加内容而不丢失?儿童主题是一种很好的方式,还是有其他选择?如果新版本的主题对我添加的功能具有本机支持,该怎么办?