【WordPress】特定のページでのみCSS・JSを読み込む方法|条件分岐・子テーマパス・キャッシュ対策

WordPressで特定のページでのみCSSやJSファイルを読み込む方法 WordPress

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引数)に 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のページだけ読み込むには?
Aif (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読み込み順序(依存関係)を指定するには?
Awp_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点を正しく書くのがコツです。