Contesto
Ho creato un tema per bambini basato su Twenty Thirteen che funziona abbastanza bene. Dopo aver aggiornato il tema principale alla versione 1.3, ho notato un comportamento strano con lo stile causato da un tema principale memorizzato nella cache style.css
.
Ecco il contenuto del tema di mio figlio style.css
(omettendo le intestazioni)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Quindi il tema figlio style.css
non fa altro che importare il tema principale style.css
.
Ho anche un altro file CSS con le personalizzazioni del tema di mio figlio che accodero così in 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);
Questo mi dà un URL CSS molto bello come questo: domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1
questo assicura che il foglio di stile venga ricaricato quando il tema figlio viene aggiornato.
Ora il problema
L'istruzione @import url('../twentythirteen/style.css');
è completamente indipendente dalla versione del tema genitore sottostante. In effetti, il tema principale può essere aggiornato senza aggiornare il tema secondario, ma i browser useranno comunque le versioni memorizzate nella cache del vecchio ../twentythirteen/style.css
.
Codice rilevante in Twenty Thirteen che accoda il 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 pensare ad alcuni modi per risolvere questo problema, ma nessuno è davvero soddisfacente:
Aggiorna il tema di mio figlio ogni volta che il tema principale viene aggiornato per modificare una stringa di versione in
style.css
(ad es@import url('../twentythirteen/style.css?ver=NEW_VERSION');
.). Ciò crea un collegamento non necessario e fastidioso tra la versione del tema padre e il figlio.In mio figlio
functions.php
, 1)wp_dequeue_style
il tema figlio inclusostyle.css
e 2)wp_enqueue_style
il tema genitore èstyle.css
direttamente CON stringa di versione. Questo incasina l'ordine dei CSS in coda nel tema principale.Utilizzare il
style_loader_tag
filtro per modificare il<link>
tag css generato perstyle.css
e modificare il percorso in modo che punti direttamente al tema padrestyle.css
CON una stringa di versione. Sembra piuttosto oscuro per un bisogno così comune (busting della cache).Scarica il tema principale
style.css
in quello di mio figliostyle.css
. Lo stesso di (1) in realtà, ma un po 'più veloce.Fai in modo che il tema di mio figlio
style.css
sia un collegamento simbolico al tema principalestyle.css
. Questo sembra abbastanza hacker ...
Ho perso qualcosa? Eventuali suggerimenti?
modificare
Aggiunti genericicons.css
e ie.css
fogli di stile nel tema principale per chiarire perché non riesco a cambiare l' @import
istruzione css wp_enqueue_style
nel tema mio figlio. Attualmente, con una @import
dichiarazione nel tema di mio figlio style.css
, ho questo ordine nelle pagine generate:
- venti tredici / genericons / genericons.css -> accodati dal tema principale
- child-theme / style.css -> accodato dal tema principale, @imports twentythirteen / style.css
- venti tredici / css / ie.css -> accodato dal tema principale
- tema-bambino / css / main.css -> accodato dal tema figlio
Se accoda i genitori style.css
come dipendenza di main.css
, questo diventerà:
- venti tredici / genericons / genericons.css -> accodati dal tema principale
- child-theme / style.css -> vuoto, accodato dal tema principale
- venti tredici / css / ie.css -> accodato dal tema principale
- twentythirteen / style.css -> accodato dal tema figlio come dipendenza di main.css
- tema-bambino / css / main.css -> accodato dal tema figlio
Nota che ie.css è ora incluso prima del tema principale style.css
. Non voglio cambiare l'ordine di accodamento dei file CSS del tema principale perché non posso presumere che ciò non causerà problemi con la priorità delle regole CSS.
style.css
non verrebbe incluso nello stesso posto in cui è ora. Il genitore include altri file css che devono trovarsi tra i suoi style.css
css e quelli di mio figlio.
@import
, imposta invece il foglio di stile del tema principale come dipendenza del tuo foglio di stile .