web-dev-qa-db-ja.com

フィルタフックとアクションフックの違いは?

私は最近プラグインAPIをもう少し詳しく見てきましたが、 アクションフックとフィルタフックの間に本当の違いは何があるのか​​ を考えていました。どちらもパラメータとしてデータを受け取るイベントであり、どちらも同じことができるようです。

明らかに、アクションが発生したときにアクションが呼び出され、データが操作されたときにフィルタが呼び出されることがわかりますが、これは単なるセマンティックな名前の違いのようです。

セマンティクスとそれらの用途に加えて、それらの間にはどんな本当の違いがありますか?

49
Sruly

こんにちは@Sruly

あなたはほとんどあなた自身の質問に答えました、しかし私は少し詳しく述べます。

アクションフック

アクションフック は、WordPressのコアやプラグインやテーマによって、ある時点でコードを挿入して次のうちの1つ以上を実行する機会が与えられる場合に使用することを目的としています。

  1. echoいくつかのHTMLをインジェクトまたは他のコンテンツに応答バッファに入れて、
  2. 1つ以上の変数に対してグローバル変数の状態を変更、および/または
  3. フック関数に渡されるパラメータの変更(フックが変数の引き渡しをサポートしていないため、フックが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。

お役に立てれば!

56
MikeSchinkel

add_action()コア関数のソースを見れば、それはadd_filter()関数の単なるラッパーです...

do_action()コア関数を見ると、apply_filters()コア関数と非常によく似ていますが、大きな違いが1つあります。値を返しません。

だからこれはどういう意味ですか?アクションはフィルタに似ていますが、アクションが値を返さないため、データを変更することはできません。フィルタメカニズムを単純にコピーし、値を返さないことでWordPressのアクションメカニズムを作成するのが簡単であることがわかります。基本的に、アクションでできることは、値を変更せずに単純に関数を実行することだけです。

11
trusktr

簡単な言葉で。

アクション は、出力を実行するPHP関数です。

フィルタ は、出力を返すPHP関数です。

更新: 私たちはそこのコードを修正せずにアクションとフィルタを使うどんなプラグインでも拡張することができます。私たち自身のテーマやプラグインにフィルタやアクションを追加することによって。


使い方?

アクション:

あなたのテーマのfunctions.phpファイルの簡単な例を以下でチェックしてください。

  1. 例1: (単純PHP例)
関数test(){
 echo "Output"; 
} 
 
 test(); 

プログラムの上に出力を表示します。

出力

[注:ここでtest()は単に関数を呼び出します。そしてコールバック関数 'test'を実行してください。


  1. 例2: (単純なアクションの使用)
関数test1(){
 echo "Output"; 
} 
 add_action( 'test'、 'test1'); 
 [.____ do_action( 'test'); 

プログラムの上に出力を表示します。

出力

[注:ここでdo_action('test')はfunctionの呼び出しのように機能します。そしてコールバック関数 'test1'を実行してください。


  1. 例3: (別のアクションの使用)
関数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]

  1. 例4: (サードパーティーサポート) functions.phpに以下のコードを追加
関数test1(){[.____。do_action( 'test_before'); 
 echo "Test 1"; 
 do_action( 'test_after'); 
 add_action( 'test'、 'test1'); 
 
 do_action( 'test'); 

プログラムの上に出力を表示します。

[1]テスト1 [2]

それでは、サードパーティの開発者向けにそれがどのように機能するかをチェックするためのサンプルプラグインを作成しましょう。

  1. /wp-content/plugins/ディレクトリに「simple」フォルダを作成します。
  2. 「simple.php」という名前のファイルを作成し、以下のコードを追加します。
/* 
 *プラグイン名: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)
  1. 例1: (フィルタの単純な使用)
 $ 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' )で変更しました。


4
maheshwaghmare