WordPressにおいて、表示されているページが「投稿ページか?アーカイブページか?」などを簡単に判別できる条件分岐タグは、いったいどのタイミングから有効になるのだろうか?
ということが気になり、調べてみました。
つまり、
正常にページ種別を判定できるのはどのアクションフックからか?
というお話になります。
ちなみに なぜそんなこと知りたいのかというと、何度も条件分岐タグを使わなくていいようにページ判定結果を定数化しておきたかったからです。
ちなみにここでいう条件分岐タグとは、is_page()
とかis_single()
とかのやつです。
※ is_admin()
などは別の話なので、ご注意ください。
検証方法:各フックでページ判定ができるているか調べる
検証方法は簡単で、いくつかのアクションフックで条件分岐タグの結果をvar_dump()
で出力して確認するだけ。
以前、別記事で主要なアクションフック が実行される順番については調査済みだったので、それを踏まえてどのフックから正常に条件分岐タグが使えるのかを調べました。
今回検証したのは以下のアクションフック。(タイミングが早い順で並んでいます。)
- init
- wp_loaded
- parse_request
- send_headers
- parse_query
- pre_get_posts
- the_posts
- wp
これらのフックにて、以下のように条件分岐タグを出力させてみました。
var_dumpで条件分岐タグを出力
add_action( 'フック名', function() {
var_dump( 'ここは{フック名}です', is_page() );
});
吐き出しているのがis_page()
なので、固定ページへ移動して確認します。
結果:ページ判定ができた最速のタイミング
- init
- wp_loaded
- parse_request
- send_headers
(これより前では正常に判別できなかった)
(ここから正常に判別できた) - parse_query
- pre_get_posts
- the_posts
- wp
という結果になりました。
条件分岐タグはparse_queryアクションフック以降で正常にページを判別できる!
ということがわかりました。
ただし注意点が1つありまして、
parse_queryフックはクエリの呼び出しにあわせて複数回呼び出されるんですよね。(pre_get_postsも複数回呼び出されます。)
しかもこれらのフックは、カスタマイザーのプレビュー画面でのみものっすごい早いタイミング( initより前 )でも呼び出されたりしちゃいます。(この謎の超早いタイミングでの呼び出し時では条件分岐タグは無効。)
これらを踏まえると、wpアクションフックを使うのが無難かなと思います。
条件分岐タグは定数化しておくと便利!
さて、知りたいことはわかったので、今回やりたいこと(条件分岐の定数化)もやっておきます。
同じ条件分岐タグを複数回使うような場合は、あらかじめ定数化しておくことでページの表示速度をほんの少し高速化できます。
先述したようにparse_queryフックやpre_get_postsフックは複数回呼び出されてしまうので、wpフックにて定数化を行います。
例:こんな感じ
add_action( 'wp', function() {
/* ページ判定用の条件分岐タグを定数化 */
define( "IS_HOME", is_home() );
define( "IS_FRONT", is_front_page() );
define( "IS_SINGLE", is_single() );
define( "IS_PAGE", is_page() );
define( "IS_ARCHIVE", is_archive() );
define( "IS_PT_ARCHIVE", is_post_type_archive() );
define( "IS_DATE", is_date() );
define( "IS_AUTHOR", is_author() );
}, 1);
もちろん定数化のタイミングはwpフックじゃなくてもいいんですが、
・1回だけ呼び出される
・管理画面では実行されない
という点を満たす最速のフックがwpフックなんですよね(多分)。
なので、個人的にはいつも条件分岐タグはwpアクションフックで定数化しています。