WordPressのCSS・JS読み込み|応用編
この記事でわかること
- ページごとに必要なCSSだけを読み込めるようになる
- CSSが増えても、読み込みのコードを1行足すだけで管理できる
- CSSが読み込まれないときに、原因を見つけて直せる
ページが増えると、「このCSSはトップページでしか使わないのに」という場面が出てきます。必要なページでだけ読み込めば、サイトを軽く保てます。この記事では、CSSをページごとに出し分ける書き方を紹介します。
コードは長く見えるけど、同じ形のくり返しだよ!完成形を見ながら少しずつ読んでいこうね
ページ別の読み込みで押さえること
この記事では、トップページ・固定ページ・コラム・お知らせがあるサイトを例にします。全ページ共通のCSSを読み込んだうえで、表示中のページに必要なCSSだけを足します。
reset.cssリセットCSS
Google Fonts外部のCSS
style.css共通CSS。上の2つの後に読み込む
main.jsフッターで読み込むJS
トップページfront-page.css
固定ページabout.css など(スラッグごとに決める)
コラムの一覧column-archive.css
コラムの記事article-single.css・column-single.css・column-sidebar.css
お知らせの記事article-single.css
お知らせに絞った検索結果news-archive.css
ファイル名と、投稿タイプの名前(column・news)は例です。自分のサイトに合わせて決めます。
この記事は、CSS・JSを読み込む基本の書き方を知っている人に向けて書いています。
あわせて読みたいWordPressのCSS・JS読み込み|基本編
コードは、最初に完成形のコードを載せ、その後で部分ごとに解説します。やりたいことが決まっている場合は、次の表から使う関数と、解説している章を探してください。
| やりたいこと | 使う関数・機能 | 解説 |
|---|---|---|
| 読み込み処理をまとめる | 自作の共通関数 | 共通化 |
| ページ別にCSSを分ける | 条件分岐タグ | 出し分け |
| 固定ページを一括管理する | 配列とis_page |
出し分け |
| 読み込む順番を決める | 依存関係 | 順番 |
| 外部CSSを読み込む | wp_enqueue_style(外部URL) |
順番 |
完成形のコード
functions.phpに貼り付けて使えます。
function mytheme_enqueue_theme_style( /* ① */
$file,
$deps = ['mytheme-style']
) {
$path = get_parent_theme_file_path("css/{$file}.css");
if (!file_exists($path)) {
return;
}
wp_enqueue_style(
"mytheme-{$file}",
get_parent_theme_file_uri("css/{$file}.css"),
$deps,
filemtime($path)
);
}
function mytheme_enqueue_assets() { /* ② */
$fonts_url = 'https://fonts.googleapis.com/css2' /* ③ */
. '?family=Noto+Sans:wght@400;700'
. '&family=Noto+Sans+JP:wght@400;700'
. '&display=swap';
wp_enqueue_style(
'mytheme-google-fonts',
$fonts_url,
[],
null
);
mytheme_enqueue_theme_style('reset', []); /* ④ */
mytheme_enqueue_theme_style(
'style',
['mytheme-reset', 'mytheme-google-fonts']
);
$main_js = get_parent_theme_file_path('js/main.js');
if (file_exists($main_js)) { /* ⑤ */
wp_enqueue_script(
'mytheme-main',
get_parent_theme_file_uri('js/main.js'),
[],
filemtime($main_js),
['in_footer' => true]
);
}
if (is_front_page()) { /* ⑥ */
mytheme_enqueue_theme_style('front-page');
}
$page_styles = [ /* ⑦ */
'about' => ['about'],
'service' => ['service'],
'contact' => ['contact', 'form'],
'entry' => ['contact', 'form'],
];
foreach ($page_styles as $slug => $files) {
if (!is_page($slug)) {
continue;
}
foreach ($files as $file) {
mytheme_enqueue_theme_style($file);
}
}
if (is_post_type_archive('column')) { /* ⑧ */
mytheme_enqueue_theme_style('column-archive');
}
if (is_singular(['column', 'news'])) { /* ⑨ */
mytheme_enqueue_theme_style('article-single');
}
if (is_singular('column')) {
mytheme_enqueue_theme_style('column-single');
mytheme_enqueue_theme_style(
'column-sidebar',
['mytheme-article-single']
);
}
if ( /* ⑩ */
is_search()
&& get_query_var('post_type') === 'news'
) {
mytheme_enqueue_theme_style('news-archive');
}
}
add_action('wp_enqueue_scripts', 'mytheme_enqueue_assets');
| コード解説 | |
|---|---|
| ① | ファイル名だけで読み込める共通関数(共通化) |
| ② | 読み込み処理をまとめる関数(最後にフックへ登録する) |
| ③ | Google Fontsを、バージョンを付けずに読み込む(順番) |
| ④ | 全ページ共通のCSS。リセットCSSとフォントの後に共通CSSを読み込む(共通化・順番) |
| ⑤ | JSをフッターで読み込む |
| ⑥ | トップページだけで読み込む(出し分け) |
| ⑦ | 固定ページとCSSの対応を配列で管理する(出し分け) |
| ⑧ | カスタム投稿の一覧ページだけで読み込む(出し分け) |
| ⑨ | 依存先の記事用CSSを先に書き、その後にコラム専用のCSSを読み込む(出し分け・順番) |
| ⑩ | 特定の投稿タイプに絞った検索結果ページだけで読み込む(出し分け) |
使うときは、接頭辞(mytheme)、固定ページのスラッグ、投稿タイプ名(column・news)を、自分のサイトに合わせて書き換えてください。
Google Fontsを使わない場合は、③を削除し、④の依存からフォントのハンドル名※1を外します。
わからない部分があったら、表のリンクから解説に飛んでみてね!ブラウザの「戻る」でここに帰ってこられるよ
※1:ハンドル名…読み込むCSS・JSを識別するための名前。この記事では「mytheme-style」のように、接頭辞とファイル名を組み合わせて付けています。
共通化:読み込み処理を関数にまとめる
CSSが増えるたびに、同じ読み込みのコードを書くのは大変です。
ファイル名だけで読み込める関数を作る
CSSを1つ読み込む処理を、1つの関数にまとめます。ファイルがあるかを確かめ、更新日時をバージョンにして読み込む処理です。
cssフォルダ内のファイル名(拡張子なし)を渡すだけで、読み込めるようになります。この関数は、mytheme_enqueue_assets関数の外(上)に書きます。
function mytheme_enqueue_theme_style( /* ① */
$file, /* ② */
$deps = ['mytheme-style'] /* ③ */
) {
$path = get_parent_theme_file_path("css/{$file}.css"); /* ④ */
if (!file_exists($path)) { /* ⑤ */
return;
}
wp_enqueue_style(
"mytheme-{$file}", /* ⑥ */
get_parent_theme_file_uri("css/{$file}.css"),
$deps,
filemtime($path) /* ⑦ */
);
}
| コード解説 | |
|---|---|
| ① | ファイル名だけで読み込める関数を作る(名前は自分で決める) |
| ② | 1つ目にファイル名を受け取る |
| ③ | 2つ目に依存するハンドル名を受け取る(初期値は共通CSSにする) |
| ④ | cssフォルダ内のファイルのパスを組み立てる |
| ⑤ | ファイルがなければ、何もせずに終了する |
| ⑥ | ハンドル名を「接頭辞-ファイル名」の形に統一する |
| ⑦ | ファイルの更新日時をバージョンにする |
使うときは、mytheme_enqueue_assets関数の中で次のように書きます。
mytheme_enqueue_theme_style('reset', []); /* 依存なし */
mytheme_enqueue_theme_style('front-page'); /* style.cssの後 */
依存の初期値を共通CSSにしているため、2つ目を省略したCSSは、必ず共通CSSの後に読み込まれます。例えば、新しくfront-page.cssを追加したいときも、1行書くだけで済みます。
関数にまとめておくと、CSSが増えても1行足すだけで済むよ!
出し分け:必要なページでだけ読み込む
必要なページでだけ読み込むと、全ページですべてのCSSを読み込むより軽くなります。
ページの種類を判定する
表示中のページの種類は、条件分岐タグで判定します。よく使うのは次の5つです。
| 条件分岐タグ | 判定するページ |
|---|---|
is_front_page() |
トップページ |
is_page('スラッグ') |
特定の固定ページ |
is_singular('投稿タイプ') |
カスタム投稿の個別ページ(配列で複数指定も可) |
is_post_type_archive('投稿タイプ') |
カスタム投稿の一覧ページ |
is_search() |
検索結果ページ |
条件分岐タグは「このページのときだけ」を作るスイッチだよ!
条件に合うページでだけCSSを読み込む
条件分岐タグで判定し、当てはまるときだけ共通関数を呼び出します。次の例では、トップページ・コラムの一覧・コラムの記事ページで、それぞれ別のCSSを読み込みます。
if (is_front_page()) { /* ① */
mytheme_enqueue_theme_style('front-page');
}
if (is_post_type_archive('column')) { /* ② */
mytheme_enqueue_theme_style('column-archive');
}
if (is_singular('column')) { /* ③ */
mytheme_enqueue_theme_style('column-single');
}
| コード解説 | |
|---|---|
| ① | トップページでだけ読み込む |
| ② | コラム(カスタム投稿)の一覧ページでだけ読み込む |
| ③ | コラムの記事ページでだけ読み込む |
このコードも、mytheme_enqueue_assets関数の中に書きます。この後のコードも同じです。
固定ページとCSSの対応を配列で管理する
固定ページが多い場合は、スラッグとCSSの対応を配列にまとめると管理しやすくなります。ページが増えても、配列に1行足すだけで済みます。
$page_styles = [ /* ① */
'about' => ['about'],
'service' => ['service'],
'contact' => ['contact', 'form'], /* ② */
'entry' => ['contact', 'form'],
];
foreach ($page_styles as $slug => $files) {
if (!is_page($slug)) { /* ③ */
continue;
}
foreach ($files as $file) {
mytheme_enqueue_theme_style($file);
}
}
| コード解説 | |
|---|---|
| ① | 固定ページのスラッグと、読み込むCSSファイル名の対応表(変数名は自分で決める) |
| ② | 1つのページで、複数のCSSを読み込む |
| ③ | 表示中のページでなければ、次のスラッグへ進む |
contactとentryで同じCSSを指定していますが、ハンドル名が同じなので二重には読み込まれません。
検索結果ページで投稿タイプを判定する
特定の投稿タイプに絞った検索結果ページでだけ読み込みたい場合は、is_search()とget_query_var('post_type')を組み合わせます。
if ( /* ① */
is_search()
&& get_query_var('post_type') === 'news'
) {
mytheme_enqueue_theme_style('news-archive');
}
| コード解説 | |
|---|---|
| ① | newsに絞った検索結果ページでだけ読み込む |
ただし、複数の投稿タイプをまとめて検索すると、get_query_var('post_type')が配列を返すことがあるようです。その場合、この比較では一致しない可能性があります。
順番:読み込む順番を管理する
読み込む順番を決める
共通関数の2つ目に指定したハンドル名のCSSは、先に読み込まれます。この指定を依存関係と呼びます。wp_enqueue_styleでは、3つ目の引数にあたります。
次の例では、コラムとお知らせで共通の記事用CSSを読み込み、コラムだけにサイドバー用CSSを追加しています。
if (is_singular(['column', 'news'])) { /* ① */
mytheme_enqueue_theme_style('article-single');
}
if (is_singular('column')) {
mytheme_enqueue_theme_style(
'column-sidebar',
['mytheme-article-single'] /* ② */
);
}
| コード解説 | |
|---|---|
| ① | コラムとお知らせの記事ページで、共通の記事用CSSを読み込む |
| ② | 記事用CSSの後に、サイドバー用CSSを読み込む |
依存先に指定したハンドル名が登録されていないと、そのCSS自体が出力されません。
共通関数は、ファイルがなければ何もせずに終了します。そのため、article-single.cssが見つからないだけで、column-sidebar.cssまで読み込まれなくなります。
WordPress 6.9.1以降では、この状態になると_doing_it_wrongの通知が出ます。WP_DEBUGを有効にしていれば確認できます。
CSSが急に読み込まれなくなったときは、依存先のファイルがあるか確認してね!
依存関係は出力する時点で解決されるため、コードの順番が逆でも、ファイルがあれば動きます。ただ、「依存先→依存元」の順に書いておくと、読み込み順がひと目でわかります。
Google Fontsなどの外部CSSを読み込む
外部のCSSも、テーマ内のファイルと同じくwp_enqueue_styleで読み込めます。
$fonts_url = 'https://fonts.googleapis.com/css2' /* ① */
. '?family=Noto+Sans:wght@400;700'
. '&family=Noto+Sans+JP:wght@400;700'
. '&display=swap';
wp_enqueue_style(
'mytheme-google-fonts',
$fonts_url,
[],
null /* ② */
);
mytheme_enqueue_theme_style(
'style',
['mytheme-reset', 'mytheme-google-fonts'] /* ③ */
);
| コード解説 | |
|---|---|
| ① | Google FontsのCSSのURL(長いので、文字列を分けてつないでいる) |
| ② | バージョンを付けない |
| ③ | 共通CSSを、リセットCSSとフォントのCSSの後に読み込む |
URLにfamily=が複数ある場合は、バージョンをnullにして付けないようにします。
バージョンを付けると、URL内の同じ名前の値が1つにまとまってしまうため、と言われています。WordPressの内部処理によるもので、詳しい条件は環境によって異なる可能性があります。
さいごに
まとめ
ページ別の読み込みは、「共通化→出し分け→順番の管理」の順に組むと迷わず書けます。
まず押さえる3つのポイント
- 読み込み処理は、ファイル名を渡すだけの共通関数にまとめる
- 条件分岐タグで、必要なページでだけ読み込む
- 先に読み込みたいCSSは、依存関係で指定する
慣れてきたら、完成形のコードを自分のサイトに合わせて組み替えてみてください。
よくある質問
条件分岐を書いたのにCSSが読み込まれません
まず、cssフォルダに指定した名前のファイルが存在するか確認してください。共通関数は、ファイルがないと何もしません。
次に、依存先のハンドル名が登録されているか確認してください。依存先がないと、そのCSS自体が出力されません。
依存先については「読み込む順番を決める」で解説しています。
参考にした公式情報
どのページも英語ですが、ブラウザの翻訳機能を使えば日本語で読めます。

