WordPressのカスタマイズにおいて欠かせないのが、アクションフックとフィルターフック。
今回はこの「アクションフック」の方について知識をつけていこう!
ということで、WordPressの主要なアクションフックの実行順序について検証してきたので、メモしておきます。
どのアクションが早くてどのアクションが遅いのかを、フロント側で実行される20種のアクションフックについて調べてみました。(全部のアクションフックを検証するのはきつすぎた...。笑)
全アクションフックの順序も、ほぼ上記のCodexで紹介されている順番の通りだと思います。
検証結果:主要なアクションフックの実行順序一覧
先に結果を。
今回の検証で確認できた実行順序は次の通りでした。
- after_setup_theme
- set_current_user
- registered_post_type(複数回実行)
- registered_taxonomy(複数回実行)
- init
- customize_register(カスタマイザープレビュー時のみ)
- wp_loaded
- parse_request
- send_headers
- parse_query(クエリの呼び出しによって複数回実行される。フロント側で最速のタイミングはこの辺だった。)
- pre_get_posts(クエリの呼び出しによって複数回実行される。フロント側で最速のタイミングはこの辺だった。)
- the_posts
- wp
- admin_bar_init
- template_redirect
- wp_enqueue_scripts
- wp_print_scripts
- wp_head
- wp_footer
- shutdown
名前的にはinit
がめっちゃ早いもんだと思い込んでいましたが、実際調べてみるとafter_setup_theme
の方が早かったりして意外でした。
あと、wp
よりwp_loaded
の方が早いのもまさかでしたね。
※ カスタマイザーのプレビュー画面ではparse_query
やpre_get_posts
の挙動が異なるようです。
(init
より前に1回呼び出され、customize_register
とwp_loaded
の間にも数回呼び出されることを確認しています。)
カスタマイザーの即時反映データが受け取れるタイミングについて
カスタマイザーで変更したデータがプレビュー画面へ即時反映されるタイミングも調べてみたところ、上記のフックの中ではwp_loaded
からでした。
init
ではまだデータが反映されておらず、プレビュー画面への反映はできないのでこの辺も注意しましょう。
条件分岐タグがセットされるタイミングについて
条件分岐タグ(is_home()
とかis_page()
とか)がセットされて正常にページ種別を判定できるタイミングについても調べてみると、今回調べたフックの中ではフロント側ではparse_query
からだということがわかりました。
ただ、parse_query
は複数回実行されてしまう上にカスタマイザーのプレビュー画面では挙動が異なるので、条件分岐タグを定数化しておく場合などはwp
アクションあたりでやっておくのが無難かなと思います。
AJAX時に呼び出されるフックはどこまでか
wp_ajax_
を使ってファイルを読み込む時は、どのアクションが実行されるのかも調べてみると、wp_loaded
までならギリギリ呼び出されていることがわかりました。
なので、AJAXで読み込むファイルでも使用したい定数やglobal変数を定義する時は、wp_loaded
アクションまでに済ませておきましょう。
このアクションフックでなら、カスタマイザーでの即時反映データも受け取れますね。
アクションフックを調べる検証コード
実行順を調べたい各アクションフックにて文字列を追加していき、最後のアクションフックでそれらの文字列を出力させるクラスを用意しました。
'shutdown'
というアクションフックが一番最後に実行されるということはすでに知っていたので、そのタイミングで文字列を出力させています。
実行順検証用コード
class Echo_Fook_Order {
public $result = '';
public function __construct() {
$this->do_test();
}
private function do_test() {
add_action( 'after_setup_theme', function() {
$this->$result .= '<br><hr> after_setup_theme <hr><br>';
});
add_action( 'init', function() {
$this->$result .= '<br><hr> init <hr><br>';
});
add_action( 'parse_request', function() {
$this->$result .= '<br><hr> parse_request <hr><br>';
});
add_action( 'parse_query', function() {
$this->$result .= '<br><hr> parse_query <hr><br>';
});
add_action( 'send_headers', function() {
$this->$result .= '<br><hr> send_headers <hr><br>';;
});
add_action( 'pre_get_posts', function() {
$this->$result .= '<br><hr> pre_get_posts <hr><br>';
});
add_action( 'the_posts', function() {
$this->$result .= '<br><hr> the_posts <hr><br>';
});
add_action( 'admin_bar_init', function() {
$this->$result .= '<br><hr> admin_bar_init <hr><br>';
});
add_action( 'wp_loaded', function() {
$this->$result .= '<br><hr> wp_loaded <hr><br>';
});
add_action( 'wp', function() {
$this->$result .= '<br><hr> wp <hr><br>';
});
add_action( 'wp_enqueue_scripts', function() {
$this->$result .= '<br><hr> wp_enqueue_scripts <hr><br>';
});
add_action( 'wp_print_scripts', function() {
$this->$result .= '<br><hr> wp_print_scripts <hr><br>';
});
add_action( 'template_redirect', function() {
$this->$result .= '<br><hr> template_redirect <hr><br>';
});
add_action( 'wp_head', function() {
$this->$result .= '<br><hr> wp_head <hr><br>';
});
add_action( 'wp_footer', function() {
$this->$result .= '<br><hr> wp_footer <hr><br>';
});
add_action( 'registered_post_type', function() {
$this->$result .= 'registered_post_type<br>'; //登録された投稿タイプの数だけ実行される
});
add_action( 'registered_taxonomy', function() {
$this->$result .= 'registered_taxonomy<br>'; //登録されたタクソノミーの数だけ実行される
});
add_action( 'set_current_user', function() {
$this->$result .= '<br><hr> set_current_user <hr><br>';
});
add_action( 'shutdown', function() {
$this->$result .= '<br><hr> shutdown <hr><br>';
echo $this->$result; //最後に出力させる
});
}
}
new Echo_Fook_Order;
上記のようにして20種類のアクションフックを実行させてみました。
出力結果が見やすいようにbr
タグとhr
タグを付与させてフック名を出力しています。
実際の検証結果のスクリーンショット画像
検証用コードで実際に出力された内容をスクショしたものを載せておきます。
ぜひ自分でもコードを実行して確かめてみてください!
コメント
コメント一覧 (1件)
素晴らしい。参考になります。多分ほとんどの人がフワッとさせてる部分を、明確に解析した情報ですね。