Kontekst
Zbudowałem motyw potomny na podstawie Twenty Thirteen, który działa całkiem dobrze. Po zaktualizowaniu motywu nadrzędnego do wersji 1.3 zauważyłem dziwne zachowanie w stylu, które było spowodowane buforowanym motywem nadrzędnym style.css.
Oto treść motywu mojego dziecka style.css(z pominięciem nagłówków)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Zatem motyw potomny style.cssnie robi nic poza importowaniem motywu macierzystego style.css.
Mam również inny plik css z dostosowaniami motywu podrzędnego, które umieszczam w kolejce tak 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);
Daje mi to bardzo ładny adres URL css: domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1zapewnia to, że arkusz stylów zostanie ponownie załadowany, gdy motyw potomny zostanie zaktualizowany.
Teraz problem
Instrukcja @import url('../twentythirteen/style.css');jest całkowicie niezależna od podstawowej wersji motywu nadrzędnego. W rzeczywistości motyw nadrzędny można zaktualizować bez aktualizacji motywu podrzędnego, ale przeglądarki nadal będą używać starych wersji z pamięci podręcznej ../twentythirteen/style.css.
Odpowiedni kod w Twenty Thirteen, który wymienia 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' );
Mogę wymyślić kilka sposobów rozwiązania tego problemu, ale żaden z nich nie jest naprawdę zadowalający:
Aktualizuj motyw podrzędny za każdym razem, gdy motyw nadrzędny jest aktualizowany, aby zmienić ciąg wersji w
style.css(np@import url('../twentythirteen/style.css?ver=NEW_VERSION');.). Tworzy to niepotrzebne i irytujące połączenie między wersją motywu nadrzędnego a dzieckiem.W moich dziecka
functions.php, 1)wp_dequeue_styledołączony dziecko motywustyle.cssi 2) dominującym tematem jest bezpośrednio z wersją ciąg. Zmienia to kolejność css w kolejce w motywie nadrzędnym.wp_enqueue_stylestyle.cssUżyj
style_loader_tagfiltru, aby zmodyfikować wygenerowany<link>znacznik cssstyle.cssi zmodyfikować ścieżkę, aby wskazywała bezpośrednio na motyw nadrzędnystyle.cssZ łańcuchem wersji. Wydaje się raczej niejasne w przypadku tak powszechnej potrzeby (niszczenie pamięci podręcznej).Zrzuć motyw nadrzędny do motywu
style.cssmojego potomkastyle.css. To samo co (1), ale trochę szybciej.Niech motyw mojego dziecka
style.cssbędzie dowiązaniem symbolicznym do motywu nadrzędnegostyle.css. To wydaje się dość hackerskie ...
Czy coś przeoczyłem? Jakieś sugestie?
edytować
Dodano genericicons.cssi ie.cssstylizuję arkusze w motywie nadrzędnym, aby wyjaśnić, dlaczego nie mogę zmienić instrukcji @importcss wp_enqueue_stylew moim motywie potomnym. Obecnie z @importoświadczeniem w motywie mojego dziecka style.cssmam następującą kolejność na wygenerowanych stronach:
- twentythirteen / genericons / genericons.css -> kolejkowane przez motyw nadrzędny
- child-theme / style.css -> kolejkowane przez temat nadrzędny, @imports twentythirteen / style.css
- twentythirteen / css / ie.css -> kolejkowane przez motyw nadrzędny
- child-theme / css / main.css -> kolejkowane przez motyw potomny
Jeśli uznaję rodzic style.cssza zależność main.css, będzie to:
- twentythirteen / genericons / genericons.css -> kolejkowane przez motyw nadrzędny
- child-theme / style.css -> puste, kolejkowane przez motyw nadrzędny
- twentythirteen / css / ie.css -> kolejkowane przez motyw nadrzędny
- twentythirteen / style.css -> kolejkowane przez motyw potomny jako zależność main.css
- child-theme / css / main.css -> kolejkowane przez motyw potomny
Pamiętaj, że ie.css jest teraz dołączony przed motywem nadrzędnym style.css. Nie chcę zmieniać kolejności kolejkowania plików css tematu nadrzędnego, ponieważ nie mogę zakładać, że nie spowoduje to problemów z priorytetem reguł css.
style.cssnie zostanie uwzględniony w tym samym miejscu, co teraz. Nadrzędny zawiera inne pliki css, które muszą znajdować się między css jego style.cssi mojego podrzędnego motywu.
@import, zamiast tego ustaw arkusz stylów motywu nadrzędnego jako zależność własnego arkusza stylów .