べんりワザ・WordPressのカスタマイズの土台

CSSとJavaScriptの正しい読みこみ方(wp_enqueue)

テーマにCSSとJavaScriptを読みこむ正しい方法。wp_enqueue_styleの書き方、キャッシュ対策のバージョン指定、jQueryの使い方、header.phpに直書きしてはいけない理由をまとめました。

テーマのCSSとJavaScriptは、functions.phpからwp_enqueue_style() / wp_enqueue_script()で読みこむのが正しい方法です。header.php<link>を直書きするやり方は、順番や重複が管理できずトラブルの原因になります。

function my_assets() {
  wp_enqueue_style('main', get_theme_file_uri('style.css'), [], '1.0.0');
  wp_enqueue_script('main', get_theme_file_uri('js/main.js'), [], '1.0.0', true);
}
add_action('wp_enqueue_scripts', 'my_assets');

これだけで、wp_head()wp_footer()の位置に正しい形で出力されます。

テーマ開発functions.phpとCSSの正しい配線テーマ作りの流れの中で学びたいときは、テーマ開発コースのこの回へ

引数の意味

wp_enqueue_style('ハンドル名', 'URL', 依存, バージョン, メディア);
wp_enqueue_script('ハンドル名', 'URL', 依存, バージョン, フッターに置くか);
引数役割
ハンドル名このファイルの識別名(重複の防止に使われる)'main'
URLファイルの場所get_theme_file_uri('style.css')
依存先に読むべきファイルのハンドル名['jquery']
バージョンキャッシュ対策の文字列'1.0.0'
第5引数CSSはメディア('all')/ JSはフッターに置くかtrue

JSの第5引数trueは重要です。false(既定)だと<head>で読みこまれ、その分だけ表示開始が遅くなります。基本はtrueにしておきます。

ファイルのURLを取る関数

get_theme_file_uri('style.css')          // テーマ内のファイル(子テーマ優先)
get_stylesheet_uri()                     // 使用中テーマのstyle.css
get_parent_theme_file_uri('style.css')   // 親テーマのファイル

get_theme_file_uri()は子テーマにも対応するので、get_template_directory_uri() . '/style.css'より安全です。

べんりワザ子テーマの作り方(最小構成)子テーマで親のCSSを読みこむ書き方はこちら

キャッシュ対策のバージョン指定

CSSを直したのに反映されない——バージョンを付けていない(または固定のまま)が原因です。

// 開発中:ファイルの更新時刻を自動でバージョンにする
$css = get_theme_file_path('style.css');
wp_enqueue_style('main', get_theme_file_uri('style.css'), [], filemtime($css));

filemtime()はファイルの更新時刻を返すので、保存するたびにURLが変わって必ず再読みこみされます。公開後は'1.0.3'のように手で上げる運用でもかまいません。

jQueryを使う

WordPressにはjQueryが同梱されています。依存配列に書くだけで読みこまれます。

wp_enqueue_script('main', get_theme_file_uri('js/main.js'), ['jquery'], '1.0.0', true);

同梱のjQueryはノーコンフリクトモードのため、$がそのままでは使えません。囲んで使います。

(function ($) {
  $('.menu-toggle').on('click', function () {
    $('.global-nav').toggleClass('is-open');
  });
})(jQuery);

PHPの値をJavaScriptに渡す

テンプレートに<script>で直書きするのではなく、変数として渡すのが正攻法です。

wp_enqueue_script('main', get_theme_file_uri('js/main.js'), [], '1.0.0', true);
wp_localize_script('main', 'MY_DATA', [
  'ajaxUrl' => admin_url('admin-ajax.php'),
  'homeUrl' => home_url('/'),
  'nonce'   => wp_create_nonce('my_action'),
]);
console.log(MY_DATA.homeUrl);

wp_localize_script()指定したスクリプトの直前に変数を出力するので、順番の心配もありません。

ページごとに読みこみを分ける

全ページで全部読みこむ必要はありません。条件分岐で絞れば、その分だけ軽くなります。

function my_assets() {
  wp_enqueue_style('main', get_theme_file_uri('style.css'), [], '1.0.0');

  if (is_front_page()) {
    wp_enqueue_script('slider', get_theme_file_uri('js/slider.js'), [], '1.0.0', true);
  }
  if (is_singular('shohin')) {
    wp_enqueue_style('product', get_theme_file_uri('css/product.css'), ['main'], '1.0.0');
  }
}
add_action('wp_enqueue_scripts', 'my_assets');

['main']のように依存を書くと、必ずmainより後に読みこまれるので、上書きの順番が保証されます。

べんりワザWordPressの条件分岐タグ早見表条件分岐タグの早見表はこちら

管理画面・ブロックエディタで読みこむ

フック対象
wp_enqueue_scriptsサイト側(フロント)
admin_enqueue_scripts管理画面
enqueue_block_editor_assetsブロックエディタの編集画面

ブロックエディタの中でも記事の見た目を再現したいときは、enqueue_block_editor_assetsでCSSを読みこみます。

wp_head()wp_footer()が必須

wp_enqueue_*で登録したファイルは、テンプレートのこの2つの位置に出力されます。

  <?php wp_head(); ?>
</head>
  <?php wp_footer(); ?>
</body>

この2行が無いとCSSもJSも一切出力されません(プラグインも動かなくなります)。テーマを自作したときにいちばん最初に確認するポイントです。

外部のCDNを読みこむ場合

wp_enqueue_style('lightbox', 'https://cdn.example.com/lightbox.min.css', [], null);

外部URLはバージョンにnullを渡してURLをそのまま保ちます。ただし、外部サービスの停止や改変の影響を受けるため、本番では自前にダウンロードして読みこむほうが安全です。

まとめ

  1. CSS・JSはfunctions.phpからwp_enqueue_style() / wp_enqueue_script()で読みこむ
  2. JSは第5引数trueでフッターへ。依存配列で読みこみ順を保証する
  3. バージョン(filemtime()など)でキャッシュ対策。反映されないときはまずここ
  4. PHPの値はwp_localize_script()でJSへ。wp_head() / wp_footer()が無いと何も出力されない

読みこみを制御できると、表示速度とトラブルの少なさが一段変わります。

よくある質問

header.phpにlinkタグを直接書いてはいけないのですか?
動きはしますが避けます。読みこみ順や重複の管理ができず、プラグインとの相性問題やキャッシュ対策のバージョン付与ができなくなります。wp_enqueue_style()を使うと、WordPressが順番と重複を管理してくれます。
CSSを直したのにブラウザで変わりません
キャッシュが原因です。wp_enqueue_styleの第4引数にバージョンを渡すとURLに?ver=…が付き、変更時に再読みこみされます。開発中はfilemtime()でファイルの更新時刻を渡す方法が便利です。
WordPressでjQueryを使うにはどうしますか?
wp_enqueue_script('jquery')は不要な場合が多く、依存配列に['jquery']を書くだけで自動的に読みこまれます。WordPress同梱のjQueryはノーコンフリクトモードなので、$ではなくjQueryを使うか、function($){…}(jQuery)で囲みます。
JavaScriptからPHPの値を使いたいです
wp_localize_script()(またはwp_add_inline_script())でJavaScript側に変数として渡します。テンプレートにscriptタグで直書きするより安全で、順番の管理もできます。