@import стилей Дочерней темы через PHP
Использование дочерних тем в WordPress — правильный способ изменить существующую тему, однако директива CSS @import работает медленно, поэтому её стоит избегать.
200мс уходит на загрузку файла стилей дочерней темы и 200мс на загрузку CSS родительской темы. И эта последовательность неизменна. А у современных браузеров для загрузки обоих файлов должно уходить примерно 200мс, из-за наличия параллельной загрузки, но для этого оба файла должны начать загружаться в одно время. Однако из-за вложенности вызова одного в дрогой этого не может произойти никогда...
Читайте также: Подробно о Дочерних темах.
Выдержка из Google:
Браузер должен загрузить, разобрать и выполнить first.css до того, как обнаружится, что нужно загрузить ещё и second.css
Это означает, что с использованием @import вместо 200мс у браузера всегда уйдет 400мс для загрузки обоих файлов.
Вот типичный style.css дочерней темы:
/** * Theme Name: My Child Theme * Template: parent-theme */ @import url(../parent-theme/style.css); /* CSS Стили дочерней темы */ .foo{ // styles }
@import! через php
Можно отказаться от использования @import через возможности файла functions.php и функцию wp_enqueue_style():
// Быстрее чем @import add_action( 'wp_enqueue_scripts', 'my_child_theme_scripts' ); function my_child_theme_scripts() { wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); }
Чтобы понять как это работает, давайте посмотрим на последовательность загрузки и подключения стилей:
-
Сначала подключается functions.php дочерней темы. В нем мы ставим в очередь style.css родительской темы.
- Затем подключается functions.php родительской темы. В нем ставится в очередь style.css дочерней темы.
В результате, в HTML код страницы подключатся стили в нужном порядке:
<link rel='stylesheet' id='parent-theme-css' href='http://example.com/wp-content/themes/parent-theme/style.css' type='text/css' /> <link rel='stylesheet' id='child-theme-css' href='http://example.com/wp-content/themes/child-theme/style.css' type='text/css' />
Т.е. тут нет необходимости учитывать зависимость стилей дочерней темы от родительской — нужный порядок будет достигнут автоматически.
Готово!
Если файл стилей дочерней темы не подключится автоматически из родительской темы
Это значит что родительская тема написана не грамотно и стоит задумать о смене темы. Но если тему менять не вариант, то можно попробовать подключить стили дочерней темы в дочернем functions.php с учетом зависимости от родительских стилей.
Для этого нужно открыть файл functions.php родительской темы и найти там, где подключается файл стилей. Скорее всего тема подключает этот файл без учета дочерней темы, т.е. тема не поддерживает дочерние темы, т.е. не использует функцию get_stylesheet_uri(), а использует get_template_directory_uri(), примерно так:
wp_enqueue_style( 'mytheme-style', get_template_directory_uri() .'/style.css' );
Нам нужно указать ID mytheme-style
в зависимости при подключении дочернего файла стилей. Получится что дочерний файл стилей будет зависеть от mytheme-style и будет подключен только после того, как подключится родительский - mytheme-style
.
Таким образом, в файле functions.php дочерней темы нужно использовать след. код:
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' ); function theme_enqueue_styles(){ wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', ['mytheme-style'] ); }
В результате в HTML подключатся стили в нужном порядке.
Зависимости от других файлов темы
Например, в родительской теме файл обнуления (сброса) стилей - normalize.css подключается отдельно, а он должен подключиться в самом начале, до остальных стилей. Эту зависимость нужно сохранить.
Допустим в functions.php родительской темы, мы имеем такой код:
add_action( 'wp_enqueue_scripts', 'my_theme_scripts' ); function my_theme_scripts() { // сброс стилей, до основных стилей wp_enqueue_style( 'normalize', get_template_directory_uri() . '/css/normalize.css' ); // стили темы (дочерней или текущей) wp_enqueue_style( 'child-style', get_stylesheet_uri() ); }
Теперь, если в дочерней мы подключим стили родительской темы:
// Быстрее чем @import add_action( 'wp_enqueue_scripts', 'my_child_theme_scripts' ); function my_child_theme_scripts() { wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); }
То в результате мы получим следующий порядок в HTML:
- parent-style
- normalize
- child-style
А нужно:
- normalize
- parent-style
- child-style
Исправить это можно указав зависимость при подключении parent-style в дочерней теме. Зависимость нужно указать от ID normalize. Т.е. в дочерней теме нам нужно подключить стили родительской темы:
// не так wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); // а так wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css', ['normalize'] );
В результате сразу после normalize.css будут подключены стили родительской темы, а затем стили дочерней. То что нужно!
Такую же зависимость можно указать для шрифтов и других css стилей которые должны подключиться до основных стилей.