Перейти к содержимому
Шаблоны

Стили дочерней темы WordPress не загружаются

Файл style.css вашей дочерней темы не загружается, потому что WordPress не подключает его автоматически.

Опубликовано

Файл style.css вашей дочерней темы не загружается, потому что WordPress не подключает его за вас. Таблицу стилей дочерней темы нужно регистрировать вручную в functions.php дочерней темы, и в этом подключении почти всегда одна из двух ошибок: его либо нет вообще, либо оно выполняется без указания родительской таблицы стилей в качестве зависимости, так что ваши правила попадают не туда в каскаде и перекрываются. Исправьте подключение — и стили вернутся. Старый трюк с @import, который вы наверняка скопировали из туториала 2013 года, — это неправильное решение.

Почему так происходит

Классическая дочерняя тема состоит из двух обязательных файлов: style.css с блоком заголовка, где указана родительская тема, и functions.php. Строка Template: в заголовке говорит WordPress, от какой родительской темы наследовать шаблоны. И это единственное, что WordPress делает автоматически. Он читает заголовок, настраивает откат к родительским шаблонам — и на этом останавливается. Он никогда не подключает ваш дочерний style.css на фронтенде.

Родительская тема, в свою очередь, подключает свою таблицу стилей из своего functions.php, привязанного к хуку wp_enqueue_scripts. Ваш дочерний functions.php выполняется первым, потом родительский, а затем срабатывает всё, что висит на этом хуке. Если ваша дочерняя тема ни разу не вызывает wp_enqueue_style для собственного файла, браузер его просто не запрашивает. Страница выглядит как голая родительская тема — потому что это она и есть.

Второй сбой тоньше. Вы подключаете дочернюю таблицу стилей, она загружается, но ваши переопределения ничего не делают. Это проблема порядка загрузки. Когда у двух правил одинаковая специфичность, побеждает то, что загрузилось последним. Если ваш дочерний CSS загружается раньше родительского, родительский выигрывает в каждой такой ничьей. Массив зависимостей в wp_enqueue_style — это как раз то, что задаёт порядок.

Ещё одно, в чём часто ошибаются: get_template_directory_uri() указывает на папку родительской темы, а get_stylesheet_directory_uri() — на папку активной (дочерней) темы. Перепутаете их — и подключите родительский style.css второй раз, а дочерний так и не тронете.

Исправление, по шагам

Сначала выясните, что на самом деле загружается. Откройте сломанную страницу, посмотрите исходный код и найдите имя папки вашей дочерней темы. WordPress выводит подключённые стили как <link id="handle-css" href="..."> — где id — это ваш дескриптор (handle) плюс -css. Если дочернего style.css нет в <head> вообще — подключение не выполняется. Если он есть, но стили не применяются — это проблема зависимости или порядка. Одна эта проверка сразу говорит, какая из двух ошибок у вас.

Затем найдите настоящий дескриптор родительской темы. Большинство современных тем (Astra, GeneratePress, темы серии Twenty-*) уже подключают свою таблицу стилей под конкретным дескриптором — astra-theme-css, generate-style-css, twenty-twenty-four-style и так далее. Вам нужна именно эта точная строка. Найдите её поиском (grep) в родительской теме или считайте из <link id="...-css"> в исходном коде (отбросив хвостовое -css).

Теперь напишите подключение. В типичном случае, когда родительская тема уже загружает свою таблицу стилей, вы не подключаете родительскую заново. Вы подключаете только дочернюю и указываете дескриптор родительской как зависимость, чтобы ваша загружалась после неё:

<?php
add_action( 'wp_enqueue_scripts', 'child_enqueue_styles', 20 );

function child_enqueue_styles() {
    wp_enqueue_style(
        'child-style',
        get_stylesheet_directory_uri() . '/style.css',
        array( 'astra-theme-css' ), // <-- the parent's REAL handle
        wp_get_theme()->get( 'Version' )
    );
}

Если родительская тема не подключает свою таблицу стилей (некоторые старые или минималистичные темы полагаются на @import), тогда подключайте обе и делайте дочернюю зависимой от родительской:

<?php
add_action( 'wp_enqueue_scripts', 'child_enqueue_styles' );

function child_enqueue_styles() {
    wp_enqueue_style(
        'parent-style',
        get_template_directory_uri() . '/style.css'
    );
    wp_enqueue_style(
        'child-style',
        get_stylesheet_directory_uri() . '/style.css',
        array( 'parent-style' ),
        wp_get_theme()->get( 'Version' )
    );
}

Аргумент wp_get_theme()->get('Version') — это ваш сброс кеша. Поднимите номер в строке Version: в заголовке дочернего style.css — и браузеры перезагрузят файл. Пропустите его — и будете править CSS и клясться, что ничего не меняется, хотя это всего лишь кеш.

Если в functions.php есть синтаксическая ошибка, весь файл молча падает и ни одно из ваших подключений не выполняется — а выглядит это ровно как «стили не загружаются». Включите WP_DEBUG или вставьте ваш debug.log в наш декодер логов ошибок WordPress, чтобы быстро найти фатальную ошибку.

Чего делать не стоит

Не используйте @import. Совет эпохи Codex состоял в том, чтобы поставить @import url("../parenttheme/style.css"); в начале дочернего style.css. Это работает, но медленно — браузер не может начать скачивать родительский CSS, пока не разберёт дочерний, так что оба запроса идут последовательно, а не параллельно. В собственном хендбуке WordPress уже много лет не рекомендуют так делать. Если ваш туториал велел вам сделать именно это — вот почему стили тормозят.

Не прописывайте жёстко дескриптор 'parent-style' и не подключайте родительский файл вслепую. Знаменитый сниппет из Codex делает именно это, и он неверен для любой темы, которая уже регистрирует свою таблицу стилей под другим дескриптором. В итоге вы загружаете родительский CSS дважды, а ваша зависимость указывает на дескриптор, которого может и не существовать.

Не вызывайте wp_enqueue_style на верхнем уровне functions.php. Он должен выполняться внутри функции, привязанной к хуку wp_enqueue_scripts. Вызванный слишком рано, он ничего не делает.

Не копируйте весь родительский functions.php в дочернюю тему. Оба файла загружаются; дочерний выполняется первым. Копирование приводит к повторному объявлению функций и фатальной ошибке.

Одна оговорка: всё это касается классических тем (на PHP-шаблонах). Если ваша родительская тема — блочная, оформление идёт в основном через theme.json и редактор сайта, а переопределения в style.css ведут себя иначе — этому я бы доверял меньше и проверял напрямую, а не считал, что это подключение и есть решение.

Всё ещё не получается?

Убедитесь, что строка Template: в заголовке дочернего style.css точно совпадает с именем папки родительской темы, с учётом регистра — а не с отображаемым названием родительской темы. Затем перепроверьте исходный код: дескриптор на месте, загружается после родительского, версия в query-строке поднята. Если <link> есть, загружается последним, а CSS всё равно не применяется — это уже не проблема подключения, а специфичность, и решение переходит в сами правила.

Список Broken Themes в WordPress с дочерней темой и сообщением: The parent theme is missing
К чему привела неверная строка Template: в нашем тесте. Мы написали Twenty-Twenty-One вместо имени папки twentytwentyone, и WordPress отметил дочернюю тему как сломанную.

FAQ

Вопросы

Почему style.css дочерней темы WordPress не загружается?

WordPress никогда не подключает style.css дочерней темы за вас. Он читает строку Template: в заголовке, настраивает откат к родительским шаблонам и на этом останавливается. Таблицу стилей нужно зарегистрировать самому — вызвать wp_enqueue_style внутри функции, привязанной к хуку wp_enqueue_scripts в functions.php дочерней темы.

Почему CSS дочерней темы перекрывается родительской темой?

Ваша дочерняя таблица стилей загружается раньше родительской, поэтому при одинаковой специфичности родительская выигрывает каждую ничью. Передайте настоящий handle родительской темы в массиве зависимостей wp_enqueue_style, чтобы дочерний файл загружался последним. Сначала посмотрите исходный код страницы и убедитесь, что дочерняя таблица стилей вообще есть в head.

Как узнать handle таблицы стилей родительской темы?

Считайте его из исходного кода страницы. WordPress выводит подключённые стили как тег link с id=«handle-css», поэтому возьмите этот id и отбросьте окончание -css. Можно также поискать по файлам родительской темы. Типичные примеры: astra-theme-css, generate-style-css и twenty-twenty-four-style.

Стоит ли до сих пор использовать @import в style.css дочерней темы?

Нет. Он работает, но медленно: браузер не может начать загрузку родительского CSS, пока не разберёт дочерний, поэтому два запроса идут последовательно, а не параллельно. Официальный справочник WordPress уже много лет советует так не делать. Подключайте дочернюю тему с зависимостью.

Чем отличаются get_template_directory_uri и get_stylesheet_directory_uri?

get_template_directory_uri() указывает на папку родительской темы, а get_stylesheet_directory_uri() — на папку активной дочерней темы. Перепутаете их — и подключите style.css родителя второй раз, так и не загрузив дочерний, а выглядит это ровно как дочерняя тема, у которой не работают стили.