眾所周知,WordPress 可以通過add_action()和add_filter()將函數(shù)掛載到對應(yīng)的鉤子中,從而實現(xiàn)對功能的修改。
我們在進(jìn)行WordPress開發(fā)的時候,有時需要對已經(jīng)掛載的函數(shù)做一些修改操作,可能就需要先取消掛載原有的函數(shù),然后將我們自己函數(shù)掛載到鉤子中。相信不少朋友都知道可以使用remove_action()或remove_filter()函數(shù)即可輕松完成這個操作。
以下是一個簡單的示例:
假設(shè)有一個插件通過add_action()和add_filter()掛載了自定義函數(shù):
add_action('save_post', 'my_action_callback');
add_filter('the_content', 'my_filter_callback');
我們只需要通過下面的代碼即可取消掛載上面的函數(shù):
remove_action('save_post', 'my_action_callback');
remove_filter('the_content', 'my_filter_callback');
看起來非常簡單,對吧?但是如果在一個類中掛載了函數(shù),又該如何取消掛載呢?比如:
class Some_Plugin_Class {
function __construct() {
add_action( 'save_post', array( $this, 'my_action_callback' ));
}
function my_action_callback(){
//do something
}
}
$some_plugin_class = new Some_Plugin_Class();
如果這個類有實例
由于action是在類中注冊的,因此必須使用類對象才能訪問其鉤子。對于熟悉PHP的朋友,可以看出上面的類初始化了一個實例,也就是一個類對象,那我們就可以通過下面的代碼取消掛載:
//訪問類實例對象
global $some_plugin_class;
//取消掛載函數(shù)
remove_action('save_post', array($some_plugin_class, 'my_action_callback'));
如果這個類沒有實例
如果某個類由于某種原因沒有實例(即靜態(tài)類),請使用類的名稱代替實例:
//取消掛載靜態(tài)類的鉤子函數(shù)
remove_action('save_post', array('Some_Plugin_Class', 'my_action_callback'));
注意:優(yōu)先級必須匹配
如果在添加action時使用了優(yōu)先級參數(shù),則remove_action()必須具有相同的優(yōu)先級參數(shù)才能正確取消掛載。比如:
class Some_Plugin_Class {
function __construct() {
add_action( 'save_post', array( $this, 'my_action_callback' ), 57);
}
function my_action_callback(){
//do something
}
}
$some_plugin_class = new Some_Plugin_Class();
這個時候,我們應(yīng)該在取消掛載時使用相同的優(yōu)先級參數(shù)“57”:
//訪問實例對象
global $some_plugin_class;
//使用相同的優(yōu)先級取消掛載
remove_action('save_post', array($some_plugin_class, 'my_action_callback'), 57);
以上就是今天的內(nèi)容,推薦繼續(xù)閱讀:
add_action()add_filter()remove_action()remove_filter()- 50個 WordPress 過濾鉤子
- 50個 WordPress 動作掛鉤
- WordPress 插件開發(fā)教程 Part 3 – 鉤子( Hooks )





您好 , 看了您的文章,有一個問題 。
我使用的主題中,有一個類在類中掛載了函數(shù) , 但是此類創(chuàng)建對象的時候沒有賦值。 比如
class A{
public function __construct(){
add_action(‘wordpress_hook’ , ‘A_function’ , 10) ;
}
public static function A_function(){
//
}
}
new A();
此情況下, 我應(yīng)該怎么調(diào)用 remove_action , 去刪除此內(nèi)注冊的動作 ? 我嘗試過 remove_action(‘wordpress_hook’ , array(‘A’
, ‘A_function’ ) , 10 ) , 但是沒有成功 。