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.css
nie 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.1
zapewnia 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_style
dołączony dziecko motywustyle.css
i 2) dominującym tematem jest bezpośrednio z wersją ciąg. Zmienia to kolejność css w kolejce w motywie nadrzędnym.wp_enqueue_style
style.css
Użyj
style_loader_tag
filtru, aby zmodyfikować wygenerowany<link>
znacznik cssstyle.css
i zmodyfikować ścieżkę, aby wskazywała bezpośrednio na motyw nadrzędnystyle.css
Z łańcuchem wersji. Wydaje się raczej niejasne w przypadku tak powszechnej potrzeby (niszczenie pamięci podręcznej).Zrzuć motyw nadrzędny do motywu
style.css
mojego potomkastyle.css
. To samo co (1), ale trochę szybciej.Niech motyw mojego dziecka
style.css
będzie dowiązaniem symbolicznym do motywu nadrzędnegostyle.css
. To wydaje się dość hackerskie ...
Czy coś przeoczyłem? Jakieś sugestie?
edytować
Dodano genericicons.css
i ie.css
stylizuję arkusze w motywie nadrzędnym, aby wyjaśnić, dlaczego nie mogę zmienić instrukcji @import
css wp_enqueue_style
w moim motywie potomnym. Obecnie z @import
oświadczeniem w motywie mojego dziecka style.css
mam 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.css
za 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.css
nie 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.css
i mojego podrzędnego motywu.
@import
, zamiast tego ustaw arkusz stylów motywu nadrzędnego jako zależność własnego arkusza stylów .