Contexto
Construí un tema infantil basado en Twenty Thirteen que funciona bastante bien. Después de actualizar el tema principal a la versión 1.3, noté un comportamiento extraño con el estilo causado por el style.css
de un tema principal en caché.
Aquí está el contenido de style.css
del tema de mi hijo (omitiendo los encabezados)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Por lo tanto, style.css
del tema secundario no hace nada más que importar el style.css
del tema principal.
También tengo otro archivo css con las personalizaciones del tema de mi hijo, que encolado como en 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);
Esto me da una URL de css muy agradable como esta: domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1
que se asegura de que la hoja de estilo se vuelva a cargar cuando se actualice el tema secundario.
Ahora el problema
La declaración @import url('../twentythirteen/style.css');
es completamente independiente de la versión del tema principal subyacente. De hecho, el tema principal se puede actualizar sin actualizar el tema secundario, pero los navegadores seguirán usando versiones en caché del antiguo ../twentythirteen/style.css
.
Código relevante en Twenty Thirteen que pone en cola el 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' );
Puedo pensar en algunas maneras de resolver este problema, pero ninguna es realmente satisfactoria:
-
Actualizar el tema de mi hijo cada vez que se actualice el tema principal para cambiar una cadena de versión en
style.css
(por ejemplo,@import url('../twentythirteen/style.css?ver=NEW_VERSION');
). Esto crea un vínculo innecesario y molesto entre la versión del tema principal y el secundario. -
En
functions.php
de mi hijo, 1)wp_dequeue_style
el tema secundario incluidostyle.css
y 2)wp_enqueue_style
el tema padrestyle.css
directamente CON la cadena de versión. Esto desordena el orden de css en cola en el tema principal. -
Use el filtro
style_loader_tag
para modificar la etiqueta css<link>
generada parastyle.css
y modifique la ruta para que apunte directamente a la cadena padrestyle.css
del tema CON una cadena de versión. Parece bastante oscuro para una necesidad tan común (almacenamiento en caché). -
Volcar
style.css
del tema principal enstyle.css
del tema de mi hijo. Igual que (1) en realidad, pero un poco más rápido. -
Haga que
style.css
del tema de mi hijo sea un enlace simbólico alstyle.css
del tema principal. Esto parece bastante hacker ...
¿Me he perdido algo? ¿Alguna sugerencia?
editar
Se agregaron las hojas de estilo genericicons.css
y ie.css
en el tema principal para aclarar por qué no puedo cambiar la instrucción @import
css a wp_enqueue_style
en el tema de mi hijo. Actualmente, con una declaración @import
en style.css
del tema de mi hijo, tengo este orden en las páginas generadas:
- veinte trece / genericons / genericons.css - > encolado por tema principal
- child-theme / style.css - > Encolado por tema principal, @imports twentythirteen / style.css
- veinte trece / css / ie.css - > encolado por tema principal
- child-theme / css / main.css - > encolado por tema infantil
Si encolaré style.css
de los padres como una dependencia de main.css
, esto se convertirá en:
- veinte trece / genericons / genericons.css - > encolado por tema principal
- child-theme / style.css - > vacío, encolado por tema principal
- veinte trece / css / ie.css - > encolado por tema principal
- veinte trece / style.css - > encolado por tema hijo como dependencia de main.css
- child-theme / css / main.css - > encolado por tema infantil
Tenga en cuenta que ie.css ahora se incluye antes de style.css
del tema principal. No quiero cambiar el orden de puesta en cola de los archivos css del tema principal porque no puedo suponer que esto no causará problemas con la prioridad de las reglas de css.