контекст
Я построил детскую тему, основанную на Двадцать тринадцать, которая работает довольно хорошо. После обновления родительской темы до версии 1.3 я заметил странное поведение со стилем, вызванным кэшированной родительской темой style.css
.
Вот содержание моей дочерней темы style.css
(без заголовков)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Таким образом, дочерняя тема не style.css
делает ничего, кроме импорта родительской темы style.css
.
У меня также есть другой файл css с настройками моей дочерней темы, который я ставлю в очередь следующим образом functions.php
:
// Enqueue parent theme's style.css (faster than using @import in our style.css)
$themeVersion = wp_get_theme()->get('Version');
// Enqueue child theme customizations
wp_enqueue_style('child_main', get_stylesheet_directory_uri() . '/css/main.css',
null, $themeVersion);
Это дает мне очень хороший URL-адрес CSS, как это: он domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1
гарантирует, что таблица стилей перезагружается при обновлении дочерней темы.
Теперь проблема
Заявление @import url('../twentythirteen/style.css');
полностью не зависит от версии основной родительской темы. Фактически, родительская тема может быть обновлена без обновления дочерней темы, но браузеры будут по-прежнему использовать старые версии, сохраненные в кэше ../twentythirteen/style.css
.
Соответствующий код в Двадцать тринадцать, который ставит в очередь style.css
:
function twentythirteen_scripts_styles() {
// ...
// Add Genericons font, used in the main stylesheet.
wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.03' );
// Loads our main stylesheet.
wp_enqueue_style( 'twentythirteen-style', get_stylesheet_uri(), array(), '2013-07-18' );
// Note usage of get_stylesheet_uri() which actually enqueues child-theme/style.css
// Loads the Internet Explorer specific stylesheet.
wp_enqueue_style( 'twentythirteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentythirteen-style' ), '2013-07-18' );
}
add_action( 'wp_enqueue_scripts', 'twentythirteen_scripts_styles' );
Я могу придумать несколько способов решения этой проблемы, но ни один из них не является действительно удовлетворительным:
Обновляйте мою дочернюю тему каждый раз, когда обновляется родительская тема, чтобы изменить строку версии в
style.css
(например@import url('../twentythirteen/style.css?ver=NEW_VERSION');
). Это создает ненужную и раздражающую связь между версией родительской темы и дочерней.В моем ребенке
functions.php
, 1)wp_dequeue_style
включенный ребенок ТЕМАstyle.css
и 2) родительская тема это непосредственна строка версии. Это портит порядок очереди CSS в родительской теме.wp_enqueue_style
style.css
Используйте
style_loader_tag
фильтр, чтобы изменить сгенерированный<link>
тег cssstyle.css
и изменить путь так, чтобы он указывал непосредственно на строку WITH версии родительской темыstyle.css
. Кажется довольно неясным для такой распространенной необходимости (перебора кеша).Дамп родительской темы
style.css
в моей дочерней темеstyle.css
. То же, что (1) на самом деле, но немного быстрее.Сделайте мою дочернюю тему
style.css
символической ссылкой на родительскую темуstyle.css
. Это кажется довольно хакерским ...
Я что-то пропустил? Какие-либо предложения?
редактировать
Добавлены genericicons.css
и ie.css
таблицы стилей в родительской теме , чтобы выяснить , почему я не могу изменить @import
заявление CSS , чтобы wp_enqueue_style
в моей детской теме. В настоящее время с @import
заявлением в моей дочерней теме style.css
, у меня есть этот порядок на сгенерированных страницах:
- fiftythirteen / genericons / genericons.css -> в родительской теме
- child-theme / style.css -> добавленный в родительскую тему, @imports fiftythirteen / style.css
- двадцать тринадцать / css / ie.css -> в родительской теме
- child-theme / css / main.css -> добавлена в дочернюю тему
Если я поставлю родителей style.css
в зависимость main.css
, это станет:
- fiftythirteen / genericons / genericons.css -> в родительской теме
- child-theme / style.css -> пусто, поставлено в очередь родительской темой
- двадцать тринадцать / css / ie.css -> в родительской теме
- fiftythirteen / style.css -> добавлена в дочернюю тему как зависимость от main.css
- child-theme / css / main.css -> добавлена в дочернюю тему
Обратите внимание, что ie.css теперь включен перед темой родительской темы style.css
. Я не хочу менять порядок постановки в очередь css-файлов родительской темы, потому что не могу предположить, что это не вызовет проблем с приоритетом правил css.
источник
@import
, вместо этого установите таблицу стилей родительской темы как зависимость от вашей собственной таблицы стилей .style.css
не будет включена в то же место, что и сейчас. Родитель включает в себя другие файлы CSS, которые должны находиться между егоstyle.css
и моей дочерней темой CSS.Ответы:
Вам не нужно использовать @import. На самом деле это лучше не делать. Использование поставленного в очередь подхода, вероятно, лучше всего вокруг.
Вот соответствующая часть двадцать тринадцатого кода:
Вот что вы делаете в своем коде:
Если ваш main.css должен следовать за родительским style.css, то вы просто делаете его зависимым от этого.
Теперь, если у вас также есть B.css в дочернем элементе, вы устанавливаете зависимости соответствующим образом:
Сделайте зависимости, которые вы определяете для каждого элемента, фактически отражающими, каковы эти зависимости на самом деле. Если main.css должен идти после B.css, то это зависит от него. Если B.css должен идти после style.css родителя, то B зависит от этого. Система постановки в очередь разберутся за вас.
И если вы не используете дочерний стиль style.css ни для чего, вам не нужно ставить его в очередь . Это может быть просто заполнитель для хранения информации заголовка вашей темы. Не используете это? Не загружайте это.
Кроме того, что именно вы делаете, это так зависит от заказа здесь? CSS не заботится о порядке загрузки в большинстве ситуаций. CSS больше зависит от специфики селекторов. Если вы хотите переопределить что-то, вы сделаете свой селектор для этого более конкретным. Он может быть первым, последним или чем-то промежуточным, более конкретный селектор всегда побеждает.
редактировать
Читая ваши комментарии и присматриваясь к коду, я вижу, в чем здесь ошибка. Двадцать тринадцать кодов ставит в очередь функцию «get_stylesheet_uri ()», которая в случае дочерней темы будет файлом style.css вашей дочерней темы, а не файлом родительского. Вот почему @import работает и сохраняет тот же порядок (что, опять же, не так важно, как вы думаете).
В этом случае, если вы не хотите использовать импорт, я бы порекомендовал поставить в очередь родительский файл style.css напрямую. Вот так:
Сначала запускается код в functions.php дочерней темы, поэтому сначала запускается собственный wp_enqueue_scripts, и это ставит в очередь родительскую тему style.css, которую родительская тема не выполняет сама (потому что она фактически ставит в очередь style.css вашего ребенка). Не заставляя его зависеть ни от чего, так же как и от родителя, он просто корректно помещается в вывод. Обратите внимание, что порядок этого файла и genericons.css не имеет значения, потому что исходный «стиль в стиле двадцать тринадцати» не имеет genericons.css в качестве указанной зависимости.
Загрузится style.css вашего собственного ребенка, и, честно говоря, именно здесь вы должны поместить свои изменения для дочерней темы, а не в отдельный main.css. Ничто не мешает вам внести ваши изменения, но нет никакой реальной причины иметь дополнительный файл CSS.
источник
@import
это не лучший путь. Пожалуйста, смотрите мой раздел "редактировать" для более точной информации. У меня нет особых требований в отношении заказа CSS. Я просто не хочу изменять внутренний порядок css-файлов родительской темы, что может вызвать проблемы с приоритетом css-правил.Мой предыдущий ответ слишком сложен и потенциально не учитывает цепочку зависимостей родительской темы (см. Примечание в другом ответе).
Вот еще один гораздо более простой способ, который должен работать намного лучше:
Идея состоит в том, чтобы просто отфильтровать вызов
get_stylesheet_uri()
в родительской теме, чтобы получить собственную таблицу стилей вместо дочерней темы. Таблица стилей дочерней темы затем ставится в очередь в хуке действияmy_theme_styles
.источник
@import
версии, никакого влияния на производительность вообще не будет, будет два отдельных запроса style.css к серверу 2) Этот ответ отбрасывает всю зависимость целиком вместе ... 3) Вы можете проверить, чтоget_template_directory_uri
иget_template_stylesheet_uri
делаете здесь: core.trac.wordpress.org/browser/tags/4.8/src/wp-include/… Опять же, большая часть этого кода не требуется.wp_enqueue_style
автоматически добавляет строку запроса на удаление кэша к URL-адресу, который она генерирует (например?ver=2013-07-18
) в зависимости от версии темы. Это не сделано@import
заявлением.предупреждение
Это решение не учитывает зависимости родительской темы ! Изменение имени дескриптора родительской темы влияет на цепочку зависимостей, установленных в родительской теме. Смотрите мой гораздо более простой ответ .
оригинальный ответ
Хотя ответ Отто довольно хороший, я закончил с этим в функциях моей дочерней темы.
Он поддерживает
style.css
порядок и номера версий родительской темы, одновременно контролируя версию дочерней темыstyle.css
.источник
[$parentNewHandle]
наarray($parentNewHandle)
@import
метод работает так же хорошо, пожалуйста, сравните оба метода. Что касается зависимости дочерней темы от родительской темы, то в этом также нет необходимости. Ребенокstyle.css
всегда загружается после родителя, по крайней мере, из моих тестов. Люблю быть ошибочным.