问题描述
我正在研究一个小孩主题,我强烈不想覆盖主模板文件,以保持子主题的简单性,并尽量减少代码量和维护时间。
在循环中,父主题中的 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
调用
我无法找到一种方式来完成这个没有重复,或者没有结束页面渲染后,通过做一些愚蠢的服务我的模板部分,如 break
或 exit
最佳解决方案
没有钩子这样做。将 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。