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.
źródło
@import
, zamiast tego ustaw arkusz stylów motywu nadrzędnego jako zależność własnego arkusza stylów .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 jegostyle.css
i mojego podrzędnego motywu.Odpowiedzi:
Nie musisz używać @import. Właściwie najlepiej tego nie robić. Korzystanie z kolejkowania jest prawdopodobnie lepsze dookoła.
Oto odpowiednia część kodu dwudziestego:
Oto, co robisz w kodzie:
Jeśli twój main.css musi być zgodny ze stylem.css rodzica, po prostu uzależnij go od tego.
Teraz, jeśli masz również B.css w dziecku, to odpowiednio skonfiguruj zależności:
Spraw, aby zależności zdefiniowane dla każdego elementu odzwierciedlały rzeczywiste zależności. Jeśli main.css musi pojawić się po B.css, to zależy od tego. Jeśli B.css musi wystąpić po stylu style.css rodzica, B zależy od tego. System kolejki załatwi to za ciebie.
A jeśli tak naprawdę nie używasz stylu child.css do niczego, to nie musisz go kolejkować . Może to być tylko symbol zastępczy do przechowywania informacji nagłówka motywu. Nie używasz tego? Nie ładuj tego.
Co dokładnie robisz, tak bardzo zależy od zamówienia tutaj? CSS nie dba o porządek ładowania w większości sytuacji. CSS jest bardziej zależny od specyficzności selektorów. Jeśli chcesz coś przesłonić, sprecyzuj selektor. Może to być pierwsze, ostatnie lub cokolwiek pomiędzy, bardziej szczegółowy selektor zawsze wygrywa.
Edytować
Czytając twoje komentarze i przyglądając się bliżej kodowi, widzę, gdzie jest błąd. Dwudziesty trzynasty kod kolejkuje „get_stylesheet_uri ()”, który w przypadku motywu podrzędnego byłby plikiem style.css motywu podrzędnego, a nie plikiem nadrzędnym. Właśnie dlatego @import działa i zachowuje tę samą kolejność (co znowu nie ma większego znaczenia, niż myślisz).
W takim przypadku, jeśli nie chcesz używać importu, zaleciłbym bezpośrednie umieszczenie w kolejce style.css rodzica. Tak jak:
Kod w funkcjach motywu podrzędnego jest uruchamiany jako pierwszy, więc najpierw uruchomią się twoje własne skrypty wp_enqueue_script, co spowoduje kolejkowanie style.css motywu nadrzędnego, którego sam motyw nadrzędny nie wykonuje (ponieważ w rzeczywistości kolejkuje style.css Twojego dziecka). Nie uzależniając go od niczego, tak jak rodzic, wtedy po prostu zostaje poprawnie wstawiony do wyniku. Zauważ, że kolejność tego pliku i pliku genericons.css nie ma znaczenia, ponieważ w oryginalnym stylu „twentythirteen” nie ma wymienionej zależności genericons.css.
Załaduje się style.css własnego dziecka, i szczerze mówiąc, tutaj należy umieścić zmiany dla motywu potomnego, a nie w osobnym pliku main.css. Nic nie stoi na przeszkodzie, aby wprowadzić tam zmiany, ale nie ma żadnego powodu, aby mieć dodatkowy plik css.
źródło
@import
nie jest to najlepsza droga. Proszę zobaczyć moją sekcję „edycja”, aby uzyskać bardziej szczegółowe informacje. Nie mam żadnych szczególnych potrzeb dotyczących zamawiania css. Po prostu nie chcę modyfikować wewnętrznej kolejności plików css motywu nadrzędnego, co może powodować problemy z priorytetem reguł css.Moja poprzednia odpowiedź jest zbyt skomplikowana i potencjalnie nie szanuje łańcucha zależności motywu nadrzędnego (patrz uwaga w innej odpowiedzi).
Oto kolejne, znacznie prostsze podejście, które powinno działać znacznie lepiej:
Chodzi o to, aby po prostu odfiltrować wywołanie
get_stylesheet_uri()
w motywie nadrzędnym, aby zwrócić własny arkusz stylów zamiast motywu potomnego. Arkusz stylów motywu podrzędnego jest następnie umieszczany w kolejce w haku akcjimy_theme_styles
.źródło
@import
wersji, bez żadnego wpływu na wydajność, będą dwa osobne żądania style.css do serwera 2) Ta odpowiedź porzuca całą zależność razem ... 3) Możesz sprawdzić, coget_template_directory_uri
iget_template_stylesheet_uri
robisz tutaj: core.trac.wordpress.org/browser/tags/4.8/src/wp-include/... Ponownie, nie potrzebujesz większości tego kodu.wp_enqueue_style
automatycznie dodaje ciąg zapytania o pomijanie pamięci podręcznej do generowanego adresu URL (np.?ver=2013-07-18
) na podstawie wersji motywu. Tego nie uczyniło@import
oświadczenie.ostrzeżenie
To rozwiązanie nie uwzględnia zależności motywu nadrzędnego ! Zmiana nazwy uchwytu kompozycji nadrzędnej wpływa na łańcuch zależności ustawiony w kompozycji nadrzędnej. Zobacz moją znacznie prostszą inną odpowiedź .
oryginalna odpowiedź
Chociaż odpowiedź Otto jest całkiem dobra, skończyłem z tym w funkcjach motywu mojego dziecka. Php
Utrzymuje
style.css
numery porządkowe i numery wersji nadrzędnych , kontrolując jednocześnie wersję motywu podrzędnegostyle.css
.źródło
[$parentNewHandle]
naarray($parentNewHandle)
@import
metoda działa równie dobrze, porównaj obie metody. Jeśli chodzi o zależność motywu potomnego od motywu macierzystego, nie ma takiej potrzeby. Dzieckostyle.css
jest zawsze ładowane po rodzicu, przynajmniej z moich testów. Uwielbiam udowodnić, że się mylą.