フックとは
フック=機能(関数)を追加すること。
フック = hook = 鍵爪
hook into = 引っ張り込む
特定のタイミングでWordPress本体のソフトに別の機能(関数)を引っ張り込む仕組み。
特定のタイミングとは、(フィルター・アクション)
①あらかじめWordPress本体で定義されている場合。
②自分でタイミングを定義した場合。
フックを作成するための関数。
フックのメリット
WordPressのコアファイルに変更を加えると更新のたびに再度変更しなくてはならない。
更新されても変更されないファイルにフックを使うことで更新に影響されない関数を設定できる。
フックの種類と働き フィルターフック アクションフック
WordPressコアがフィルターフック及びアクションフックを用意してある。
ただし、自分のオリジナルのフックを作成することは可。
フィルターフック・アクションフック概要一覧
内容 | フィルターフック | アクションフック |
---|---|---|
働き | 文字列を変更(追加・修正)する場合に使う。 | 特定のタイミングで関数を追加する。 |
フックするタイミング | データベースに追加する前。 ブラウザのスクリーンに送り出す前。 |
実行中の特定のポイント。 特定のイベント発生時。 |
フックを実行又は新規作成する関数 | apply_filters() | do_action() |
apply_filters do_filter() の引数の使い方 |
第2引数は必須 この引数の文字列を変更する。 |
第2引数はオプション |
apply_filters do_filter() の値 |
値を返す。第2引数 | 値を返さない。 |
登録済みのフックに追加したい内容を記述した関数を登録するための関数 | add_filter() | add_action() |
フックで使用される基本的な関数
項目 | do_action()とapply_filters() | add_action()とadd_filter() |
---|---|---|
定義 | WordPressコアで定義してある。 フックを自作することも可能。 |
functions.php |
テーマのカスタマイズ | もともとWordPressコアで定義してあるので、 テーマカスタマイズには使用しない。 自作のフックを新規作成する時は使用する。 |
テーマをカスタマイズの際に使用する関数。 |
働き | フックそのものを実行又は新規作成するための関数。 | アクションフックとフィルターフックに追加したい機能を記述した関数を登録するための関数。 |
フィルターフック apply_filters()とadd_filter()
apply_filters()フィルターフックを作成する関数
参照:WordPress Codex-apply_filters()
基本的にWordPress本体で定義されている。
例)wp-inculudes/formatting.php
自作で定義することもできる。
構文
apply_filters(
①$tagフィルターフック名,
②$valueフックに渡す変数,
③$var追加する場合の変数[オプション]
)
apply_filters()の詳細
動 作
引数$tag(フィルターフック名)に指定したフィルターフックに付随する全ての関数を実行する。
引数$tag(フィルターフック名)に新しい名称のフィルターフックを指定した場合。
→新規のフィルターフックを作成できる。
返り値
(mixed)
第2引数$valueに全てのフィルター関数を適用した値。
$valueの型と同じでなければならない。
全ての関数を適用した第2引数$valueの値。
引 数
①$tag
(文字列・必須) 登録するフィルターフック名
②$value
(mixed・必須) $tagに登録されたフィルター関数において変更できる値。
③$var
(mixed・オプション)フィルター関数へ渡すことのできる追加の変数。
関数内で使用はできるがこの変数にかかる値が返されることはない。
plugin.phpにおける$wp_filter等の設定
参照:wp-includes/class-wp-hook.php
<?php //plugin.php // Initialize the filter globals. require( dirname( __FILE__ ) . '/class-wp-hook.php' ); /** @var WP_Hook[] $wp_filter */ global $wp_filter, $wp_actions, $wp_current_filter; //初期の状態では$wp_filterは空の状態。 //なので、wp_filter = arrya();で配列が作成される。 if ( $wp_filter ) { $wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter ); } else { $wp_filter = array(); } if ( ! isset( $wp_actions ) ) { $wp_actions = array(); } if ( ! isset( $wp_current_filter ) ) { $wp_current_filter = array(); }
初期の状態では$wp_filterは空の状態。
なので、wp_filter = arrya();で配列が作成される。
apply_filter() plugin.phpとclass-wp-hook.php
参照:wp-includes/class-wp-hook.php
<?php //plugin.phpのapply_filter() /** * Call the functions added to a filter hook. * * The callback functions attached to filter hook $tag are invoked by calling * this function. This function can be used to create a new filter hook by * simply calling this function with the name of the new hook specified using * the $tag parameter. * * The function allows for additional arguments to be added and passed to hooks. * * // Our filter callback function * function example_callback( $string, $arg1, $arg2 ) { * // (maybe) modify $string * return $string; * } * add_filter( 'example_filter', 'example_callback', 10, 3 ); * * /* * * Apply the filters by calling the 'example_callback' function we * * "hooked" to 'example_filter' using the add_filter() function above. * * - 'example_filter' is the filter hook $tag * * - 'filter me' is the value being filtered * * - $arg1 and $arg2 are the additional arguments passed to the callback. * $value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 ); * * @since 0.71 * * @global array $wp_filter Stores all of the filters. * @global array $wp_current_filter Stores the list of current filters with the current one last. * * @param string $tag The name of the filter hook. * @param mixed $value The value on which the filters hooked to `$tag` are applied on. * @param mixed $var,... Additional variables passed to the functions hooked to `$tag`. * @return mixed The filtered value after all hooked functions are applied to it. */ function apply_filters( $tag, $value ) { global $wp_filter, $wp_current_filter; $args = array(); // Do 'all' actions first. if ( isset( $wp_filter['all'] ) ) { $wp_current_filter[] = $tag; $args = func_get_args(); _wp_call_all_hook( $args ); } if ( ! isset( $wp_filter[ $tag ] ) ) { if ( isset( $wp_filter['all'] ) ) { array_pop( $wp_current_filter ); } return $value; //第2引数の$valueを返している。 } if ( ! isset( $wp_filter['all'] ) ) { $wp_current_filter[] = $tag; } if ( empty( $args ) ) { $args = func_get_args(); } // don't pass the tag name to WP_Hook array_shift( $args ); $filtered = $wp_filter[ $tag ]->apply_filters( $value, $args ); array_pop( $wp_current_filter ); return $filtered; } //class-wp-hook.phpのapply_filters() /** * Calls the callback functions added to a filter hook. * * @since 4.7.0 * * @param mixed $value The value to filter. * @param array $args Arguments to pass to callbacks. * @return mixed The filtered value after all hooked functions are applied to it. */ public function apply_filters( $value, $args ) { if ( ! $this->callbacks ) { return $value; } $nesting_level = $this->nesting_level++; $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); $num_args = count( $args ); do { $this->current_priority[ $nesting_level ] = $priority = current( $this->iterations[ $nesting_level ] ); foreach ( $this->callbacks[ $priority ] as $the_ ) { if ( ! $this->doing_action ) { $args[0] = $value; } // Avoid the array_slice if possible. if ( $the_['accepted_args'] == 0 ) { $value = call_user_func_array( $the_['function'], array() ); } elseif ( $the_['accepted_args'] >= $num_args ) { $value = call_user_func_array( $the_['function'], $args ); } else { $value = call_user_func_array( $the_['function'], array_slice( $args, 0, (int) $the_['accepted_args'] ) ); } } } while ( false !== next( $this->iterations[ $nesting_level ] ) ); unset( $this->iterations[ $nesting_level ] ); unset( $this->current_priority[ $nesting_level ] ); $this->nesting_level--; return $value; } ?>
add_filter()フィルターフックに関数を登録するための関数
参照:WordPress Codex-add_filter()
構文
add_filter(
①$tag フィルターフック名,
②$function_to_add 処理する関数,
③$priotity 優先度[オプション],
④$accept_args 関数に渡す変数の数[オプション]
)
add_filter()の詳細
動 作
指定したフィルターフックに関数を登録する。
返り値
フィルターフックに登録できるとtrue、できなければfalse。
引 数
①$tag
(文字列)(必須)$function_to_addがフックされるフィルター名。
WordPressによって定義されているフィルターフックの名称。
フィルターが適用されるタイミングを定義。
参照:WordPress Codex-フィルターフック一覧
②$function_to_add
(コールバック)(必須)フックする関数の名前。
フィルターフックに使用する関数。
③$priotity
(整数)[オプション]
この関数がフィルターフックに登録された関数の中で実行される順位。
数が小さいほど早く実行される。
[デフォルト:10]
④$accepted_args
(整数)[オプション]関数に渡す引数の数
[デフォルト:1]
add_filter() plugin.phpとclass-wp-hook.php
参照:wp-includes/class-wp-hook.php
<?php //plugin.php内のadd_filter() //$wp_filter[$tag]がセットされているか確かめる。 //初回はセットされていない。 //new WP_Hook()で各フィルターフックのインスタンスを作成。 //WP_Hookクラスに用意されているadd_filter()を呼び出す。 function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) { global $wp_filter; if ( ! isset( $wp_filter[ $tag ] ) ) { $wp_filter[ $tag ] = new WP_Hook(); } $wp_filter[ $tag ]->add_filter( $tag, $function_to_add, $priority, $accepted_args ); return true; } //class-wp-hook.php内のadd_filter /** * Hooks a function or method to a specific filter action. * * @since 4.7.0 * * @param string $tag The name of the filter to hook the $function_to_add callback to. * @param callable $function_to_add The callback to be run when the filter is applied. * @param int $priority The order in which the functions associated with a * particular action are executed. Lower numbers correspond with * earlier execution, and functions with the same priority are executed * in the order in which they were added to the action. * @param int $accepted_args The number of arguments the function accepts. */ public function add_filter( $tag, $function_to_add, $priority, $accepted_args ) { $idx = _wp_filter_build_unique_id( $tag, $function_to_add, $priority ); $priority_existed = isset( $this->callbacks[ $priority ] ); $this->callbacks[ $priority ][ $idx ] = array( 'function' => $function_to_add, 'accepted_args' => $accepted_args, ); // if we're adding a new priority to the list, put them back in sorted order if ( ! $priority_existed && count( $this->callbacks ) > 1 ) { ksort( $this->callbacks, SORT_NUMERIC ); } if ( $this->nesting_level > 0 ) { $this->resort_active_iterations( $priority, $priority_existed ); } }
$wp_filter[$tag]がセットされているか確かめる。
初回はセットされていない。
new WP_Hook()で各フィルターフックのインスタンスを作成。
WP_Hookクラスに用意されているadd_filter()を呼び出す。
アクションフック do_action()とadd_action()
do_action()アクションフックを作成する関数。
※基本的にWordPressのコアファイルで定義されている。
自作で定義することもできる。
構文
do_action(①$tag アクションフック名, ②$arg 追加の変数[オプション])
do_action()の詳細
動 作
引数$tag(アクションフック名)に指定したアクションフックに付随する全ての関数を実行する。
引数$tag(アクションフック名)に新しい名称のアクションフックを指定した場合。
→新規のアクションフックを作成できる。
返り値
値を返さない。
引 数
①$tag
(文字列)実行したいアクションフックの名前。
②$arg
(mixed)[オプション]フックに付随する関数へ送る引数のリスト
デフォルト:空の文字列
plugin.phpにおけるdo_action()のコード
<?php //plugin.phpのdo_action() /** * Execute functions hooked on a specific action hook. * * This function invokes all functions attached to action hook `$tag`. It is * possible to create new action hooks by simply calling this function, * specifying the name of the new hook using the `$tag` parameter. * * You can pass extra arguments to the hooks, much like you can with `apply_filters()`. * * Example usage: * * // The action callback function. * function example_callback( $arg1, $arg2 ) { * // (maybe) do something with the args. * } * add_action( 'example_action', 'example_callback', 10, 2 ); * * /* * * Trigger the actions by calling the 'example_callback()' function * * that's hooked onto `example_action` above. * * * * - 'example_action' is the action hook. * * - $arg1 and $arg2 are the additional arguments passed to the callback. * $value = do_action( 'example_action', $arg1, $arg2 ); * * @since 1.2.0 * @since 5.3.0 Formalized the existing and already documented `...$arg` parameter * by adding it to the function signature. * * @global array $wp_filter Stores all of the filters and actions. * @global array $wp_actions Increments the amount of times action was triggered. * @global array $wp_current_filter Stores the list of current filters with the current one last. * * @param string $tag The name of the action to be executed. * @param mixed ...$arg Optional. Additional arguments which are passed on to the * functions hooked to the action. Default empty. */ function do_action( $tag, ...$arg ) { global $wp_filter, $wp_actions, $wp_current_filter; if ( ! isset( $wp_actions[ $tag ] ) ) { $wp_actions[ $tag ] = 1; } else { ++$wp_actions[ $tag ]; } // Do 'all' actions first. if ( isset( $wp_filter['all'] ) ) { $wp_current_filter[] = $tag; $all_args = func_get_args(); _wp_call_all_hook( $all_args ); } if ( ! isset( $wp_filter[ $tag ] ) ) { if ( isset( $wp_filter['all'] ) ) { array_pop( $wp_current_filter ); } return; } if ( ! isset( $wp_filter['all'] ) ) { $wp_current_filter[] = $tag; } if ( empty( $arg ) ) { $arg[] = ''; } elseif ( is_array( $arg[0] ) && 1 === count( $arg[0] ) && isset( $arg[0][0] ) && is_object( $arg[0][0] ) ) { // Backward compatibility for PHP4-style passing of `array( &$this )` as action `$arg`. $arg[0] = $arg[0][0]; } $wp_filter[ $tag ]->do_action( $arg ); array_pop( $wp_current_filter ); } ?>
class-wp-hook.phpにおけるdo_action()メソッド
参照:wp-includes/class-wp-hook.php
<?php //class-wp-hook.phpのdo_action()メソッド /** * Calls the callback functions that have been added to an action hook. * * @since 4.7.0 * * @param array $args Parameters to pass to the callback functions. */ public function do_action( $args ) { $this->doing_action = true; $this->apply_filters( '', $args ); // If there are recursive calls to the current action, we haven't finished it until we get to the last one. if ( ! $this->nesting_level ) { $this->doing_action = false; } } ?>
add_action() アクションフックに関数を登録するための関数。
※基本的にfunctions.phpで定義する。
構文
add_action(
①$hook アクションフック名,
②$function_to_add 処理する関数,
③$priority 優先度[オプション],
④$accepted_args 関数に渡す変数の数[オプション]
);
参照:WordPress Codex-add_action()
add_action()の詳細
動 作
特定のアクションに関数をフックする。
do_action()で定義したアクションフックに、追加したい機能を記述した関数を追加する。
返り値
常にtrue
引 数
①$hook
(文字列)(必須)アクション名
$function_to_addがフックされるアクションの名称。
WordPressによって提供されているアクション又は自作のアクションの名称。
イベントと関数の関連性を示す。
参照:WordPress Codex-アクションフック一覧
②$function_to_add
(コールバック)(必須)フックする関数の名前。
イベントに続いて実行させたい関数名。
()は不要。
③$priotity
(整数)(オプション)関数が実行される優先順位
デフォルト:10
④$accept_args
(整数)(オプション)フックした関数が受け入れられる引数の数。
デフォルト:1
アクションフック一覧
アクションフック名 | 概要 |
wp_enqueue_scripts | scriptとstyleをエンキューできる。 フックされた関数内で、 wp_enqueue_script() wp_enqueue_style() wp_register_script() wp_register_style()が使用できる。 |
アクションフックで使われる関数
plugin.phpにおけるadd_action()のコード
<?php //plugin.phpのadd_action() /** * Hooks a function on to a specific action. * * Actions are the hooks that the WordPress core launches at specific points * during execution, or when specific events occur. Plugins can specify that * one or more of its PHP functions are executed at these points, using the * Action API. * * @since 1.2.0 * * @param string $tag The name of the action to which the $function_to_add is hooked. * @param callable $function_to_add The name of the function you wish to be called. * @param int $priority Optional. Used to specify the order in which the functions * associated with a particular action are executed. Default 10. * Lower numbers correspond with earlier execution, * and functions with the same priority are executed * in the order in which they were added to the action. * @param int $accepted_args Optional. The number of arguments the function accepts. Default 1. * @return true Will always return true. */ function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) { return add_filter( $tag, $function_to_add, $priority, $accepted_args ); } ?>
add_filter() plugin.phpとclass-wp-hook.php
参照:wp-includes/class-wp-hook.php
<?php //plugin.php内のadd_filter() //$wp_filter[$tag]がセットされているか確かめる。 //初回はセットされていない。 //new WP_Hook()で各フィルターフックのインスタンスを作成。 //WP_Hookクラスに用意されているadd_filter()を呼び出す。 function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) { global $wp_filter; if ( ! isset( $wp_filter[ $tag ] ) ) { $wp_filter[ $tag ] = new WP_Hook(); } $wp_filter[ $tag ]->add_filter( $tag, $function_to_add, $priority, $accepted_args ); return true; } //class-wp-hook.php内のadd_filter /** * Hooks a function or method to a specific filter action. * * @since 4.7.0 * * @param string $tag The name of the filter to hook the $function_to_add callback to. * @param callable $function_to_add The callback to be run when the filter is applied. * @param int $priority The order in which the functions associated with a * particular action are executed. Lower numbers correspond with * earlier execution, and functions with the same priority are executed * in the order in which they were added to the action. * @param int $accepted_args The number of arguments the function accepts. */ public function add_filter( $tag, $function_to_add, $priority, $accepted_args ) { $idx = _wp_filter_build_unique_id( $tag, $function_to_add, $priority ); $priority_existed = isset( $this->callbacks[ $priority ] ); $this->callbacks[ $priority ][ $idx ] = array( 'function' => $function_to_add, 'accepted_args' => $accepted_args, ); // if we're adding a new priority to the list, put them back in sorted order if ( ! $priority_existed && count( $this->callbacks ) > 1 ) { ksort( $this->callbacks, SORT_NUMERIC ); } if ( $this->nesting_level > 0 ) { $this->resort_active_iterations( $priority, $priority_existed ); } }
$wp_filter[$tag]がセットされているか確かめる。
初回はセットされていない。
new WP_Hook()で各フィルターフックのインスタンスを作成。
WP_Hookクラスに用意されているadd_filter()を呼び出す。