WordPressの主要なアクションフックが実行される順番を検証してみた

WordPressのカスタマイズにおいて欠かせないのが、アクションフックフィルターフック

今回はこの「アクションフック」の方について知識をつけていこう!
ということで、WordPressの主要なアクションフックの実行順序について検証してきたので、メモしておきます。

どのアクションが早くてどのアクションが遅いのかを、フロント側で実行される20種のアクションフックについて調べてみました。(全部のアクションフックを検証するのはきつすぎた...。笑)

全アクションフックはここで確認できます:Codex日本語版:プラグイン API/アクションフック一覧

了のアイコン画像

全アクションフックの順序も、ほぼ上記のCodexで紹介されている順番の通りだと思います。

目次

検証結果:主要なアクションフックの実行順序一覧

先に結果を。
今回の検証で確認できた実行順序は次の通りでした。

  1. after_setup_theme
  2. set_current_user
  3. registered_post_type(複数回実行)
  4. registered_taxonomy(複数回実行)
  5. init
  6. customize_register(カスタマイザープレビュー時のみ)
  7. wp_loaded
  8. parse_request
  9. send_headers
  10. parse_query(クエリの呼び出しによって複数回実行される。フロント側で最速のタイミングはこの辺だった。)
  11. pre_get_posts(クエリの呼び出しによって複数回実行される。フロント側で最速のタイミングはこの辺だった。)
  12. the_posts
  13. wp
  14. admin_bar_init
  15. template_redirect
  16. wp_enqueue_scripts
  17. wp_print_scripts
  18. wp_head
  19. wp_footer
  20. shutdown

名前的にはinitがめっちゃ早いもんだと思い込んでいましたが、実際調べてみるとafter_setup_themeの方が早かったりして意外でした。

あと、wpよりwp_loadedの方が早いのもまさかでしたね。

※ カスタマイザーのプレビュー画面ではparse_querypre_get_postsの挙動が異なるようです。
initより前に1回呼び出され、customize_registerwp_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タグを付与させてフック名を出力しています。

実際の検証結果のスクリーンショット画像

検証用コードで実際に出力された内容をスクショしたものを載せておきます。

実行結果
実行結果

ぜひ自分でもコードを実行して確かめてみてください!

この記事が気に入ったら
フォローしてね!

コメント

コメントする

目次
閉じる