ワードプレスのトラブル対策

add_action と add_filter との違い

add_action , do_action もしくは、 add_filter と apply_filters を調べていると同じ?と思えてしまうんですが、実はやや違っていて、その差を簡単に説明してみます。

add_action と add_filter との違い


add_action は、関数を使うよって宣言。

do_action は、実際に関数を呼び出す。

例えば、

add_action(‘template_redirect’, ‘redirect_canonical’);

は、

do_action( ‘template_redirect’ );が呼ばれた時に、function redirect_canonical を呼び出してくれよって宣言。

いくつかの関数をまとめて呼び出す時に使います。
—————————————–
//アクション関数をフック (my_echoに my_echo1 を登録)
add_action( ‘my_echo’, ‘my_echo1’ );
function my_echo1(){ //実行するアクションの定義
echo ‘echo 1
‘;
}
//アクション関数をフック (my_echoに my_echo2 を登録)
add_action( ‘my_echo’, ‘my_echo2’ );
function my_footer_link_cat(){ //実行するアクションの定義
echo ‘echo 2
‘;
}
—————————————–


do_action(‘my_echo’);

を呼ぶと
my_echo1、my_echo2が順次実行されます。

— 出力結果 —
echo 1
echo 2


と書くと混乱する。

フック、フィルターというのは、呼び出す準備をしてあるから、あとは定義してねって言われていると考える。


つまり、カスタマイズ(フック)したい関数の中に do_action あるいは apply_filter がその関数の中に無ければフックは成立しない。

逆に目的の関数の中に do_action または apply_filter が設定してあれば add_filter によって do_action , apply_filter の飛び先を指定することができる。


だから do_action しかない場合がある

だから、do_action しかない場合がある。

do_action しかないのは当たり前。なぜなら do_action , apply_filter は呼び出し(フック/フィルター)を用意してあるだけだから。関数本体は、使う側が add_action や add_filter を関数本体の名前を定義して関数を書く。


プログラムを読んでいるとdo_action しかない場合があります。

関数の本体は?・・・ではなく、タグを add_action/add_filter で飛び先の関数を定義してあげると、
そこではじめて指定した関数を呼んでくれるという仕組みです。

たとえば、
function xxxxxFunc()
{
 ~
 do_action(‘abc’,$para1,$para2);
}

とあった場合、これは特に何をするでもありません

ところが、add_filter(‘abc’,’myfunc’) と書いてあげると
xxxxxFunc の呼出し時に myfunc を呼び出してくれるんです。

ただし、do_action で定義してあるものは、結果を返すものではなく、「実行するだけ」の関数です。

つまり do_action が埋め込んである関数の作り出す結果を変更するものではありません。

埋め込んである関数の作り出す結果を変更できるのは apply_filter が埋め込んである関数です。

※do_action の飛び先関数一覧は、add_action で登録していきます。

apply_filter の飛び先は、add_filter で宣言します。

※その関数(例えば前述のxxxxxFunc)の結果を変更できるようにするには、do_action ではなくapply_filterが呼び出されていなければならない。


add_action って何?

add_filter は、apply_filters を呼び出しているところから呼び出されている関数を実行。
add_action は、タグにつなげる関数を登録する関数と考えるといいです。

function xxxxxFunc()
{
 ~
 $res = apply_filters(‘abc’,$res,$para1,$para2); —-(1)
 do_action(‘abc’,$res,$para1); —-(2)
 ~
 return($res);
}

—-
add_filter(‘abc’,’myfunc’); <---- xxxxxFunc が呼び出されたら「その中にある」 apply_filters で myfuncを呼び出してね。
function myfunc($res,$para1,$para2)
{
 ~
 return($res);
}
add_action('abc','addMyFunc'); <---- do_action('abc' が呼ばれたら addMyFinc も実行してね。
function addMyFunc($res,$para1)
{
 ~
}
-----

これで、xxxxxFunc が呼び出されると myfunc((1)があるから) が実行され、
その後 addMyFunc((2)があるから) が実行されます。


do_action の入っていない関数の実行時にその関数は呼び出されない

function xxxxxFunc()
{
 ~
 $res = apply_filters(‘abc’,$res,$para1,$para2); —-(1)
 ~
 return($res);
}
となっていれば、当然ですが
add_action(‘abc’,’addMyFunc’);
function addMyFunc($res,$para1)
{
 ~
}
と書いても何も起こりません。

do_action(‘abc’ があってはじめて add_action(‘abc’ が有効になります。

同様に

apply_filtersの入っていない関数の実行時にその関数は呼び出されない

function xxxxxFunc()
{
 ~
 do_action(‘abc’,$res,$para1); —-(2)
 ~
 return($res);
}
となっていれば
add_filter(‘abc’,’myfunc’);
function myfunc($res,$para1,$para2)
{
 ~
 return($res);
}
と書いても何も起こりません。
apply_filter があってはじめて add_filter が使えます。


do_action と apply_filter / add_action と add_filter

元となる関数で設定しておかないと意味をなさないのが add_action と add_filter。

元となる関数で定義しておくのが do_action と apply_filter。

さっと見た違いは、戻り引数があるのか、ないのか。

正確には、

add_action は、実行テーブル(と言うのか知らないけど)にdo_actionを呼び出したとき実行すべき関数を登録する命令。

add_filter は、定義した「タグ」と結びついている関数を呼び出す命令。

add_action と add_filter の違い

add_action も add_filter もタグと関数本体を結び付けます。

add_action は、add_action の関数の中で add_filter を呼び出して、呼出し関数テーブルに関数本体のテーブルに関数を登録してますから、基本的に同じもので、1つのタグに複数個登録することができます。

テーブルに入ってる順番に呼び出していくわけですが、その登録順を指定するのが add_action , add_filter の第3引数のプロパティです。(第4引数は、呼び出す時に追加できる引数)

プロパティは、小さいほどテーブルの前(実行順の前の方)に登録されていきます。

プロパティを指定しない場合は、10 という値ですから、プロパティの最大(最後の方に実行される)値は 10 で最少は 0 (プロパティは整数値指定なので)です。

このことからadd_action , add_filter の関数登録時に、タグ+プロパティでテーブルが並び替えされていると推測されます。

add_action も add_filter も関数を登録してあるテーブルは共通ですが、実行時の戻り引数の有無の違いがあります。


スポンサードリンク

関連記事一覧