覆盖可插拔的.php函数

时间:2015-07-15 作者:Chaudhry Waqas

我不仅想覆盖pluggable function (wp_new_user_notification) 但是我想确保,如果任何其他插件正在重写同一个函数,那么我的函数也要重写该函数,或者我希望我被重写的函数能够工作,而不是其他插件正在重写同一个函数(wp_new_user_notification). 可能是个愚蠢的问题,但我能做到吗??

2 个回复
SO网友:TheGentleman

对你的问题的简短回答是肯定的;然而,实现这一点的方法有点老套,除非绝对必要,否则我建议不要使用所有这些方法。

自从pluggable functions 通过以下方式实际替换库存功能:function_exists() 无论哪个插件先“插入”函数,都将获胜。你要做的是确保你的插件首先在全球范围内加载。

插件按照其在存储在wp_options 桌子此数组按字母顺序排序。知道了这一点,你有两个选择。

  1. Make it very likely that your plugin is alphabetically first.believe 那个@ 在php中被认为是按字母顺序排在第一位的,所以如果您以@@MyPlugin 然后应该先加载它
  2. Change the order of the array stored in the database using the activated_plugin hook. 我在谷歌上快速搜索了一下,发现有人已经编写了一个函数here. 我已经在下面发布了它,以防链接失效。

    add_action( \'activated_plugin\', \'my_plugin_load_first\' );
    function my_plugin_load_first(){
        $path = str_replace( WP_PLUGIN_DIR . \'/\', \'\', __FILE__ );
        if ( $plugins = get_option( \'active_plugins\' ) ) {
            if ( $key = array_search( $path, $plugins ) ) {
                array_splice( $plugins, $key, 1 );
                array_unshift( $plugins, $path );
                update_option( \'active_plugins\', $plugins );
            }
        }
    }
    
    将此函数放置在插件中,它将重新排序数组,以便首先加载插件。

另一个选项是省略if( function_exists()) 声明函数版本时的语句。如果您这样做了,而其他人已经插入了该函数,那么php将退出,并出现致命错误“函数已经存在”。这将有防止其他人插入功能的效果,但也会阻止网站加载,所以我怀疑这对你来说是一个可行的选择。

SO网友:prosti

只需要在这里创建一个小评论。可插入功能是在WordPress(1.5.1版)的早期引入的,当时我们只有几个插件。如今,许多插件可能使用相同的功能(例如:wp_mail) 我们有麻烦了。

我发现this blog article 有道理。他建议使用过滤器作为可插入函数的解决方案。他调用了该方法short circuiting, 而不是此:

if ( ! function_exists( \'f1\' ) ){
function f1( $name ) {
    echo \'Hello \' . $name;
}
}
您可以:

function f1( $name ) {      
    $pre = apply_filters( \'f1\', false, $name );    
    if ( false !== $pre ) {
        echo $pre;
        return;
    }    
    echo \'Hello \' . $name;
}
很好,但我可以想象解决方案甚至不使用可插拔功能。您只需将可插入函数中的代码复制/粘贴到具有不同名称/类的新插件函数中,就完成了。

当然,如果可插拔功能发生变化,只需发布新的插件版本即可。

结束

相关推荐

需要通过Functions.Php注销脚本

嗯,我有点失望Wordpress注销脚本有多么困难。首先,我得到了所有句柄的列表,所以我查找了它,句柄是jquery migrate然后我将其添加到我的函数中。phpwp_dequeue_script(\'jquery-migrate\'); 还有这个wp_dequeue_script(\'jquery\'); 尽管脚本已正确注册,但它什么也不做。版本字符串出了什么问题,我想不出为什么它们仍然包含这些字符串,应该尽快在下一个WP版本中删除,它们只会在某些情况下阻止缓存正确缓存,这很烦人