WordPress如何在子主题中覆盖父主题功能
自定义 WordPress(父)主题和覆盖模板文件或函数的最好的方法是使用子主题。但如果您想以正确的覆盖子主题中所依赖的父主题功能,则需要添加一些代码。本文章机翻,请决定是否继续阅读
1.利用可插拔功能
可这个词实际上是什么意思?Pluggable 意味着父主题函数被包装在一个function_exists() if-condition 中,以检查该函数是否已经存在——如果存在,该函数将不会被执行,否则 WordPress 将运行该函数。下面是一个带有条件标签的可插入函数的例子:
可插入函数示例
if (!function_exists('my_parent_theme_function')) {
function my_parent_theme_function() {
// Code of your pluggable function
}
}
现在请记住前面提到的内容 – 子主题功能首先在 WordPress 中执行。这意味着您可以简单地从父主题中获取函数,不带条件标记,将其放在子主题的文件functions.php中,让它运行任何您喜欢的东西。这样子主题中的函数将被执行,而不是父主题中的函数。这就是没有 if 语句的函数在您的子主题中的样子:
覆盖可插入函数的示例
function my_parent_theme_function() {
// Code of your new function in the child theme
}
请注意,并不总是建议使用可插拔功能。假设您想覆盖可插入函数中的某些功能。在您的子主题中覆盖整个父函数可能会导致将来出现问题。如果有一天父功能更新,您的子主题将加载旧版本的功能并覆盖新的功能,这可能会导致您的 WordPress 网站出现兼容性问题甚至安全漏洞。
2.指定函数执行的优先级
如果您使用的 WordPress 主题不提供可插拔功能,或者您打算覆盖的功能不可插拔,您需要借助其他方法帮助自己。WordPress 中的函数按特定顺序执行,您可以指定自定义函数的优先级以确定执行顺序。默认情况下,当没有定义其他内容时,此优先级为 10。以下是默认优先级为 10 的函数示例:
具有默认优先级的函数示例
function my_parent_theme_function() {
// Code of your parent theme function
}
add_action('after_setup_theme', 'my_parent_theme_function');
在以下示例中,您可以为子主题中的函数定义更高的优先级 20,因此具有更高优先级的函数将稍后运行并覆盖父主题中的函数:
具有定义优先级的函数示例
function my_child_theme_function() {
// Code of your child theme function
}
add_action('after_setup_theme', 'my_child_theme_function', 20);
3. 利用钩子、动作和过滤器
如果出于某种原因您想永久删除某个函数的结果,那么使用优先级是不够的,也不一定是正确的方法。此外,如果没有可用的可插入函数或者您不想覆盖整个可插入函数,您可能需要仔细查看操作和过滤器。
使用这种方法,您将从附加的操作挂钩中删除父主题功能的结果,从而防止它影响您的网站。之后,您可以在您的子主题中编写自定义功能并相应地挂钩以在您的网站上使用。以下是附加到after_setup_theme操作挂钩的函数示例:
附加到钩子的函数示例
function my_parent_theme_function() {
// Code of your parent theme function
}
add_action('after_setup_theme', 'my_parent_theme_function');
要在您的自定义子主题中覆盖此函数,您首先需要使用remove_action()或remove_filter(),具体取决于在您的子主题中解开该函数的内容。在这种情况下,该函数已添加add_action(),因此您需要使用remove_action():
从钩子中删除函数的示例
remove_action('after_setup_theme', 'my_parent_theme_function');
考虑到这一点,您现在可以在子主题中编写自定义函数,以从父主题中解开该函数。重要的是要知道,为了取消挂钩父主题功能,您需要使用在父主题中使用的挂钩之后调用的动作挂钩,或者您需要使用优先级来确保您的子主题功能在父主题功能之后执行,以便相应地取消挂钩功能。
解除父主题功能的示例
function remove_my_parent_theme_function() {
remove_action('after_setup_theme', 'my_parent_theme_function');
}
add_action('wp_loaded', 'remove_my_parent_theme_function');
成功移除父主题功能后,您可以根据个人需求在子主题中编写新的自定义功能。
结论:在子主题中覆盖父主题功能
可以使用所有这三种方法,但它始终取决于给定的场景。从钩子中删除函数需要更多的努力,但非常适合在子主题中选择性地覆盖父主题函数,而无需覆盖整个可插入函数。在牢记未来主题兼容性和安全性的同时,如果该函数仅运行一个简单的过程,则建议使用可插入函数覆盖父主题函数。
您是否曾尝试在子主题中覆盖父主题功能?您使用了哪种方法,在覆盖父主题时遇到了哪些问题?我们很高兴能在评论中对儿童主题进行编码时更多地了解您的体验。