在插件中重新声明主题的功能

时间:2016-10-19 作者:Nikita

我想知道如何从插件中重新声明主题的函数。问题是,我在尝试激活插件时遇到了一个“致命错误:无法重新声明”。但是如果我将代码添加到已经激活的插件中,那么一切都会按照预期工作。有什么明显的东西我遗漏了吗?

下面是我正在使用的代码的简化示例:

// 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 否则所以我需要保留主题中的原始函数。

基本上,我认为如果这种方法适用于儿童主题,那么它也应该适用于插件。但很明显,我错了。

4 个回复
SO网友:Tom J Nowell

只能声明一次函数。

我的建议是,将函数放入插件中,然后使用过滤器覆盖主题,例如。

在插件中:

function my_awesome_function() {
    return apply_filters( \'my_awesome_function\', "plugin" );
}
在您的主题中:

add_filter( \'my_awesome_function\', function( $value ) {
    return "theme";
} );
现在,每个呼叫my_awesome_function(); 将返回“主题”而不是“插件”

SO网友:Mark Kaplun

1) 如果你写主题,不要使用function_exists, 改用合适的过滤器。

2) 您的问题来自激活插件时的不同执行顺序。通常插件包含在主题之前,但在这种情况下,插件包含在主题之后

编写插件代码的正确方法是

if ( ! function_exists( \'my_awesome_function\' ) ) {
    function my_awesome_function() {
        return "plugin";
    }
}

SO网友:Benoti

加载函数时,尚未调用第二个函数。因此,function\\u exist检查尚未注册的函数。当第二个正在加载时,第一个已被调用,然后存在并创建致命错误。

如果没有function\\u exists的awesome函数位于子主题或插件文件中,我认为最好反转function\\u exists,检查第二个。

SO网友:Niels van Renselaar

我想你应该用钩子把它包起来。主题和插件中的不同内容有不同的执行时间。如果您钩住右钩子,那么您的代码将在加载主题函数之前执行。有关挂钩的列表,请查看codex:

https://codex.wordpress.org/Plugin_API/Action_Reference

找到适合你的。如果主题将其全部包装在“function\\u exists”中,那么应该可以。