弃用插件类中的函数


8

我正在更新我的一个插件,但对过时的功能有些犹豫。

最初,我的插件具有全局变量,并且插件的主类已实例化并存储在全局变量中。这样,用户可以使用全局变量来访问插件类中的函数。

$GLOBALS['my_custom_plugin'] = new my_custom_plugin();

然后,例如,在我的FAQ中,我有代码显示了如何从特定的钩子中删除类的一个函数并添加到其他钩子中:

function move_input(){ 
    global $my_custom_plugin;
    remove_action( 'before_main_content', array( $my_custom_plugin, 'display_input') );
    add_action( 'after_main_content', array( $my_custom_plugin, 'display_input' ) );
}
add_action( 'wp_head' , 'move_input' );

现在,在我的更新中,该display_input()函数已移至另一个类,我想让人们知道如何访问它。我尝试使用以下弃用通知替换原始功能(在主插件类中):

public function display_input() { 
    _deprecated_function( 'display_price', '2.0', 'my_custom_plugin()->display->display_input' );
    return $this->display->display_input();
}

但是,add_actionremove_action函数似乎不会触发弃用通知。奇怪的是,即使array( $my_custom_plugin, 'display_input')不存在,完全删除该功能也不会导致错误。

如果有人尝试直接访问该功能:

$my_custom_plugin->display_input();

然后,我确实看到了调试通知。这是预期的结果_deprecated_function()吗?还是我错过了什么?当有人尝试使用不推荐使用的功能删除或添加操作时,是否可以显示调试通知?

更新资料

我意识到我根本看不到调试信息,add_action因为我将其添加到页面的较低位置。#facepalm!但是,我仍然没有看到有关的任何调试通知remove_action


有趣的方法call_user_func(function(){trigger_error('hello?');});,但是在每个add_action注册的回调中失败。
fuxia

准备面部护理,但这是一个问题还是声明?
helgatheviking 2014年

只是测试结果。我也很惊讶
fuxia

好了,所以我没有真正被忽视的东西,这就是它是如何
helgatheviking 2014年

2
哦,查询监视器已将消息隐藏在我的设置中。的消息add_action()实际上在那里。remove_action()无法像那样处理。
fuxia

Answers:


2

不存在的回调

一件好事是,如果不存在回调,则既不do_action()也不apply_filters()触发错误。这意味着将插件数据插入模板的最安全方法是:如果插件已关闭并且do_action()/ apply_filters()在全局$wp_filters数组中找不到回调,则不会发生任何事情。

错误输出

现在,当您调用remove_filter()最初钩住了回调函数的函数/方法时,该回调函数只会从全局数组中删除,这意味着该回调函数将不再执行,因为它不再注册。

解决方案很简单:在触发回调之后,通过从回调本身内部将其删除来删除该回调。

删除回调

我们都知道,WP插件“ API”在删除时很痛苦。问题主要是在global $wp_filter;数组中的键上添加“唯一”名称的奇怪构造。一个非常简单的解决方案是只使用__METHOD__并调用要在静态上下文中删除的过滤器:

class FOoooo
{
    public function __construct()
    {
        add_filter( 'hook', array( __CLASS__, 'bar' ) );
    }
    public static function bar( $baz )
    {
        remove_filter( current_filter(), __METHOD__ );

        return $baz;
    }
}

尽管这不是很好,但对于某些用例来说,这是一种解决方案。但是,甚至不要考虑删除闭包。

上面只是删除回调,仍然执行它。您仍然可以继续使用remove_all_actions()(或remove_all_filters())。

// Check if a callback is attached and tell about the deprecated stuff
if ( has_action( 'before_main_content' ) )
    _deprecated_function( 'display_price', '2.0', 'my_custom_plugin()->display->display_input' );
// Remove the callback
remove_all_actions( 'before_main_content' );

您甚至可以走得更远,从全局过滤器数组中提取回调,然后将其重新附加到新的挂钩/过滤器(如果它们兼容)。


谢谢凯撒!这是一个很棒的详细答案。我明天将尝试进行测试。
helgatheviking 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.