WordPress
アクションとフィルタ
サーチ…
構文
- add_action(タグ、function_to_call、priority、num_of_args);
- add_filter(tag、function_to_call、priority、num_of_args);
パラメーター
パラメータ | 説明 |
---|---|
$タグ | (string)(必須)$関数がフックされるアクションの名前。 |
$関数 | (呼び出し可能)(必須)関数名または匿名関数を含む文字列が必要です。クラス内での関数の追加の例を参照してください。 |
$ priority | (int)default = 10.フック/フィルタに付加された関数は、割り当てられた優先度で実行されます。あなたは、他のアクションの前にコードを扱い、優先度= 1を設定したり、他のすべての関数を優先度= 100にしたりしたい場合があります。すべてのPHP関数と同様に、変数に値を渡さずに関数を使用できますデフォルト値が設定されていますが、返されるパラメータの数を変更する場合は、! |
$パラメータ | (int)default = 1.接続された関数に返されるパラメータの数。返されるパラメータは、フックが作成された場所の番号によって異なります。詳細については、 apply_filters() およびdo_action() を参照してください。 |
備考
ワードプレスフック
WordPressで作業を開始するときに開発者を混乱させるものは、 apply_filters()
とadd_action()
です。コードでこれらのプラグイン/テーマを利用していることがよくありますが、そのコンセプトを理解していないと、それらを扱うのが難しくなります。
簡単に(非常に簡単に、プロセスの詳細なWordPressロードフローチャートを参照)、WordPressは次のようにロードされます。
- wp-load.php - 関数など
- mu-plugins - mu-pluginsフォルダにあるファイル - キャッシュされたオブジェクトを扱うためによく使用される
- プラグイン - 特定の順序はなく、インストールされ、アクティブ化されたプラグインがロードされます
- アクティブな子テーマ/親テーマ
- init - 残りのデータ
- テンプレート
開発者で機能ファイルを操作している場合、両方のファイルが処理中のファイルより前に読み込まれていることがわかります。つまり、後で実行される、またはまだ定義されていないプロセス(関数を上書きすることはできません)または変数を変更することはできません。また、テーマ開発者は、コードにフックを配置して、プラグインがフックするか、プラグインが他のプラグインが変数を上書きできるようにすることができます。今これはこれまでのところ混乱するかもしれませんが、そこにぶら下がっています。
add_filter()
とadd_action()
を理解するために、最初にフックがどのように作成されるかを調べる必要があります。
$arga= 'hello';
do_action('im_a_hook', $arga );
上記のWordPressに遭遇すると、フックim_a_hook
接続されている関数が呼び出されます(プロセスの情報については$wp_filter
を参照してください)。あなたの接続された関数で$arga
は、接続された関数が利用できるようになります。
add_action('im_a_hook', 'attached_function');
function attached_function($arga){
echo $arga;
}
これにより、ロードプロセスの特定の時点で変数を変更する強力な新しい機会が開かれます。以前テンプレートはプラグイン/テーマの後に読み込まれていたことを覚えていますか? 1つの一般的なプラグインは、プロセスの後半に画面を作成するWooCommerceですが、 do_action
例がプラグインでどのように見つかるかを文書化するつもりはありません。
do_action( 'woocommerce_after_add_to_cart_button' );
ここでは、変数を返さないフックを作成しましたが、それでも面白いことがあります:
add_action( 'woocommerce_after_add_to_cart_button', 'special_offer');
function special_offer(){
echo '<h1>Special Offer!</h1>;
}
上記のadd_action
は、WooCommerce画面を作成するときのdo_action('woocommerce_after_add_to_cart_button')
が配置されている特別提供の見出しをecho
します。そこで、このフックを使ってhtmlを挿入することができます。他の用途には、別の画面にリダイレクトするなどがあります。
また、複数の変数を関数に渡すこともできます。あなたのテーマの機能でこれを試してください。利用可能な3つのパラメータを使用したいので、3に設定する最後のパラメータに注意してください。これを2に変更すると、2つしか返されず、未定義のエラーが発生します。
add_action('custom_hook', 'attached_function', 10, 3);
function attached_function($a,$b,$c){
var_dump($a);
var_dump($b);
var_dump($c);
}
$arga = 1;
$argb = 2;
$argc = 3;
do_action('custom_hook', $arga, $argb, $argc);
exit;
フィルターと呼ばれる別のWPフックタイプがあります。フィルタはその使用法のアクションとは異なり、アクションは変数のみを受け取ることができます。明らかにこれらの変数はfunctionスコープ内にあります(google以外のPHPスコープは知っておく必要があります)。フィルタは返されたデータを返すので、変数の変更に使用できます。
$filter_me= apply_filters('im_a_filter', $variable_to_filter);
上記を見ると、返されるデータは変数に格納されている値になるので、 $filter_me
の値を変更することができます。たとえば、この例では、 $variable_to_filter
を$filter_me
に変更してい$variable_to_filter
。
add_filter('im_a_filter', 'attached_function', 100);
function attached_function($filter_me){
$filter_me= 'ray';
return $filter_me;
}
$filter_me = 'bob';
$filter_me= apply_filters('im_a_filter', $filter_me);
$filter_me
変数に'bob 'ではなく'ray'が含まれるようになりました.100の優先度を設定していますので、使用後に値を変更する人はいません(同じフックで複数のフィルタを実行できます)。 apply_filters()
が存在する場合、 apply_filters()
プロセスで使用される変数を変更できるようになりました。
複数のパラメータを渡すこともできますが、その値を変更することはできます。また、値を返す必要があります。そうでなければ、変数には何も含まれません。変数に値/配列/オブジェクトを代入するためにPHPを使う方法を理解しているなら、これはあなたには明らかです。
add_filter('im_a_filter', 'attached_function', 100, 3);
function attached_function($filter_me, $arga, $argb){
$filter_me= 'ray'.$arga.$argb;
$arga= 'you fool';
return $filter_me;
}
$filter_me = 'bob';
$arga = ' middlename';
$argb = ' surname';
$filter_me= apply_filters('im_a_filter', $filter_me, $arga, $argb);
$filter_me
変数に'ray middlename surname'が含まれるようになりました 。しかし、 $arga
どうですか?これにはまだ'middlename'が含まれています。関数内で$arga
を'あなたがだます 'に変更すると、範囲外の定義された値には何の効果もありません(方法、Googleグローバルなどがあります)
add_action($ hook_name、$ function、$ priority、$ parameters)
add_filter($フック名、$関数、$プライオリティ、$パラメータ);
add_action - init
add_action('init', 'process_post');
function process_post(){
if($_POST)
var_dump($_POST);
}
add_action - init - 無名関数
add_action('init' , function(){
echo 'i did something';
});
add_action - init - クラスオブジェクト内
class sample{
public function __construct(){
add_action('init', array($this, 'samp') );
}
public function samp(){ // must be public!!
echo 'i did something';
}
}
new sample();
add_action - 静的クラス内のinit
class sample{
public static function add_action_func(){
//note __CLASS__ will also include any namespacing
add_action('init', array(__CLASS__, 'samp') );
}
public static function samp(){
echo 'i did something';
}
}
sample::add_action_func();