我正在更新我的一个插件,我有点被弃用函数所困扰。
最初,我的插件有一个全局变量,插件的主类被实例化并存储在全局变量中。这样,用户可以使用全局访问插件类中的函数。
$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_action
和
remove_action
函数似乎不会触发弃用通知。奇怪的是,完全删除该函数也不会导致错误,即使
array( $my_custom_plugin, \'display_input\')
不存在。
如果有人试图直接访问该功能:
$my_custom_plugin->display_input();
然后我确实看到了调试通知。这是预期的结果吗
_deprecated_function()
? 还是我遗漏了什么?当有人试图使用不推荐使用的函数删除或添加操作时,是否可以显示调试通知?
Update
我意识到我只是没有看到
add_action
当我把它放在页面的很低位置时#facepalm!但是,我仍然没有看到
remove_action
.
最合适的回答,由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\' );
您甚至可以更进一步,从全局过滤器数组中提取回调,并将其重新附加到新的挂钩/过滤器(如果它们兼容的话)。