ワードプレスで「is_single()」と「is_singular()」がadd action関数でフックしても正しい値を返さない場合があります。この理由を解説いたします。

「is_single()」と「is_singular()」がadd action関数で効かない!?

is_single() は現在表示中のページが投稿の単体ページかを取得する関数です。
is_singular()は現在表示中のページが投稿ページか固定ページの単体ページかを返す関数です。

ただ、この二つの関数は下記のようにadd action関数で使用しても正しい判定を返してくれません。

function my_function_init(){
    if(is_single()) {
        echo $post->ID;
    }
}
add_action('init', 'my_function_init');

「is_single()」と「is_singular()」はinitにアクションを設定しても取得できない

「is_single()」と「is_singular()」が正しい値を返さない理由は’init’アクションが、ワードプレスが現在表示中のページを確定する前のフックだからです。

この為「is_single()」と「is_singular()」は現在表示中のページが確定した後に実行されるwpやget_headerアクションで使用すると正しい値を返してくれます。

↓「is_single()」と「is_singular()」が正しく動作するコード

function my_function_init(){
    if(is_single()) {
        echo $post->ID;
    }
}
add_action('get_header', 'my_function_init');

ワードプレスのアクションの順序によって実行できる関数とできない関数がある

ワードプレスのアクションは下記のような順序で実行されます

plugins_loaded アクティブなプラグインがロードされた後となります。

setup_theme アクティブなプラグインがロードされた後でかつ有効なテーマがロードされる前です。

after_setup_theme テーマが利用できる最初のアクションフックで、テーマの functions.php ファイルが読み込まれた直後に利用できます。

init 一般的にプラグインが初期化するために使用します。このとき、ユーザーは認証されていてログインユーザー関連の関数が実行できます。  ← ユーザーのログイン情報等の処理 get_current_user_id()等が実行できる最短のフック

wp_loaded WordPressとプラグインテーマすべての関数が利用できる状態です。(プラグインやテーマがinitで初期化する独自関数も含めまして)

parse_request HTTPヘッダーが送信される直前となります。この後にリダイレクト等の処理を行うとエラーになります。

send_headers HTTPヘッダのカスタマイズできます。

pre_get_posts 投稿の取得クエリ実行前にクエリ変数オブジェクトを取得編集できます。

wp 表示中ページの投稿情報が取得された後実行されます。 ← 「is_single()」と「is_singular()」が実行できる最短のフック

template_redirect どのテンプレートを読み込むか決定する前に実行されます。 

get_header ヘッダの情報が取得されます。



このように順次ワードプレスで情報等が確定していきますので、早すぎるadd_actionフックを使用すると関数が正しく動作しない場合があるのです。

ご参考になりましたら幸いです。

WordPress ワードプレスのテーマやプラグインのカスタマイズ・バグ修正、コーディングのご依頼ご相談はワードプレスドクターまでお気軽にお送りください