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