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


11

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

在循环中,父主题中的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);
    }
}

显然,这会导致帖子复制,一个来自我的钩子函数,可以显示所需的模板,另一个来自普通的locate_template调用get_template_part()

我无法找到一种方法来完成此任务而不重复,也无法在通过做一些愚蠢的事情(例如a breakexit



3
欢迎来到没有模板继承的悲惨生活。:)
Rarst

Answers:


3

没有钩子可以做到这一点。将index.php复制到子主题并进行单行更改。另外,请告知父主题的作者,为了灵活起见,他们应对主题进行相同的更改。


现在这是错误的,请参见@ t-toudua此处
Ivan Castellanos

他的答案不是解决方案,因为模板部分仍在加载和包含。动作钩子不能覆盖它。
奥托

的确如此,但是您可以ob_start在它的内部以及以后的ob_end某个钩子中使用它,以便使它执行但永不回显,这通常就足够了。或者,您可以使用exit()强制终止PHP(在您手动添加仍缺少的所有内容之后:页脚等)
Ivan Castellanos

但这仍然不是解决方案。抑制输出与覆盖事物不同。
奥托

退出不会抑制输出。它实际上有效地停止了执行。
伊万·卡斯特拉诺斯

6

我认为您要实现的方式并非完全可行。没有过滤器来更改模板文件名真的很烦人:(

我对此有一种解决方法。让我们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文件的情况下对文件进行不定式的调用。


我认为这是一个很好的方法。不知道为什么不接受它:)
Anh Tran 2014年

声誉很重要,也许是:)
Shazzad

抱歉@Shazzad,我很高兴给您答复,因为它很聪明:)如果我可以接受两个,我会的。
TomHarrigan 2014年

3

好吧,有解决方案

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);


0

如果要拉入一个名为content-aside.php的文件,请调用以下函数:

get_template_part( 'content', 'aside' );

第二个参数是连字符后的文件名。如果您的文件位于子目录(templates / content-aside.php)中:

get_template_part( 'templates/content', 'aside' );

这就是您想要做的吗?


谢谢,我明白这一点。我希望不必在子主题中创建index.php来覆盖父主题index.php以便进行单行更改。它为子主题增加了更多维护。希望通过钩子来完成。
TomHarrigan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.