WordPressのadd_actionやadd_filterをremoveする時に、remove_actionやremove_filterを使えばよいというのは検索すると直ぐに出てきます。
テーマ内のフックの場合は、removeするのは簡単なのですが、プラグインの中のフックの場合、いつも通りに行うとエラーになるか、removeできなかったりします。
前から疑問に思っていた内容でもあり、重い腰を上げてremove方法を調べたら、わかったのでまとめておきたいと思います。
プラグイン内部のadd_actionでよく見かける記述
プラグインのソースコードを見て、hookが見つかったときにarray($this,function)というのが付いている時があります。
この部分をfunction.phpなどでそのまま書いて、remove_actionすると$thisがエラーになります。
if ( ! class_exists( 'XXX_plugin ' ) ) {
class XXX_plugin {
public function __construct() {
// この部分のフックをremove_actionしたい
add_action( 'wp' , array( $this, 'setup_xxxx' ) , 20);
}
function setup_xxx(){
//何かの処理
}
}
//最後にプラグインのインスタンスを作成した時に、global変数に入れる
$XXX_plugin = new XXX_plugin();
}
ダメな例
$thisのままfunctions.phpでremove_actionするとエラーになります。
function remove_my_action(){
remove_action( 'wp' , array( $this, 'setup_xxxx' ) , 20);
}
add_action( 'init', 'remove_my_action', 99);
array($this,function)をfunctions.phpでどう扱えばよいか?
ダメな例:$thisをclass名に置き換えてみる
もともと$thisはclass名ということなので、以下のように$thisをXXX_pluginに置き換えます。
エラーは無くなりますが、removeは出来ないままです。
function remove_my_action(){
remove_action( 'wp' , array( XXX_plugin, 'setup_xxxx' ) , 20);
}
add_action( 'init', 'remove_my_action', 99);
良い例:$thisを変数名に置き換えてみる
classのインスタンスが変数に入っているので、$XXX_pluginで$thisを置き換えます。
function remove_my_action(){
global $XXX_plugin;
remove_action( 'wp' , array( $XXX_plugin, 'setup_xxxx' ) , 20);
}
add_action( 'init', 'remove_my_action', 99);
そうすると、エラーも無くなりremoveもできるようになります。
global宣言を追加しないと、変数が参照できないのでそこは注意。
まとめ
プラグインのadd_actionフックをremoveして、別の関数をフックできれば、プラグイン内部を書き換えなくてよいことは結構あります。
そんな時には、今回の記事を思い出すと役に立つかもしれません。