问题描述

我正在研究一个小孩主题,我强烈不想覆盖主模板文件,以保持子主题的简单性,并尽量减少代码量和维护时间。

在循环中,父主题中的 index.php 模板使用:get_template_part( 'content' );

这将带来 content.php,我希望它的行为更像 get_template_part( 'content', get_post_format() ); 或类似的,以便引入不同的模板,如 content-aside.php 等,而不是在子主题中创建一个 index.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);
    }
}

这显然导致了重复的重复,一个来自我的挂钩功能,可以显示所需的模板,另一个来自 get_template_part()中的正常 locate_template 调用

我无法找到一种方式来完成这个没有重复,或者没有结束页面渲染后,通过做一些愚蠢的服务我的模板部分,如 breakexit

最佳解决方案

没有钩子这样做。将 index.php 复制到子主题,并使单行更改。另外,告诉家长主题的作者,他们应该在主题中做出相同的改变,以实现灵活性。

次佳解决方案

我认为这是不可能实现的方式。真的很烦,没有得到一个过滤器来改变模板文件名称:(

我有一个解决办法。让 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 文件。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。