お問い合わせはコチラから

プラグインの中のフックを外部からremoveする方法

サイト運営

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して、別の関数をフックできれば、プラグイン内部を書き換えなくてよいことは結構あります。

そんな時には、今回の記事を思い出すと役に立つかもしれません。

タイトルとURLをコピーしました