投稿タイプによって管理画面での処理を変えたい場合、現在の編集画面が固定ページか通常の投稿かを判定する必要があります。この記事では、判定方法と各フックを正しく使う実例を解説します。
この記事でわかること
load-post.php+get_current_screen()による判定(推奨)admin_headでCSS/JSを条件付きで読み込む正しい方法- 単純な
echoによる動作確認がなぜ不適切か
なぜ単純なecho()での動作確認は避けるべきか
これから紹介するフックは、いずれもHTML出力が始まる前に発火する
load-post.php/load-post-new.php は、<!DOCTYPE html> が出力されるより遥か前に発火します。ここで echo すると、ページの一番上に予期しない文字列が出力されるうえ、後続の処理でリダイレクトやCookieの設定が行われる場合は「headers already sent」警告の原因にもなります。admin_head は <head> 要素の中で発火するため、プレーンテキストを echo すると無効なHTMLになります。判定処理そのものは正しくても、そこで何をするか(echoか、スクリプトの読み込みか等)はフックの発火タイミングに応じて選ぶ必要があります。get_current_screenを使う方法(推奨)
load-post.php / load-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カスタム投稿タイプも含めて投稿タイプを取得するには?
A
get_post_type()または$post->post_typeで取得できます。is_singular('custom_type')でカスタム投稿タイプの単一ページかどうかを判定することもできます。Qアーカイブページで投稿タイプを判定する方法は?
A
is_post_type_archive('custom_type')で特定のカスタム投稿タイプのアーカイブページを判定します。get_queried_object()->nameでアーカイブ対象の投稿タイプ名を取得することもできます。まとめ
- 推奨:
load-post.php/load-post-new.php+get_current_screen()(画面が限定され無駄がない) - CSS/JSを条件付きで出力したい場合:
admin_headやadmin_enqueue_scriptsを使う - 注意:これらのフックはHTML出力前に発火するため、直接echoせずフックの登録に留める
判定そのものは難しくありませんが、判定後に「何をするか」はフックの発火タイミングに合わせて正しく選びましょう。
