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.
fonte
@import
, defina a folha de estilo do tema pai como uma dependência da sua própria folha de estilo .style.css
não seria incluído no mesmo local em que está agora. O pai inclui outros arquivos css que devem estar entrestyle.css
o css e o tema do meu filho.Respostas:
Você não precisa usar @import. É melhor não, na verdade. Usar uma abordagem enfileirada é provavelmente melhor ao redor.
Aqui está a parte relevante do código de vinte e treze:
Aqui está o que você faz no seu código:
Se o seu main.css precisar seguir o style.css dos pais, basta torná-lo dependente.
Agora, se você também tiver um B.css no filho, configure as dependências adequadamente:
Torne as dependências que você define para cada item realmente refletem o que realmente são essas dependências. Se o main.css deve vir depois do B.css, isso depende disso. Se o B.css deve vir após o style.css do pai, então B depende disso. O sistema de enfileiramento resolverá isso para você.
E se você não está usando o style.css da criança para nada, não precisa enfileirá-lo . Pode ser apenas um espaço reservado para armazenar as informações do cabeçalho do seu tema. Não está usando? Não carregue.
Além disso, o que exatamente você está fazendo é tão dependente de encomendar aqui? O CSS não se importa com a ordem de carregamento na maioria das situações. CSS é mais dependente da especificidade dos seletores. Se você deseja substituir algo, torne seu seletor mais específico. Pode vir em primeiro, último ou qualquer outro meio, o seletor mais específico sempre vence.
Editar
Lendo seus comentários e olhando mais de perto o código, vejo onde está o erro. O código de vinte e treze está enfileirando o "get_stylesheet_uri ()", que em um caso de tema filho, seria o arquivo style.css do tema filho, não o arquivo pai. É por isso que o @import funciona e mantém a mesma ordem (que, novamente, não importa tanto quanto você pensa).
Nesse caso, se você não quiser usar a importação, recomendo enfileirar o style.css do pai diretamente. Igual a:
O código no functions.php do tema filho é executado primeiro, para que o seu próprio wp_enqueue_scripts seja executado primeiro, e isso enfileirará o style.css do tema pai, que o tema pai não está fazendo sozinho (porque na verdade está enfileirando o style.css do seu filho). Ao não fazê-lo depender de nada, igual ao pai, ele simplesmente é colocado na saída corretamente. Observe que a ordem desse arquivo e do genericons.css não importa, porque o "estilo décimo treze" original não possui o genericons.css como uma dependência listada.
O style.css do seu próprio filho será carregado e, honestamente, é aqui que você deve colocar as alterações no tema filho, não em um main.css separado. Não há nada impedindo que você faça as alterações, mas não há motivo real para ter um arquivo css extra.
fonte
@import
não é o melhor caminho a percorrer. Por favor, consulte minha seção "editar" para obter informações mais precisas. Eu não tenho nenhuma necessidade específica em relação à encomenda de css. Eu simplesmente não quero modificar a ordem interna dos arquivos css do tema pai, o que pode causar problemas com a prioridade das regras css.Minha resposta anterior é excessivamente complicada e potencialmente não respeita a cadeia de dependência do tema pai (consulte a observação em outra resposta).
Aqui está outra tomada muito mais simples que deve funcionar muito melhor:
A idéia é simplesmente filtrar a chamada
get_stylesheet_uri()
no tema pai para retornar sua própria folha de estilo, em vez da tema filho. A folha de estilo do tema filho é enfileirada posteriormente no gancho de açãomy_theme_styles
.fonte
@import
versão antiga , sem nenhum impacto no desempenho. Haverá duas solicitações style.css separadas para o servidor 2) Essa resposta descarta toda a dependência juntos ... 3) Você pode verificar o queget_template_directory_uri
eget_template_stylesheet_uri
estão fazendo aqui: core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/... Novamente, não há necessidade para a maioria desse código.wp_enqueue_style
adiciona automaticamente uma string de consulta de bloqueio de cache ao URL que ele gera (por exemplo?ver=2013-07-18
) com base na versão do tema. Isso não foi feito por uma@import
declaração.Atenção
Esta solução não respeita as dependências do tema pai ! Alterar o nome do identificador do tema pai afeta a cadeia de dependências configuradas no tema pai. Veja minha outra resposta muito mais simples .
resposta original
Embora a resposta de Otto seja muito boa, acabei com isso nas funções do meu tema filho.php
Ele mantém os
style.css
números de pedido e versão do tema pai enquanto controla a versão do tema filhostyle.css
.fonte
[$parentNewHandle]
paraarray($parentNewHandle)
@import
método antigo também funciona, compare os dois métodos. Quanto à dependência do tema filho no tema pai, também não é necessário. O filhostyle.css
é sempre carregado após o pai, pelo menos nos meus testes. Amor para ser provado errado.