WordPress で特定のフックに指定したコールバックが登録されているか確認する方法

サードパーティのプラグインの機能を補完するプラグインを書いていて、そのプラグインがある特定のイベントにコールバックが登録されているかどうかを判定する必要があり、そのためのコードを書いた。

登録したコールバックの重複

WordPress では、イベントへのコールバックの登録は、add_action() もしくは add_filter() を使う。実は、普通の関数やスタティックのメソッドを登録する場合、既に同じ関数・スタティックメソッドが同プライオリティで登録されている場合は、上書きされ、重複して呼び出されることはない。例えば、

としても、do_my_stuff() は一度しか呼ばれない。しかし、次のように、同じ関数でも、プライオリティが違うと、2度呼ばれる。

また、同じメソッドでも、オブジェクトが別インスタンスだと、別メソッド扱いされる。次の例では2回呼ばれる。

判定のメソッド

で、そのサードパーティプラグインが、ある特定のフックをかけていないときはかけてね、ということがしたかったので次のクラスを書いた。ユーティリティとしてポータブルに使えればと、スタティックにしてある。

クラス

使い方

使い方は、hasCallback() メソッドにアクション/フィルターフック名、コーラブル、プライオリティを与える。戻り値はブーリアンの true/false で、判定に使える。プライオリティが省略された場合、プライオリティ毎に登録されているコールバックを順にチェックしていくというデザインにしてある。以下のような感じで使う。クラス名とか適当に変えて使えばよろし。

スタティックメソッドだったら、重複しないのだからチェックいらないのでは、という疑問がわくかも知れないが、サードパーティ側でプライオリティに変更を加えた場合に、重複することになるので、それに備えて保険としてチェックはあったほうが良い。

使用条件

  • WP_Hook クラスが導入された WordPress 4.7 以降でのみ動作可能。

Leave a Reply

Your email address will not be published. Required fields are marked *