子主题不是扩展主题的唯一方式,甚至不是最好的方式。
许多主题都提供了挂钩:动作和过滤器。您可以使用这些更改每个插件的输出。
假设您有一个名为Acme的主题index.php
包含以下代码:
get_header();
do_action( \'acme.loop.before\', \'index\' );
?>
<div id="container">
<div id="content" role="main">
<?php
/*
* Run the loop to output the posts.
* If you want to overload this in a child theme then include a file
* called loop-index.php and that will be used instead.
*/
get_template_part( \'loop\', \'index\' );
?>
</div><!-- #content -->
</div><!-- #container -->
<?php
do_action( \'acme.loop.after\', \'index\' );
do_action( \'acme.sidebar.before\', \'index\' );
get_sidebar();
do_action( \'acme.sidebar.after\', \'index\' );
get_footer();
现在,您可以编写一个小插件,围绕这些特定区域添加包装(可能是第二幅背景图像):
add_action( \'acme.loop.before\', function( $template ) {
if ( \'index\' === $template )
print "<div class=\'extra-background\'>";
});
add_action( \'acme.loop.after\', function( $template ) {
if ( \'index\' === $template )
print "</div>";
});
为其他修改添加其他独立插件。
这有四个好处:
- 如果你不再需要,可以在插件管理中关闭额外的行为。与子主题不同,您可以分别为每个插件执行此操作,而不必像您只有一个子主题时那样打开每个自定义项。
它比子主题快得多,因为当WordPress搜索模板但找不到模板时,它会同时搜索子主题和父主题。当没有子主题时,这是不可能发生的。
出现问题时,调试更容易。对于子主题,很难看到错误来自何处,是子主题还是父主题。或者两者兼而有之,这是额外的乐趣。
安全更新。有时,当您更新父主题时,子主题不再工作,或者更糟:它的工作方式不同。它甚至可能引发致命错误,因为您在子主题中使用的函数在父主题中不再可用。
Summary: 尽可能使用钩子,仅当父主题没有提供好的钩子时才使用子主题。请主题作者添加缺少的钩子。如果你能提供一个有效的用例,我相信他/她会实现它。