Kontext
Ich habe ein Kinderthema basierend auf Twenty Thirteen erstellt, was sehr gut funktioniert. Nachdem ich das übergeordnete Thema auf Version 1.3 aktualisiert hatte, bemerkte ich ein merkwürdiges Verhalten mit dem Stil, das durch das zwischengespeicherte übergeordnete Thema verursacht wurde style.css.
Hier ist der Inhalt des Themas meines Kindes style.css(ohne Überschriften)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Das Kinderthema style.cssimportiert also nur das Elternthema style.css.
Ich habe auch eine andere CSS-Datei mit den Anpassungen meines Kinderthemas, die ich wie folgt einreihe 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);
Dies gibt mir eine sehr schöne CSS-URL domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1, die sicherstellt, dass das Stylesheet neu geladen wird, wenn das untergeordnete Thema aktualisiert wird.
Nun das Problem
Die Anweisung @import url('../twentythirteen/style.css');ist völlig unabhängig von der Version des zugrunde liegenden übergeordneten Themas. Tatsächlich kann das übergeordnete Design aktualisiert werden, ohne dass das untergeordnete Design aktualisiert wird. Browser verwenden jedoch weiterhin zwischengespeicherte Versionen des alten Designs ../twentythirteen/style.css.
Relevanter Code in Dreizehnundzwanzig, der Folgendes in die Warteschlange stellt 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' );
Ich kann mir ein paar Möglichkeiten vorstellen, um dieses Problem zu lösen, aber keine ist wirklich zufriedenstellend:
Aktualisieren Sie mein untergeordnetes Thema jedes Mal, wenn das übergeordnete Thema aktualisiert wird, um eine Versionszeichenfolge in
style.css(z@import url('../twentythirteen/style.css?ver=NEW_VERSION');. B. ) zu ändern . Dies schafft eine unnötige und ärgerliche Verbindung zwischen der übergeordneten Designversion und dem untergeordneten Design.In meinem Kind
functions.php1)wp_dequeue_styledas enthaltene Kind-Themastyle.cssund 2)wp_enqueue_styledas Eltern- Themastyle.cssdirekt mit Versionszeichenfolge. Dadurch wird die Reihenfolge der in die Warteschlange gestellten CSS-Dateien im übergeordneten Thema durcheinander gebracht.Verwenden Sie den
style_loader_tagFilter, um das generierte CSS-<link>Tag für zustyle.cssändern, und ändern Sie den Pfad so, dass er direkt auf die WITH-Versionszeichenfolge des übergeordneten Themasstyle.cssverweist. Scheint für solch ein allgemeines Bedürfnis eher undurchsichtig (Cache-Busting).Gib das Thema
style.cssmeiner Eltern in das meines Kindesstyle.css. Wie (1), aber etwas schneller.style.cssLassen Sie das Thema meines Kindes ein Symlink zum Thema des Elternteils seinstyle.css. Das scheint ziemlich hackisch ...
Habe ich etwas verpasst Irgendwelche Vorschläge?
bearbeiten
Hinzugefügt genericicons.cssund ie.cssStylesheets im übergeordneten Thema, um zu verdeutlichen, warum ich die @importCSS-Anweisung wp_enqueue_stylein meinem untergeordneten Thema nicht ändern kann . Derzeit habe ich mit einer @importAussage in meinem Kinderthema style.cssdiese Reihenfolge in generierten Seiten:
- Dreizehnundzwanzig / genericons / genericons.css -> Eingereiht nach übergeordnetem Thema
- child-theme / style.css -> nach übergeordnetem Thema in die Warteschlange gestellt, @imports twentythirteen / style.css
- einundzwanzig / css / ie.css -> nach übergeordnetem Thema in die Warteschlange gestellt
- child-theme / css / main.css -> nach untergeordnetem Thema in die Warteschlange gestellt
Wenn ich die Eltern style.cssals Abhängigkeit von in die Warteschlange einreihe main.css, wird dies zu:
- Dreizehnundzwanzig / genericons / genericons.css -> Eingereiht nach übergeordnetem Thema
- child-theme / style.css -> leer, eingereiht nach übergeordnetem Thema
- einundzwanzig / css / ie.css -> nach übergeordnetem Thema in die Warteschlange gestellt
- twentythirteen / style.css -> nach untergeordnetem Thema als Abhängigkeit von main.css in die Warteschlange gestellt
- child-theme / css / main.css -> nach untergeordnetem Thema in die Warteschlange gestellt
Beachten Sie, dass ie.css jetzt vor dem übergeordneten Thema enthalten ist style.css. Ich möchte die Reihenfolge der Warteschlangen in den CSS-Dateien des übergeordneten Themas nicht ändern, da ich nicht davon ausgehen kann, dass dies keine Probleme mit der Priorität der CSS-Regeln verursacht.
style.cssnicht an der Stelle eingefügt, an der es sich gerade befindet. Das übergeordnete Element enthält andere CSS-Dateien, die zwischen style.cssdem zugehörigen CSS und dem CSS meines untergeordneten Themas liegen müssen.
@import, stattdessen das Stylesheet des übergeordneten Themas als Abhängigkeit von Ihrem eigenen Stylesheet festlegen .