我试图弄清楚如何从插件中重新声明主题的功能。问题是,当我试图激活插件时,我得到了一个“致命的错误:无法重新声明”。但是如果我将代码添加到已经激活的插件中--一切都如预期的那样工作。有什么明显的东西我错过了吗?
下面是我使用的代码的一个简化示例:
// In my theme I use function_exists check
if ( ! function_exists( 'my_awesome_function' ) ) {
function my_awesome_function() {
return "theme";
}
}
// Now I want to override 'my_awesome_function' output in a plugin
function my_awesome_function() {
return "plugin";
}编辑:
在给定的示例中,如果插件是活动的,则需要my_awesome_function()返回plugin,否则返回theme。所以我需要在主题中保留原来的功能。
基本上,我认为如果这种方法适用于子主题,那么它也应该适用于插件。但很明显我错了。
发布于 2016-10-19 10:01:56
只能声明一次函数。
我的建议是,将函数放在插件中,然后在主题中使用过滤器来覆盖。
在插件中:
function my_awesome_function() {
return apply_filters( 'my_awesome_function', "plugin" );
}在你的主题中:
add_filter( 'my_awesome_function', function( $value ) {
return "theme";
} );现在,对my_awesome_function();的每次调用都将返回“主题”而不是“插件”
发布于 2016-10-19 11:02:16
1)如果你写了一个主题,不要使用function_exists,用适当的过滤器代替。
2)当启动插件时,您的问题来自不同的执行顺序。通常插件包含在主题之前,但在这种情况下,插件包含在主题之后。
编写插件代码的正确方法是
if ( ! function_exists( 'my_awesome_function' ) ) {
function my_awesome_function() {
return "plugin";
}
}发布于 2016-10-19 10:02:02
当函数加载时,尚未调用第二个函数。因此,function_exist检查一个尚未注册的函数。当第二个加载时,第一个已被调用,然后存在并创建致命错误。
如果没有function_exists的出色功能位于子主题或插件文件中,我认为最好将function_exists检查转换为第二个。
https://wordpress.stackexchange.com/questions/243245
复制相似问题