WordPressでCSS・JSを読み込むときは wp_enqueue_style() / wp_enqueue_script() を使いますが、そのまま書くと全ページで読み込まれ、表示速度の低下や不要な干渉の原因になります。この記事では、特定のページだけで読み込む条件分岐を、子テーマ・キャッシュ対策まで含めた実務的なコードで解説します。
この記事でわかること
wp_enqueue_scriptsフック+条件分岐で特定ページだけ読み込む- 子テーマで壊れない正しいパス(
get_stylesheet_directory_uri()) - キャッシュ対策(
filemtime)とフッター読み込み - ページ・投稿ID・テンプレートなど条件の書き分け
functions.phpで条件分岐して読み込む
wp_enqueue_scripts にフックした関数の中で条件分岐します。1つの関数にまとめておくと管理しやすいです。次のコードは、スラッグ contact の固定ページでだけCSSとJSを読み込みます。
functions.php:特定ページだけCSS/JSを読み込む
add_action('wp_enqueue_scripts', function () {
if (is_page('contact')) {
// CSS:子テーマの /css/contact.css を読み込む
$css = get_stylesheet_directory_uri() . '/css/contact.css';
wp_enqueue_style(
'contact-style',
$css,
array(),
filemtime(get_stylesheet_directory() . '/css/contact.css') // 更新時に自動でキャッシュ更新
);
// JS:jQuery依存・フッター読み込み
$js = get_stylesheet_directory_uri() . '/js/contact.js';
wp_enqueue_script(
'contact-script',
$js,
array('jquery'), // 依存(第3引数)
filemtime(get_stylesheet_directory() . '/js/contact.js'),
true // フッター(body閉じ前)で読み込む
);
}
});
子テーマでは get_template_directory_uri() を使わない
get_template_directory_uri() は親テーマのURLを返します。子テーマの /css/ や /js/ に置いたファイルは、get_stylesheet_directory_uri()(URL)とget_stylesheet_directory()(サーバーパス)で参照してください。親テーマ側のファイルを読むときだけ get_template_directory_*() を使います。2つの実務ポイント
①バージョン(第4引数)に
②JSはフッター(第5引数
①バージョン(第4引数)に
filemtime():ファイルの更新時刻をバージョンにすると、CSS/JSを更新するたびにURLの ?ver= が変わり、ブラウザキャッシュが自動で更新されます(「CSSを直したのに反映されない」の定番対策)。この考え方はCSSファイルの更新日時を取得して自動的にパラメータを付与する方法で詳しく解説しています。②JSはフッター(第5引数
true)で読み込むと、レンダリングを妨げにくくなります。jQuery依存なら第3引数に array('jquery') を指定します(jQueryを読み込む方法)。条件の書き分け(ページ・投稿ID・テンプレート)
is_page() 以外にも、状況に応じて条件を変えられます。
条件分岐の例
// スラッグで指定(複数OK)
if (is_page(array('contact', 'access'))) { /* ... */ }
// 投稿・固定ページのIDで指定
if (is_singular() && in_array(get_the_ID(), array(123, 456), true)) { /* ... */ }
// 特定のページテンプレートのとき
if (is_page_template('template-lp.php')) { /* ... */ }
// 特定カテゴリーの投稿・アーカイブ
if (is_singular('post') && has_category('news')) { /* ... */ }
ページごとに読み込むファイルをカスタムフィールドで指定する
「ページによって読み込むファイルを変えたい」場合は、各ページのカスタムフィールドにファイル名を入れ、それを読んでenqueueします。編集画面のカスタムフィールド(例:フィールド名 extra_css)にlp.css のように値を入れておき、次のコードで読み込みます。
functions.php:カスタムフィールドの値でCSSを読み込む
add_action('wp_enqueue_scripts', function () {
if (!is_singular()) {
return;
}
$file = get_post_meta(get_the_ID(), 'extra_css', true); // 例:'lp.css'
if ($file) {
$path = get_stylesheet_directory() . '/css/' . $file;
if (file_exists($path)) { // 存在するファイルだけ読み込む
wp_enqueue_style(
'extra-css-' . sanitize_title($file),
get_stylesheet_directory_uri() . '/css/' . $file,
array(),
filemtime($path)
);
}
}
});
カスタムフィールドは「コードで読む」もの
カスタムフィールドに値を入れただけでは何も起きません。上のように
カスタムフィールドに値を入れただけでは何も起きません。上のように
get_post_meta() で値を読み取ってenqueueするコードが必要です。また、ファイル名をそのままパスに使うので、file_exists() で存在確認し、想定外の値が入っても壊れないようにしておきましょう。ブロック単位でCSSを出し分けるならwp_enqueue_block_style()で特定ブロックにだけCSSを適用する方法も便利です。よくある質問(FAQ)
Q特定の投稿IDのページだけ読み込むには?
A
if (is_singular() && get_the_ID() == 123) { ... } のように判定します。複数IDなら in_array(get_the_ID(), array(1, 5, 10), true) を使います。IDは環境で変わるため、可能ならスラッグやテンプレートでの判定が保守しやすいです。QCSSを更新したのに反映されません。
A
?ver= が同じだとブラウザがキャッシュを使い続けます。wp_enqueue_style() の第4引数(バージョン)に filemtime(パス) を渡すと、ファイル更新のたびに自動でバージョンが変わりキャッシュが更新されます。Q読み込み順序(依存関係)を指定するには?
A
wp_enqueue_script('my-js', $url, array('jquery'), $ver, true) のように第3引数に依存ハンドルの配列を渡すと、そのスクリプトの後に読み込まれます。第5引数 true でフッター(body閉じ前)に出力できます。まとめ
- 条件分岐:
wp_enqueue_scriptsの中でis_page()などで判定 - 子テーマのパス:
get_stylesheet_directory_uri()/get_stylesheet_directory() - キャッシュ対策:バージョンに
filemtime()/JSはフッター(true) - ページ別に変える:カスタムフィールド+
get_post_meta()で読み込み
「全ページで読み込む」をやめて条件分岐にするだけで、表示速度と保守性が上がります。パスとバージョンの2点を正しく書くのがコツです。

