是否可以覆盖GET_TEMPLATE_PART()的结果?

时间:2014-07-08 作者:TomHarrigan

我正在处理一个子主题,我强烈建议不要重写主模板文件,以保持子主题的简单性,并随着时间的推移尽量减少代码量和维护量。

在循环中,索引。父主题中的php模板使用:get_template_part( \'content\' );

这将带来内容。php,我希望它的行为更像get_template_part( \'content\', get_post_format() ); 或类似的,以便引入不同的模板,例如内容。php等,而不创建索引。php在子主题中覆盖父主题以进行单行更改。

get_template_part() 包括:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( \'\' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}
所以有一个可用的操作,在我的例子中叫做get_template_part_content

我可以通过以下方式来吸引观众:

add_action( \'get_template_part_content\', \'child_post_styles\', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( \'\' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}
这显然会导致后期复制,一个来自我的挂钩函数,它可以显示所需的模板,另一个来自正常的locate_template 请来get_template_part()

我很难找到一种方法来实现这一点,而不需要重复,或者在完成模板部分后不需要立即结束页面渲染,只需执行一些愚蠢的操作,例如breakexit

4 个回复
最合适的回答,由SO网友:Otto 整理而成

没有钩子可以这样做。复制索引。php到子主题并进行单行更改。另外,告诉父主题的作者,为了灵活性,他们应该对主题进行相同的更改。

SO网友:Shazzad

我认为这完全不可能以你想要的方式实现。如果没有设置过滤器来更改模板文件名,那真的很烦人:(

不过我有一个解决办法。让我们使用content.php 用于比较。

// content.php file 
$format = get_post_format();
if( \'\' != $format ){
    get_template_part( \'content-\'. $format );
}
else{
    get_template_part( \'content-default\' );
}
我没有使用get_template_part 函数,而是在第一个参数上传递后缀,以避免对content.php 如果没有\'content-\'. $format 文件

SO网友:T.Todua

嗯,有SOLUTION:

add_action(\'init\', function(){ remove_all_actions(\'get_template_part_content\'); });
add_action(\'get_template_part_content\', \'yourFunc\', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == \'header\'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}
但仔细想想,你应该在哪个钩子里插入那个动作。。。要手动获取位置,请使用,即。locate_template(\'content-header.php\', false);

SO网友:Justin R

如果你想把一个叫做内容的文件放在一边。php您可以这样调用函数:

get_template_part( \'content\', \'aside\' );
第二个参数是连字符后的文件管理器名称。如果文件位于子目录(templates/content-aside.php)中:

get_template_part( \'templates/content\', \'aside\' );
这就是你想要做的吗?

结束

相关推荐

get page templates

我有这个问题,我需要获得所有页面模板。我知道有很多方法可以根据他们的名字得到他们。我知道我可以包含一个页面模板,但我正在尝试将它们包含在索引页面的循环中。我刚刚安装了2012主题,修改了标题以包含我的脚本。我使用了Milo提供的一个功能,将所有帖子和页面加载到正在运行的主页中。现在,我需要包括所有模板,甚至那些我不知道其名称的模板。在抄本中,我发现了一个函数get_page_templates() 这似乎不再有效了。它给出了这个片段 <?php $templates = get_p