私は最近プラグインAPIをもう少し詳しく見てきましたが、 アクションフックとフィルタフックの間に本当の違いは何があるのか を考えていました。どちらもパラメータとしてデータを受け取るイベントであり、どちらも同じことができるようです。
明らかに、アクションが発生したときにアクションが呼び出され、データが操作されたときにフィルタが呼び出されることがわかりますが、これは単なるセマンティックな名前の違いのようです。
セマンティクスとそれらの用途に加えて、それらの間にはどんな本当の違いがありますか?
こんにちは@Sruly:
あなたはほとんどあなた自身の質問に答えました、しかし私は少し詳しく述べます。
アクションフック は、WordPressのコアやプラグインやテーマによって、ある時点でコードを挿入して次のうちの1つ以上を実行する機会が与えられる場合に使用することを目的としています。
echo
をいくつかのHTMLをインジェクトまたは他のコンテンツに応答バッファに入れて、do_action_ref_array()
ではなくdo_action()
によって呼び出されたと仮定します by-reference )。フィルタフック は アクションフック と非常によく似た動作をしますが、その使用目的は値を受け取り、その値の修正版を返すことです。アクションフックのようにフィルタフックを使用することもできます。つまり、フックが呼び出されたときに必要なことを前提として、グローバル変数を変更したり、HTMLを生成したりします。アクションフックで心配する必要がない、フィルタフックについて非常に重要なことの1つは、フィルタフックを使用している人が must return(の修正版)ということです。渡された最初のパラメータ。よくある初心者の間違いは、その値を返すのを忘れることです!
余談として 私はフィルタフックはWordPressの初期のバージョンでは1つのパラメータしか受け取らないために混乱していると感じました。つまり、変更する値を取得しますが、コンテキストを提供するための2番目または3番目のパラメータは取得しません。しかし最近では、そして積極的に、WordPressのコアチームが(私にとっては)フィルタフックに追加のパラメータを追加して、より多くのコンテキストを発見できるようになったようです。良い例はposts_where
フックです。以前のいくつかのバージョンでは、現在のクエリの "where" クラスのSQLという1つのパラメータしか受け付けていませんでしたが、現在はwhere句 と の両方のWP_Query
クラスのインスタンスへの参照を受け付けますそれはフックを呼び出しています。
実際には、フィルタフックはほとんどアクションフックのスーパーセットです。前者は後者ができることは何でもすることができますが、開発者は自分自身がフィルタフックを使って行うのと同じアクションフックを使って値を返す責任を負いません。
しかし、それはおそらく重要なことではありません。私は重要なことは、開発者がアクションフックとフィルターフックのどちらを使うか、あるいはその逆かを選ぶことによって、彼らは意図を伝える、つまり指導を与えるであることです。フックを使用している可能性がある開発者。 "私はあなたに電話をかけるつもりです、あなたがする必要があることは何でもします" _または_ "この値を渡して変更しますが、必ず元に戻してください "。
そのため、最終的には、{フックタイプの選択によって提供されるガイダンスは、区別の真の価値であると私は思います。とにかく、IMO。
お役に立てれば!
add_action()
コア関数のソースを見れば、それはadd_filter()
関数の単なるラッパーです...
do_action()
コア関数を見ると、apply_filters()
コア関数と非常によく似ていますが、大きな違いが1つあります。値を返しません。
だからこれはどういう意味ですか?アクションはフィルタに似ていますが、アクションが値を返さないため、データを変更することはできません。フィルタメカニズムを単純にコピーし、値を返さないことでWordPressのアクションメカニズムを作成するのが簡単であることがわかります。基本的に、アクションでできることは、値を変更せずに単純に関数を実行することだけです。
簡単な言葉で。
アクション は、出力を実行するPHP関数です。
フィルタ は、出力を返すPHP関数です。
更新: 私たちはそこのコードを修正せずにアクションとフィルタを使うどんなプラグインでも拡張することができます。私たち自身のテーマやプラグインにフィルタやアクションを追加することによって。
あなたのテーマのfunctions.php
ファイルの簡単な例を以下でチェックしてください。
関数test(){ echo "Output"; } test();
プログラムの上に出力を表示します。
出力
[注:ここでtest()は単に関数を呼び出します。そしてコールバック関数 'test'を実行してください。
関数test1(){ echo "Output"; } add_action( 'test'、 'test1'); [.____ do_action( 'test');
プログラムの上に出力を表示します。
出力
[注:ここでdo_action('test')
はfunctionの呼び出しのように機能します。そしてコールバック関数 'test1'を実行してください。
関数test2(){ echo "Test 2"; } add_action( 'test'、 'test2'、1); 関数test1(){ echo "Test 1"; } add_action( 'test'、 'test1'、2); do_action( 'test');
プログラムの上に出力を表示します。
テスト2テスト1
[注:ここでdo_action('test')
はfunctionの呼び出しのように機能します。そしてその優先順位でコールバック関数を実行します。
コールバック関数 'test1'は優先度2を持ち、 'test2'は優先度1を持ちます。
優先順位が優先順位1の 'test1'および優先順位2の 'test2'のように優先順位が変更された場合、出力は次のようになります。
[1]テスト1 2 [2]
functions.php
に以下のコードを追加関数test1(){[.____。do_action( 'test_before'); echo "Test 1"; do_action( 'test_after'); add_action( 'test'、 'test1'); do_action( 'test');
プログラムの上に出力を表示します。
[1]テスト1 [2]
それでは、サードパーティの開発者向けにそれがどのように機能するかをチェックするためのサンプルプラグインを作成しましょう。
/wp-content/plugins/
ディレクトリに「simple」フォルダを作成します。/* *プラグイン名:Simple Plugin */ function test_callback_function(){ echo "From plugin"; [。____。 add_action( 'test'、 'test_callback_function');
さて、WordPress管理ダッシュボードから Simple plugin を有効にしてください。
ジャンプメニュープラグインし、それをアクティブにします。
上記のプログラムをプラグインを起動した後、出力を印刷します。
テスト1プラグインから
[注:1から9のプラグインアクションの優先順位を追加すると、次のような出力が表示されます。
pluginTest 1から
WordPressは追加されたすべてのアクションに対して10 priority by default
を考慮しているからです。]
以下の例を確認してください。
単純なPHPの例:
$ data = array( 'one'、 'two'); print_r($ data);
プログラムの上に出力を表示します。
配列([0] => 1 [1] => 2)
$ data = apply_filters( 'my_filter_name'、array( 'one'、 'two')); print_r($ data); add_filter( ' my_filter_name '、function($ old_data){ 戻り値の配列(' three '、' four '); });
プログラムの上に出力を表示します。
配列([0] => 3 [1] => 4)
ここでは、テーマ/プラグインファイルを変更せずに、フィルタmy_filter_name
を追加し、既存の出力array( 'one', 'two' )
をarray( 'three', 'four' )
で変更しました。