【WordPress】親テーマと子テーマのCSS読み込み順序と正しい設定方法

重要ポイントの要約

WordPressで子テーマを使ってサイトをカスタマイズする際、最も重要なのが「親テーマと子テーマのCSS読み込み順序」です。CSSには「後から読み込まれた指定が優先される(カスケードの法則)」があるため、必ず「親テーマのCSS(土台) ➔ 子テーマのCSS(カスタマイズ)」の順で読み込む必要があります。

  • スタイルの優先順位
    同じ詳細度のセレクタであれば、HTML上で後から読み込まれたCSSが有効になります。
  • @importは非推奨
    昔よく使われていた @import は並列ダウンロードを阻害し表示速度を低下させるため、現代のWordPressでは使用しません。
  • functions.php での制御
    wp_enqueue_scripts アクションフックと wp_enqueue_style() の依存関係($deps)引数を正しく設定することが標準かつ最適な方法です。

本記事では、親テーマと子テーマのスタイル読み込み順序の仕組みから、テーマの仕様に応じた2つの実装パターン、CSS即時反映のためのキャッシュ対策までわかりやすく整理して解説します。

親テーマと子テーマにおけるCSSの基本原則

WordPressで既存のテーマをカスタマイズする際、親テーマのファイルを直接編集してしまうと、テーマのバージョンアップ時にすべての変更が上書きされて消えてしまいます。そのため、差分だけを安全に管理できる「子テーマ」の作成が推奨されています。

しかし、子テーマの style.css にCSSを記述したのに「なぜか親テーマのデザインが変わらない」「スタイルが効かない」というトラブルによく遭遇します。その最大の原因が「CSSの読み込み順序」です。

CSSのカスケード(後勝ち)ルール

CSS(Cascading Style Sheets)の仕様上、同じセレクタ・同じ詳細度のスタイルが存在する場合、HTMLソースコードの中で後から読み込まれたスタイルが優先して適用されます。

正しい読み込み順序のイメージ

  1. <link rel="stylesheet" href="親テーマのstyle.css">(全体のベーススタイルを定義)
  2. <link rel="stylesheet" href="子テーマのstyle.css">(差分や変更箇所を上書き)

上記のように、親テーマが先、子テーマが後に出力されていれば、子テーマで指定したプロパティが自然に親テーマの指定を上書きして反映されます。

逆に、もし子テーマが先に読み込まれ、後から親テーマが読み込まれてしまうと、子テーマで書いたスタイルが親テーマのスタイルによって塗りつぶされてしまい、カスタマイズが反映されなくなります。

@import による読み込みが非推奨な理由

かつてのWordPressチュートリアルでは、子テーマの style.css の冒頭に以下のような記述をする方法が紹介されていました。

/* 非推奨の古い書き方 */
@import url("../parent-theme-folder/style.css");

/* ここから子テーマのカスタマイズCSS */
body {
    background-color: #f0f0f0;
}

現在、この @import を使った読み込み方法は公式に非推奨となっています。理由は主に以下の2点です。

  • 並列ダウンロードの阻害(表示速度の低下)
    ブラウザは複数の <link> タグがあれば同時にファイルをダウンロードできますが、@import は子テーマのCSSを解析してからでないと親テーマのCSSを取りに行けないため、リクエストが数珠つなぎ(ウォーターフォール)になり表示遅延を引き起こします。
  • Core Web Vitals(表示パフォーマンス指標)の悪化
    スタイルの取得が遅れることで画面のレンダリングがブロックされ、ページの表示開始速度(FCP / LCP)が低下します。

そのため、現在は子テーマの functions.php からWordPress標準のエンキュー機能(wp_enqueue_scripts)を使って読み込むのが鉄則です。

functions.php での正しいCSS読み込みパターン

子テーマの functions.php でスタイルを読み込む際、使用している親テーマがどのようにCSSを読み込んでいるかによって、記述パターンが2通りに分かれます。

パターンA:親テーマが自動でstyle.cssを読み込んでいる場合(モダンテーマ標準)

近年の多くのWordPressテーマ(親テーマ)は、自分自身の functions.php の中で親の style.css を自動的にエンキューする設計になっています。

この場合、子テーマ側で再度親テーマの style.css をエンキューしてしまうと、親テーマのCSSが2回読み込まれてしまう(二重読み込み)ため無駄が発生します。子テーマ側では「親テーマのスタイルに依存する形で、子テーマのstyle.cssのみを追加する」コードを記述します。

<?php
// 子テーマの functions.php
add_action( 'wp_enqueue_scripts', 'my_child_theme_enqueue_styles' );
function my_child_theme_enqueue_styles() {
    // 親テーマのスタイルハンドル名を依存関係($deps)に指定して子テーマのCSSを読み込む
    wp_enqueue_style(
        'child-style',
        get_stylesheet_uri(),
        array( 'parent-style-handle' ), // 親テーマが登録しているハンドル名を指定
        wp_get_theme()->get( 'Version' )
    );
}

親テーマのハンドル名の調べ方

親テーマの functions.php を開き、wp_enqueue_style( 'xxx', ... ) と書かれている第1引数の文字列(xxx)を確認します。多くのテーマでは parent-style やテーマ名(例: twentytwentyfour-style)などが付けられています。

パターンB:親テーマがstyle.cssを自動で読み込まない場合(公式Codexパターン)

親テーマが style.css を自動でエンキューしない設計の場合(またはクラシックテーマの場合)は、子テーマの functions.php の中で、親テーマと子テーマの両方のCSSを登録・読み込みます。

<?php
// 子テーマの functions.php
add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles' );
function my_theme_enqueue_styles() {
    // 1. 親テーマの style.css を登録・読み込み
    wp_enqueue_style(
        'parent-style',
        get_template_directory_uri() . '/style.css'
    );

    // 2. 子テーマの style.css を親テーマ依存(array('parent-style'))として読み込み
    wp_enqueue_style(
        'child-style',
        get_stylesheet_uri(),
        array( 'parent-style' ),
        wp_get_theme()->get( 'Version' )
    );
}

URI取得関数の違いに注意

  • get_template_directory_uri()親テーマのディレクトリURLを返します。
  • get_stylesheet_directory_uri() / get_stylesheet_uri()子テーマのディレクトリURL / style.css URLを返します。

実践Tips:CSS編集が即時反映されるキャッシュ対策(filemtime)

CSSを変更してサーバーにアップロードしたのに、ブラウザのキャッシュが原因で「変更が反映されない」という問題が頻繁に起こります。

バージョン引数にファイルの最終更新日時を取得する filemtime() を指定すると、CSSファイルを保存・更新するたびに自動で新しいバージョン番号(クエリパラメータ)が付与され、ブラウザキャッシュに悩まされることがなくなります。

<?php
add_action( 'wp_enqueue_scripts', 'my_child_theme_styles_with_cache_buster' );
function my_child_theme_styles_with_cache_buster() {
    // 子テーマ style.css のファイルパス
    $style_path = get_stylesheet_directory() . '/style.css';
    $version    = file_exists( $style_path ) ? filemtime( $style_path ) : '1.0.0';

    wp_enqueue_style(
        'child-style',
        get_stylesheet_uri(),
        array( 'parent-style' ),
        $version // ファイル更新日時をバージョンに設定(例: style.css?ver=1708001234)
    );
}

LPや特定ページだけで専用CSSを読み込む応用テクニック

全ページ共通の style.css だけでなく、「ランディングページ(LP)専用のスタイル」や「特定の固定ページ専用のCSS」を読み込みたいケースがあります。この場合、WordPressの条件分岐タグを使って読み込みを制御します。

<?php
add_action( 'wp_enqueue_scripts', 'my_custom_page_styles' );
function my_custom_page_styles() {
    // スラッグが 'lp' の固定ページのみで専用CSSを読み込む
    if ( is_page( 'lp' ) ) {
        wp_enqueue_style(
            'lp-style',
            get_stylesheet_directory_uri() . '/css/lp.css',
            array( 'child-style' ), // 子テーマの基本CSSの後に読み込む
            filemtime( get_stylesheet_directory() . '/css/lp.css' )
        );
    }

    // フロントページ(トップページ)のみ専用CSSを読み込む場合
    if ( is_front_page() ) {
        wp_enqueue_style(
            'front-style',
            get_stylesheet_directory_uri() . '/css/front.css',
            array( 'child-style' ),
            filemtime( get_stylesheet_directory() . '/css/front.css' )
        );
    }
}

条件分岐を使うことで、関係のない通常投稿やアーカイブページで余計なCSSが読み込まれるのを防ぎ、サイト全体の表示パフォーマンスを高く維持できます。

子テーマのCSSが反映されない時のチェックリスト

設定を行ったにもかかわらず子テーマのスタイルが反映されない場合は、以下のステップに沿って原因を確認してください。

  1. HTMLの <head> 内で読み込み順序を確認する
    ブラウザでページを開き、「ページのソースを表示」または開発者ツール(F12)のElementsタブで、parent-style<link> よりも下に child-style<link> が来ているか確認します。
  2. CSSセレクタの詳細度(Specificity)を確認する
    親テーマ側のCSSセレクタが #main .content h2 のように詳細度が高く指定されている場合、子テーマ側で単に h2 と書いても上書きできません。親テーマと同等以上のセレクタを指定してください。
  3. 依存関係($deps)のハンドル名が合っているか確認する
    親テーマのハンドル名と、子テーマ側で指定した array( 'parent-handle' ) の文字列が完全に一致しているか再確認します。
  4. キャッシュをクリアする
    ブラウザのスーパーリロード(Ctrl + F5 / Cmd + Shift + R)を実行するか、キャッシュプラグイン(WP Super CacheやLiteSpeed Cache等)のキャッシュを削除します。

まとめ

WordPressにおける親テーマと子テーマのCSS読み込み順序と管理の要点は以下の通りです。

  • カスケード原則の徹底:親テーマ(ベース) ➔ 子テーマ(カスタマイズ)の順序で読み込むことで、安全・確実に上書きができる。
  • @import は使わない:パフォーマンス低下とレンダリングブロックを防ぐため、子テーマの functions.php で管理する。
  • 依存関係($deps)を活用するwp_enqueue_style() の第3引数に親テーマのハンドル名を渡すことで、WordPressが自動的に正しい読み込み順序を保証してくれる。
  • filemtime() によるキャッシュ対策:開発や更新時のキャッシュトラブルを防ぐため、ファイル更新日時をバージョン番号として指定する。

正しい読み込みルールをマスターすることで、親テーマのアップデートにも強く、高速でメンテナンス性の高いWordPressサイト運用が可能になります。