Konteks
Saya membangun tema anak berdasarkan Twenty Thirteen yang bekerja dengan cukup baik. Setelah memperbarui tema induk ke versi 1.3, saya melihat perilaku aneh dengan gaya yang disebabkan oleh tema induk dalam cache style.css
.
Berikut adalah isi dari tema anak saya style.css
(menghilangkan header)
/* =Imports styles from the parent theme
-------------------------------------------------------------- */
@import url('../twentythirteen/style.css');
Jadi tema anak style.css
tidak lebih dari mengimpor tema orang tua style.css
.
Saya juga memiliki file css lain dengan kustomisasi tema anak saya yang saya enqueue seperti di 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);
Ini memberi saya url css yang sangat bagus seperti ini: domain.com/wp-content/themes/toutprettoutbon/css/main.css?ver=1.0.1
yang memastikan style sheet dimuat ulang ketika tema anak diperbarui.
Sekarang masalahnya
Pernyataan @import url('../twentythirteen/style.css');
ini sepenuhnya independen dari versi tema induk yang mendasari. Bahkan, tema induk dapat diperbarui tanpa memperbarui tema anak tetapi browser masih akan menggunakan versi cache yang lama ../twentythirteen/style.css
.
Kode yang relevan di Twenty Thirteen yang memberikan 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' );
Saya dapat memikirkan beberapa cara untuk mengatasi masalah ini tetapi tidak ada yang benar-benar memuaskan:
Perbarui tema anak saya setiap kali tema induk diperbarui untuk mengubah string versi di
style.css
(misalnya@import url('../twentythirteen/style.css?ver=NEW_VERSION');
). Ini menciptakan tautan yang tidak perlu dan mengganggu antara versi tema induk dan anak.Pada anak saya
functions.php
, 1)wp_dequeue_style
tema termasuk anakstyle.css
dan 2)wp_enqueue_style
yang orangtua tema inistyle.css
langsung DENGAN string versi. Ini mengacaukan urutan css yang antri dalam tema induk.Gunakan
style_loader_tag
filter untuk memodifikasi<link>
tag css yang dihasilkan untukstyle.css
dan memodifikasi jalur untuk menunjuk langsung ke tema indukstyle.css
DENGAN string versi. Tampaknya agak tidak jelas untuk kebutuhan yang sama (penghilang cache).Buang tema orang tua di tema
style.css
anak sayastyle.css
. Sama seperti (1) sungguh, tetapi sedikit lebih cepat.Jadikan tema anak saya
style.css
menjadi symlink ke tema orang tuastyle.css
. Ini sepertinya cukup retas ...
Apakah saya melewatkan sesuatu? Ada saran?
sunting
Menambahkan genericicons.css
dan ie.css
style sheet dalam tema induk untuk menjelaskan mengapa saya tidak dapat mengubah @import
pernyataan css wp_enqueue_style
di dalam tema anak saya. Saat ini, dengan @import
pernyataan di tema anak saya style.css
, saya memiliki urutan ini di halaman yang dihasilkan:
- twentythirteen / genericons / genericons.css -> enqueued oleh theme induk
- child-theme / style.css -> enqueued oleh theme parent, @import twentythirteen / style.css
- dua puluh tiga belas / css / ie.css -> enqueued oleh tema induk
- child-theme / css / main.css -> enqueued oleh child theme
Jika saya menyatakan bahwa orang tua style.css
sebagai ketergantungan main.css
, ini akan menjadi:
- twentythirteen / genericons / genericons.css -> enqueued oleh theme induk
- child-theme / style.css -> kosong, enqueued oleh theme induk
- dua puluh tiga belas / css / ie.css -> enqueued oleh tema induk
- dua puluh tiga belas / style.css -> enqueued oleh tema anak sebagai ketergantungan dari main.css
- child-theme / css / main.css -> enqueued oleh child theme
Perhatikan bahwa ie.css sekarang disertakan sebelum tema induk style.css
. Saya tidak ingin mengubah urutan enqueuing file css tema orang tua karena saya tidak dapat menganggap bahwa ini tidak akan menyebabkan masalah dengan prioritas aturan css.
style.css
tidak akan disertakan di tempat yang sama seperti sekarang. Induk menyertakan file css lain yang harus ada di antara style.css
css temanya dan anak saya.
@import
, tetapkan stylesheet tema orangtua sebagai ketergantungan dari stylesheet Anda sendiri .