Contexto
Eu construí um tema infantil baseado no Twenty Treze, que funciona muito bem. Após atualizar o tema pai para a versão 1.3, notei um comportamento estranho com o estilo causado por um tema pai em cache style.css
.
Aqui está o conteúdo dos temas do meu filho style.css
(omitindo cabeçalhos)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Portanto, o tema filho style.css
nada mais faz do que importar o tema pai style.css
.
Eu também tenho outro arquivo css com as personalizações do meu tema filho, as quais coloco assim 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);
Isso me fornece um URL de CSS muito bom como este: domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1
que garante que a folha de estilos seja recarregada quando o tema filho for atualizado.
Agora o problema
A declaração @import url('../twentythirteen/style.css');
é completamente independente da versão do tema pai subjacente. De fato, o tema pai pode ser atualizado sem atualizar o tema filho, mas os navegadores ainda usarão as versões em cache do antigo ../twentythirteen/style.css
.
Código relevante no Twenty Treze que enfileira o 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' );
Posso pensar em algumas maneiras de resolver esse problema, mas nenhuma é realmente satisfatória:
Atualizar o tema filho sempre que o tema pai for atualizado para alterar uma sequência de versão em
style.css
(por exemplo@import url('../twentythirteen/style.css?ver=NEW_VERSION');
). Isso cria um link desnecessário e irritante entre a versão do tema pai e o filho.No meu filho
functions.php
, 1)wp_dequeue_style
o tema filho incluídostyle.css
e 2)wp_enqueue_style
o tema paistyle.css
diretamente com a string de versão. Isso atrapalha a ordem do CSS na fila no tema pai.Use o
style_loader_tag
filtro para modificar a<link>
tag css geradastyle.css
e modificar o caminho para apontar diretamente para a sequência WITH version de um tema paistyle.css
. Parece bastante obscuro para uma necessidade tão comum (bloqueio de cache).Despejar o tema pai no tema do
style.css
meu filhostyle.css
. O mesmo que (1) realmente, mas um pouco mais rápido.Faça com que meu tema filho
style.css
seja um link simbólico para o tema paistyle.css
. Isso parece muito hackish ...
Perdi alguma coisa? Alguma sugestão?
editar
Adicionadas genericicons.css
e ie.css
folhas de estilo no tema pai para esclarecer por que não posso alterar a @import
instrução css para wp_enqueue_style
no meu tema filho. Atualmente, com uma @import
declaração no tema do meu filho style.css
, tenho essa ordem nas páginas geradas:
- twentythteenteen / genericons / genericons.css -> enfileirado pelo tema pai
- child-theme / style.css -> enfileirado pelo tema pai, @imports twentythirteen / style.css
- décimo terceiro / css / ie.css -> enfileirado pelo tema pai
- child-theme / css / main.css -> enfileirado pelo tema filho
Se eu enfileirar os pais style.css
como uma dependência de main.css
, isso se tornará:
- twentythteenteen / genericons / genericons.css -> enfileirado pelo tema pai
- child-theme / style.css -> vazio, enfileirado pelo tema pai
- décimo terceiro / css / ie.css -> enfileirado pelo tema pai
- décimo terceiro / style.css -> enfileirado pelo tema filho como dependência do main.css
- child-theme / css / main.css -> enfileirado pelo tema filho
Observe que o arquivo ie.css agora está incluído antes do tema principal style.css
. Não quero alterar a ordem de enfileiramento dos arquivos css do tema pai, porque não posso presumir que isso não causará problemas com a prioridade das regras de css.
style.css
não seria incluído no mesmo local em que está agora. O pai inclui outros arquivos css que devem estar entre style.css
o css e o tema do meu filho.
@import
, defina a folha de estilo do tema pai como uma dependência da sua própria folha de estilo .