WordPress php アクションフックとフィルタフックとは

WordPressの色々なタイミングでイベント一覧が用意されており、選んだイベント名のタイミングで関数を実行できるようにする機能です。 フックは引っかけるの意味なので、指定したタイミングでその関数を引っかけて(フックして)引っ張り込んで実行するような感じ。 実行されるのはプラグインの中でadd_action()かadd_filter()。フック名によって実行タイミングが異なります。

ここが分かりやすい

アクションフック add_action()

do_action(フック名)でadd_action(フック名、関数名)呼び出され、add_action()で関数を実行するが、値はdo_actionに返さない。

 add_action ( $hook, $function, [$priority], [$arg_num]);
  • $hook必須:アクションフック名。 実行される場面で名称は決まっている。 決まっている名称を使わなければ実行されない。
  • $function必須:自作function名。
  • $priority(省略可:初期値10):優先順位。
  • $arg_num(省略可:初期値1):自作functionに受け渡す変数の数。

私が何時も使うアクションフック名は、’wp_enqueue_scripts’です。 これでcssやjsを取り込んでいます。

add_action('wp_enqueue_scripts', '私のfunciton名');

accepted_argsは指定したhook_nameにより受け取れる変数の数が異なり、そのhookから変数全てを受取らなくてもいいです。 例えば、’transition_post_status’ アクションフックからはアクション関数引数: $new_status、$old_status、$post オブジェクを受取ることができます。 受け取る時は以下の様にadd_action()に’transition_post_status’を指定して引数の個数を指定して、your_functionの引数に同じ変数名 $new_status、$old_status、$postを記述すると受け取れます。

function your_function($new_status, $old_status, $post) {

}
add_action('transition_post_status', 'pmc_update_notification',10,3);

フィルタフック add_filter()

フィルタフックは呼び出したイベント元に値を返す時に使用。 データーベースの書き換えや、ブラウザ表示の文字の変更する時などに使用。 フィルタフック用に一覧があります。

add_filter('hook_name', 'your_filter', [priority], [accepted_args]);
  • hook_name必須:実行される場面で名称は決まっている。 決まっている名称を使わなければ実行されない。
  • your_function_name必須:自作function名。
  • priority(省略可:初期値10):優先順位。
  • accepted_args(省略可:初期値1):自作functionに受け渡す変数の数。

WordPressコアファイルで確認

デフォルトで有効になっているフック名を見つける一番信頼出来る方法は以下のWordPressコアファイル内だそうです。(ここの引用#デフォルトで適用されるフィルターとアクション) add_actionとadd_filterを検索し、使用しているフック名を探す。

  • index.php
  • wp-blog-header.php
  • wp-load.php
  • wp-config.php
  • wp-settings.php
  • function.php(コアファイルでないがこの中を調べるのも良いらしい)

こんな感じで使っています

function add_scripts_by_page(){
    global $in_value;    //phpの値をjavascriptに受け渡すためにglobalで関数内に取り込んでいます。
    if(is_single(array(4416,"how_to_use_mathjax-latex_and_list"))) {  //ページ指定しています。 公開前はid=4416、その他はスラッグで指定。
        wp_enqueue_script(
		$handle='ichiri_php_handle',
		$src=plugins_url() . '/my-plugin-1/ichiri_test_db.js',   //ichiri_test_db.jsを取り込んでいます。
		$deps=array('jquery'),
		$ver='0.0.0.1',
		$in_footer=true
                );
	wp_localize_script('ichiri_php_handle','js_var',$in_value);  //phpの値をjavascriptに受け渡しています。
    }
}
add_action('wp_enqueue_scripts', 'add_scripts_by_page');  //ここが肝心。 フック名は'wp_enqueue_scripts'。

コメント