【WordPress】投稿画面が固定ページかどうか判定する方法|正しいフックの使い方

【WordPress】投稿画面が固定ページかどうか判定する方法 WordPress

投稿タイプによって管理画面での処理を変えたい場合、現在の編集画面が固定ページ通常の投稿かを判定する必要があります。この記事では、判定方法と各フックを正しく使う実例を解説します。

この記事でわかること

  • load-post.phpget_current_screen() による判定(推奨)
  • admin_head でCSS/JSを条件付きで読み込む正しい方法
  • 単純な echo による動作確認がなぜ不適切か
スポンサーリンク

なぜ単純なecho()での動作確認は避けるべきか

これから紹介するフックは、いずれもHTML出力が始まる前に発火する
load-post.phpload-post-new.php は、<!DOCTYPE html> が出力されるより遥か前に発火します。ここで echo すると、ページの一番上に予期しない文字列が出力されるうえ、後続の処理でリダイレクトやCookieの設定が行われる場合は「headers already sent」警告の原因にもなります。admin_head<head> 要素の中で発火するため、プレーンテキストを echo すると無効なHTMLになります。判定処理そのものは正しくても、そこで何をするか(echoか、スクリプトの読み込みか等)はフックの発火タイミングに応じて選ぶ必要があります。

get_current_screenを使う方法(推奨)

load-post.phpload-post-new.php投稿編集画面が読み込まれるときだけ発火するため、無駄な判定が発生しません。この段階でできる正しい処理の例として、固定ページ編集画面だけにスクリプト/スタイルを読み込む実装を示します。

functions.php:固定ページの編集画面だけにスクリプトを読み込む
add_action( 'load-post.php', 'check_if_page' );
add_action( 'load-post-new.php', 'check_if_page' );

function check_if_page() {
    $screen = get_current_screen();

    if ( $screen && 'page' === $screen->post_type ) {
        add_action( 'admin_enqueue_scripts', 'enqueue_page_only_script' );
    }
}

function enqueue_page_only_script() {
    wp_enqueue_script( 'page-editor-script', get_theme_file_uri( '/js/page-editor.js' ), array(), '1.0', true );
}
load-post.php内でadmin_enqueue_scriptsを登録する理由
load-post.php の時点ではまだHTMLもスクリプトタグも出力できませんが、「この画面では後で admin_enqueue_scripts を実行する」という予約(フック登録)をしておくことはできます。実際のスクリプト出力は、正しいタイミングで発火する admin_enqueue_scripts に任せます。

admin_headでCSSを追加する場合

admin_head<head> 要素の中で発火するため、<style><script> タグの出力に使うのが正しい用途です。

functions.php:固定ページの編集画面だけにCSSを追加
add_action( 'admin_head', 'check_if_page_admin' );

function check_if_page_admin() {
    global $post;

    if ( isset( $post ) && 'page' === $post->post_type ) {
        echo '<style>.edit-post-header{border-top:3px solid #0284c7;}</style>';
    }
}

current_screenフックを使う方法

current_screen アクションは、管理画面のあらゆるページで発火するため、対象を絞りたい場合は関数内で $screen->base なども確認するとより安全です。こちらもHTML出力前に発火するため、load-post.php と同様にフックの登録のみを行い、実際の出力は別のタイミングに任せます。

functions.php:current_screenでの判定と後続フックの登録
add_action( 'current_screen', 'check_if_page_current_screen' );

function check_if_page_current_screen( $screen ) {
    if ( 'post' === $screen->base && 'page' === $screen->post_type ) {
        add_action( 'admin_notices', function () {
            echo '<div class="notice notice-info"><p>固定ページを編集中です。</p></div>';
        } );
    }
}

よくある質問(FAQ)

Q現在の投稿が記事か固定ページかを判定するPHPコードは?
A管理画面外(フロントエンド)ではis_page()で固定ページ、is_single()で単一記事を判定します。管理画面ではget_current_screen()->post_type$post->post_typeで直接確認します。get_post_type()関数でも取得可能です。
Qカスタム投稿タイプも含めて投稿タイプを取得するには?
Aget_post_type()または$post->post_typeで取得できます。is_singular('custom_type')でカスタム投稿タイプの単一ページかどうかを判定することもできます。
Qアーカイブページで投稿タイプを判定する方法は?
Ais_post_type_archive('custom_type')で特定のカスタム投稿タイプのアーカイブページを判定します。get_queried_object()->nameでアーカイブ対象の投稿タイプ名を取得することもできます。

まとめ

  • 推奨load-post.phpload-post-new.phpget_current_screen()(画面が限定され無駄がない)
  • CSS/JSを条件付きで出力したい場合admin_headadmin_enqueue_scriptsを使う
  • 注意:これらのフックはHTML出力前に発火するため、直接echoせずフックの登録に留める

判定そのものは難しくありませんが、判定後に「何をするか」はフックの発火タイミングに合わせて正しく選びましょう。