Le contexte
J'ai construit un thème enfant basé sur Twenty Thirteen qui fonctionne plutôt bien. Après avoir mis à jour le thème parent vers la version 1.3, j'ai remarqué un comportement étrange avec le style causé par un thème parent mis en cache style.css.
Voici le contenu du thème de mon enfant style.css(en omettant les en-têtes)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Ainsi, le thème enfant style.cssne fait rien de plus que d'importer le thème parent style.css.
J'ai également un autre fichier css avec les personnalisations de mon thème enfant que je mets en file d'attente ainsi dans 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);
Cela me donne une très belle URL CSS comme celle-ci: domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1cela garantit que la feuille de style est rechargée lorsque le thème enfant est mis à jour.
Maintenant le problème
L'instruction @import url('../twentythirteen/style.css');est complètement indépendante de la version du thème parent sous-jacent. En fait, le thème parent peut être mis à jour sans mettre à jour le thème enfant, mais les navigateurs utiliseront toujours les versions en cache de l'ancien ../twentythirteen/style.css.
Code pertinent dans Twenty Thirteen qui met en file d'attente 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' );
Je peux penser à quelques façons de résoudre ce problème, mais aucune n'est vraiment satisfaisante:
Mettre à jour mon thème enfant à chaque fois que le thème parent est mis à jour pour changer une chaîne de version
style.css(par exemple@import url('../twentythirteen/style.css?ver=NEW_VERSION');). Cela crée un lien inutile et ennuyeux entre la version du thème parent et l'enfant.Dans mon enfant
functions.php, 1)wp_dequeue_stylele thème enfant inclusstyle.csset 2)wp_enqueue_stylele thème parentstyle.cssdirectement avec la chaîne de version. Cela perturbe l'ordre des CSS en file d'attente dans le thème parent.Utilisez le
style_loader_tagfiltre pour modifier la<link>balise css généréestyle.csset modifier le chemin pour pointer directement vers le thème parentstyle.cssAVEC une chaîne de version. Semble assez obscur pour un tel besoin commun (contournement du cache).Vider le thème parent
style.cssdans mon thème enfantstyle.css. Identique à (1) vraiment, mais un peu plus vite.Faire de mon thème enfant
style.cssun lien symbolique vers le thème parentstyle.css. Cela semble assez hackish ...
Ai-je raté quelque chose? Aucune suggestion?
modifier
Ajout genericicons.csset ie.cssfeuilles de style dans le thème parent pour clarifier pourquoi je ne peux pas changer l' @importinstruction css wp_enqueue_styledans mon thème enfant. Actuellement, avec une @importdéclaration dans le thème de mon enfant style.css, j'ai cette commande dans les pages générées:
- twentythirteen / genericons / genericons.css -> mis en file d'attente par thème parent
- child-theme / style.css -> mis en file d'attente par le thème parent, @imports twentythirteen / style.css
- twentythirteen / css / ie.css -> mis en file d'attente par thème parent
- child-theme / css / main.css -> mis en file d'attente par thème enfant
Si je mets en file d'attente le parent en style.csstant que dépendance de main.css, cela deviendra:
- twentythirteen / genericons / genericons.css -> mis en file d'attente par thème parent
- child-theme / style.css -> vide, mis en file d'attente par le thème parent
- twentythirteen / css / ie.css -> mis en file d'attente par thème parent
- twentythirteen / style.css -> mis en file d'attente par le thème enfant en tant que dépendance de main.css
- child-theme / css / main.css -> mis en file d'attente par thème enfant
Notez que ie.css est maintenant inclus avant celui du thème parent style.css. Je ne veux pas modifier l'ordre de mise en file d'attente des fichiers css du thème parent car je ne peux pas présumer que cela ne causera pas de problèmes avec la priorité des règles css.
style.cssne seraient pas inclus au même endroit qu'aujourd'hui. Le parent inclut d'autres fichiers css qui doivent se trouver entre son style.csset le css de mon thème enfant.
@import, définissez plutôt la feuille de style du thème parent comme une dépendance de votre propre feuille de style .