WordPress会自动查看子主题,以便在模板层次结构中替换模板,以及一些其他文件,如searchform.php或comments.php,但父主题加载的任何其他文件只有在父主题作者构建它们时才可在子主题中替换。这包括functions.php或模板中包含的所有文件。
对于可由子主题替换的文件,必须使用支持的函数加载它。例如,如果主题(像您的主题)加载如下文件:
require_once get_template_directory() . '/include/aq_resizer.php';
然后,子主题无法替换它。这是因为路径的 '/include/aq_resizer.php'
部分根本不通过WordPress。这是一个普通的PHP包含WordPress无法拦截。此外, get_template_directory()
将只是父主题的目录,而不是子主题(如果有主题)。
为了能够替换子主题中的整个文件,父主题必须使用以下函数之一加载它:
require_once get_theme_file_path( '/include/aq_resizer.php' );
因为文件路径作为参数传递给 get_theme_file_path()
,而不是仅仅是直接传递给PHP的连接字符串,所以函数可以首先查看子主题,而不是它。
对于模板,如果父主题使用 get_template_part()
,则为:
get_template_part( 'partials/content' );
然后子主题可以创建 partials/content.php
来替换它,但是如果父主题使用 include partials/content.php
,那么就不可能用子主题替换。
get_theme_file_path()
比 get_template_part()
(在 3.0 中引入)更新(在 4.7 中引入),因此不太常见,而且在旧版本中不存在主题。它也不为人所知。
在您的代码中,父主题不使用这些方法中的任何一种,因此无法替换整个文件。这意味着您需要逐个替换单个功能。执行此操作的方法取决于函数的使用方式。
如果父主题使用 add_action()
挂钩该功能
如果父主题挂钩要用 add_action()
替换的函数,则可以通过在子主题中创建函数的新版本(使用不同的名称)来替换该函数,并使用<取消原始函数a href =“https://developer.wordpress.org/reference/functions/remove_action/”> remove_action()
,然后用 add_action()
:
remove_action( 'hook_name', 'parent_theme_function_name' );
add_action( 'hook_name', 'child_theme_function_name' );
如果父主题使用模板文件中的功能
如果父主题有一个你要替换的函数,并且该函数在模板文件中使用,那么你需要在子主题中创建一个新版本的函数(使用不同的名称)然后替换您孩子主题中的模板文件,然后在您孩子主题的模板版本中用新功能替换原始功能使用。
如果父主题功能是可插入的
父主题在子主题之前加载。这意味着主题开发人员可以通过在 function_exists()
检查中包装然后使子主题替换功能。这意味着您可以使用自己的函数替换函数定义,并且不会导致冲突,因为如果您已经有父主题,则不会尝试重新定义它。
您的代码有一个示例: moto_setup()
函数位于此检查中:
if ( ! function_exists( 'moto_setup' ) ) :
endif;
这使得 moto_setup()
函数“可插入”,这意味着您可以在子主题中定义 moto_setup()
函数,而父主题将使用它。
如果不看代码,主题中的其他功能是否可以“插入”是不可能的。
结论
- 不一定可以替换子主题中的整个文件。在少数核心WordPress模板之外,父主题必须明确支持可替换的文件。
- 如果主题没有使函数文件可替换,则有几个替换函数的选项,具体取决于父主题的构造方式。
- 根据父主题的构造方式,完全可能的是,有些部分无法替换为子主题,而无需替换您不想更改的主题的大块。这可以达到这样的程度,即只需要分配主题并创建一个新主题。
只需使用
function moto_setup() {
// Your new moto_setup function
}
不检查函数是否存在。该函数将覆盖父主题中声明的 moto_setup()
。