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.csstidak 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.1yang 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_styletema termasuk anakstyle.cssdan 2)wp_enqueue_styleyang orangtua tema inistyle.csslangsung DENGAN string versi. Ini mengacaukan urutan css yang antri dalam tema induk.Gunakan
style_loader_tagfilter untuk memodifikasi<link>tag css yang dihasilkan untukstyle.cssdan memodifikasi jalur untuk menunjuk langsung ke tema indukstyle.cssDENGAN string versi. Tampaknya agak tidak jelas untuk kebutuhan yang sama (penghilang cache).Buang tema orang tua di tema
style.cssanak sayastyle.css. Sama seperti (1) sungguh, tetapi sedikit lebih cepat.Jadikan tema anak saya
style.cssmenjadi symlink ke tema orang tuastyle.css. Ini sepertinya cukup retas ...
Apakah saya melewatkan sesuatu? Ada saran?
sunting
Menambahkan genericicons.cssdan ie.cssstyle sheet dalam tema induk untuk menjelaskan mengapa saya tidak dapat mengubah @importpernyataan css wp_enqueue_styledi dalam tema anak saya. Saat ini, dengan @importpernyataan 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.csssebagai 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.csstidak akan disertakan di tempat yang sama seperti sekarang. Induk menyertakan file css lain yang harus ada di antara style.csscss temanya dan anak saya.
@import, tetapkan stylesheet tema orangtua sebagai ketergantungan dari stylesheet Anda sendiri .