不推荐使用插件类中的函数

时间:2014-02-06 作者:helgatheviking

我正在更新我的一个插件,我有点被弃用函数所困扰。

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

$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()? 还是我遗漏了什么?当有人试图使用不推荐使用的函数删除或添加操作时,是否可以显示调试通知?

Update

我意识到我只是没有看到add_action 当我把它放在页面的很低位置时#facepalm!但是,我仍然没有看到remove_action.

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

不存在的回调

一件好事是do_action(), 也没有apply_filters() 如果没有回调,请触发错误。这意味着它是将插件数据插入模板的最安全的方法:如果关闭插件do_action()/apply_filters() 在全局中找不到回调$wp_filters 数组,什么都没发生。

现在呼叫时输出错误remove_filter() 在最初钩住回调的函数/方法中,回调将从全局数组中删除,这意味着回调将永远不会执行,因为它不再注册。

解决方案很简单:在触发回调后,通过从回调本身中删除它来删除回调。

删除回调

我们都知道,WPs插件“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\' );
您甚至可以更进一步,从全局过滤器数组中提取回调,并将其重新附加到新的挂钩/过滤器(如果它们兼容的话)。

结束

相关推荐