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


51

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

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

セマンティクスとそれらの用途に加えて、それらの間に実際の違いは何ですか?

回答:


58

こんにちは@Sruly

あなたは自分の質問にほとんど答えましたが、少し詳しく説明します。

アクションフック

アクションフックは、WordPressコアまたは一部のプラグインまたはテーマが特定の時点でコードを挿入し、次の1つ以上を実行する機会を提供する場合に使用することを目的としています。

  1. HTMLまたはその他のコンテンツを応答バッファーecho挿入するために使用します
  2. 1つ以上の変数のグローバル変数の状態変更する、および/または
  3. フック関数に渡されたパラメーター変更します(フックは、変数の参照渡しをサポートしていないため、do_action_ref_array()代わりにフックが呼び出されたと仮定します)。do_action()

フィルターフック

フィルターフックの動作はアクションフックに非常に似ていますが、その用途は値を受け取り、変更されたバージョンの値を返すことです。フィルターフックは、アクションフックのように使用することもできます。つまり、フックが呼び出されたときに行う必要があることを前提として、グローバル変数を変更したり、HTMLを生成したりします。アクションフックについて心配する必要のないフィルターフックについて非常に重要なことの1つは、フィルターフックを使用するユーザーが、渡された最初のパラメーター(の修正バージョン)を返す必要があることです。一般的な初心者の間違いは、その値を返すことを忘れることです!

追加のパラメーターを使用してフィルターフックにコンテキストを提供する

余談ですが、WordPressの以前のバージョンではフィルターフックが1つしかパラメーターを受け取らないため、フィルターフックが詰まっていると感じました。つまり、変更する値を取得しますが、コンテキストを提供するための2番目または3番目のパラメーターは取得しません。しかし、最近、そして積極的に、WordPressコアチームが喜んで(私にとって)フィルターフックに追加のパラメーターを追加して、より多くのコンテキストを発見できるようにしているようです。良い例がposts_whereフックです。いくつかのバージョンは、現在のクエリの「where」クラスSQL であるパラメーターを1つしか受け入れなかったが、今ではwhere句WP_Query、フックを呼び出すクラスの現在のインスタンスへの参照の両方を受け入れると考えています。

それでは、本当の違いは何ですか?

実際には、フィルターフックはほとんどアクションフックのスーパーセットです。前者は後者ができることを何でも行うことができ、開発者はフィルターフックで行うアクションフックで値を返す責任がありませんが、もう少しです。

ガイダンスと電信の意図を与える

しかし、それはおそらく重要ではないでしょう。重要なのは、アクションフックとフィルターフックのどちらを使用するか、またはその逆を選択する開発者がその意図電信しているため、フックを使用する可能性のあるテーマ開発者またはプラグイン開発者にガイダンスを提供することです。本質的に、彼らは「私はあなたに電話します、あなたがする必要があることは何でもします」 または 「私はこの値を変更するためにあなたに渡すつもりですが、あなたはそれを返すようにしてください」と言っています

それで、最終的に、私はフックタイプの選択によって提供された指導が区別の後ろの本当の値だと思います。とにかく、IMO。

お役に立てれば!


PHPで変数を返すことはオプションなので、すべてのフィルターを使用できたように思えます。WordPress開発者が2つの用語を選択した理由を知っている人はいますか?純粋にセマンティック上の理由ですか?技術的には、その必要性が見えません
...-TheStoryCoder

2
@TheStoryCoder 「純粋にセマンティック上の理由ですか?」5年前の私の答えはまさにそれが説明したようです...?
MikeSchinkel

11

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

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

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


5

簡単な言葉で。

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

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

更新:コードを変更せずに、アクションとフィルターを使用するプラグインを拡張できます。独自のテーマまたはプラグインにフィルターとアクションを追加する。


使い方?

アクション:

テーマfunctions.phpファイルの以下の簡単な例を確認してください。

  1. 例1:(単純なPHPの例)
機能テスト() {
     echo "出力";
}

テスト();

上記のプログラムは出力を印刷します:

出力

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


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

do_action( 'test');

上記のプログラムは出力を印刷します:

出力

[注:ここでdo_action('test')は、関数を呼び出すように動作します。そして、コールバック関数 'test1'を実行します。]


  1. 例3:(アクションの別の使用)
関数test2(){
     echo "テスト2";
}
add_action( 'test'、 'test2'、1);

関数test1(){
     echo "テスト1";
}
add_action( 'test'、 'test1'、2);

do_action( 'test');

上記のプログラムは出力を印刷します:

テスト2テスト1

[注:ここでdo_action('test')は、関数を呼び出すように動作します。そして、その優先度でコールバック関数を実行します。

コールバック関数「test1」には優先度2があり、「test2」には優先度1があります。

優先度が優先度1の「test1」および優先度2の「test2」のように変更される場合、出力は次のようになります。

テスト1テスト2

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

do_action( 'test');

上記のプログラムは出力を印刷します:

テスト1

次に、サンプルプラグインを作成して、サードパーティの開発者にとってどのように機能するかを確認します。

  1. ディレクトリに「simple」フォルダを作成します/wp-content/plugins/
  2. 「simple.php」という名前のファイルを作成し、以下のコードを追加します。
/ *
*プラグイン名:シンプルプラグイン
* /
関数test_callback_function(){
     echo "プラグインから";
}
add_action( 'test'、 'test_callback_function');

次に、WordPress管理ダッシュボードからSimpleプラグインを有効にします。

メニュープラグインに移動してアクティブにします。

上記のプログラムのプラグインをアクティブにした後、出力を印刷します。

テスト1プラグインから

[注:プラグインアクションの優先度を1〜9に追加すると、次のように出力が出力されます。

pluginTest 1から

WordPress 10 priority by defaultは追加されたすべてのアクションを考慮しているためです。]

フィルター

以下の例を確認してください。

単純なPHPの例:

$ data = array( 'one'、 'two');
print_r($ data);

上記のプログラムは出力を印刷します:

配列([0] => one [1] => two)
  1. 例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');
});

上記のプログラムは出力を印刷します:

配列([0] => three [1] => four)

ここで、フィルターmy_filter_nameを追加し、テーマ/プラグインファイルを変更せずに既存の出力array( 'one', 'two' )array( 'three', 'four' )変更しました。



@maheshwaghmareにこのような簡単なトリックをありがとう。「フィルター」についても書いてください
アディ

「間もなく」とはどういう意味ですか?
ラプティ

@Rapti遅れてすみません。今夜は、フィルターに関連する答えを追加します。将来的には、フックに関する説明記事を作成します(アクションとフィルター)。
maheshwaghmare

@maheshwaghmareは先延ばしになっていますか?:P

良いのexplaination、私はより良い理解の今持っている
budiantoip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.