Bagaimana cara membuat tema anak saya menerapkan kembali pengaturan yang dikustomisasi ketika orang tuanya aktif?

17

Skenario

  1. Pilih tema 2015. Kustomisasi berbagai pengaturan, seperti gambar latar belakang, gambar header, nama situs, dan tagline.
  2. Tapi jangan menyentuh konten file tema apa pun.
  3. Gunakan Tema Anak Codex untuk membuat tema anak minimum minimal dari tema 2015.
  4. Aktifkan tema anak baru.

Ups?

Situs dengan tema anak minimum yang diaktifkan ini terlihat sangat berbeda dari tema induknya. Gambar latar belakang dan header tidak ada, dan segala macam widget sidebar (atau header) telah diaktifkan yang tidak aktif (secara default) dalam tema induk 2015.

Tampilan asli situs dengan hanya beberapa pengaturan khusus untuk tema 2015:

SofietjeWonders dengan tema 2015 yang disesuaikan

Situs seperti yang terlihat dengan tema turunan tema tahun 2015, yang baru saja memiliki header yang diperlukan style.cssdan hanya enqueues gaya seperti yang disarankan oleh halaman Tema Anak dari Codex di dalamnya function.php.

masukkan deskripsi gambar di sini

Pertanyaan

Bagaimana cara membuatnya agar mengaktifkan tema anak membuat penyesuaian dan default dari tema induk?

Dalam hal ini: gambar header dan latar belakang serta penghapusan (penonaktifan?) Dari widget default (sidebar / header).


Catatan

Buat tema anak dari tema yang sudah dikustomisasi berat mungkin terdengar seperti duplikat, tetapi itu adalah tentang penyesuaian dengan mengedit file tema.

Pertanyaan ini Saat mengaktifkan tema anak, pengaturan inti apa yang harus diatur ulang yaitu; Menu Kustom dll? tampaknya bertanya persis apa yang saya cari. Sayangnya, satu-satunya jawaban berspekulasi tentang ketidakcocokan dalam fitur, yang tidak terjadi pada saya dan tidak menerima komentar OP dengan efek yang sama.

Saya juga melihat

Marjan Venema
sumber

Jawaban:

9

Saya memberi +1 ke jawaban @ webtoure karena memberi Anda arah yang benar, namun saya pikir ini kurang memiliki beberapa pemeriksaan.

Pertama-tama itu tidak memeriksa bahwa tema yang sedang diaktifkan adalah tema anak, dan tidak memeriksa bahwa tema yang sebelumnya aktif adalah tema induk dari tema anak yang sedang diaktifkan.

Menurut pemahaman saya tentang OP, persyaratan ini diperlukan.

Selain itu, satu masalah yang perlu Anda perhitungkan adalah apa yang harus dilakukan dengan mod tema tema anak yang sedang diaktifkan, jika sudah ada.

Di @webtoure jawaban, mereka disimpan dalam cadangan, yang mungkin menyelamatkan Anda dalam beberapa keadaan, tetapi WordPress tidak akan mengenalinya secara default sehingga mereka memerlukan beberapa kode tambahan untuk digunakan.

Saya pikir akan lebih baik, mewarisi modifikasi tema dari tema induk hanya saat pertama kali tema anak diaktifkan.

Singkatnya, kondisi yang ingin saya periksa sebelum mewarisi mod tema dari tema induk adalah:

  • tema yang sebelumnya aktif harus menjadi induk dari tema anak yang sedang diaktifkan
  • tema anak yang sedang diaktifkan harus tidak pernah diaktifkan sebelumnya

Untuk memastikan kondisi kedua saya akan menggunakan opsi khusus, karena WordPress tidak menyediakan cara untuk melakukan pemeriksaan ini.

Ini kodenya, silakan baca komentar sebaris untuk penjelasan tentang apa yang terjadi:

add_action( 'switch_theme', function( $new_name, \WP_Theme $new_theme ) {

    // get the previously active theme
    $previous = get_option( 'theme_switched', -1 );

    // get the parent of current theme, will be false if no parent
    $parent = $new_theme->parent() ? $new_theme->get_template() : false;

    // current stylesheet name
    $stylesheet = get_option( 'stylesheet' );

    // has the theme being activated ever been activated before?
    $lastActive = get_option( $stylesheet . '_last_active', false );

    // if previouly active theme is the parent of the the child theme being activated
    // and it has never been activated before..
    if ( ! $lastActive && $parent === $previous ) {

        // update "last_active" option so following code won't run again for this theme
        update_option( $stylesheet . '_last_active', current_time( 'timestamp', 1 ) );

        // get the theme mods of the parent
        $previousMods = get_option( 'theme_mods_' . $parent, array() );

        // inherit current theme mods from parent theme mods
        update_option( 'theme_mods_' . $stylesheet, $previousMods );
    }

}, 10, 2 );
gmazzap
sumber
Poin pertama Anda yang bersangkutan tidak benar-benar dapat dibenarkan: jika tema saat ini bukan tema anak, maka get_templatecukup kembalikan nama dir tema saat ini. Anda tidak perlu tahu hubungan antara tema yang sebelumnya aktif dan yang sekarang: jika tema memiliki orang tua, ia memuat pengaturan tersebut jika tidak, hanya memuat pengaturannya sendiri. Saya setuju dengan poin kedua Anda yang membahas masalah pengaturan yang ditimpa.
webtoure
Selanjutnya, bagaimana jika pengguna secara tidak sengaja mengaktifkan tema lain sebelum mengaktifkan tema anak yang diinginkan? Kode tidak akan berfungsi dan hubungan ( theme_switched, current_theme) tidak relevan untuk memulai.
webtoure
1
@MarjanVenema Saya akan sangat senang jika Anda akan memberikan hadiah untuk webtoure .
gmazzap
1
@MarjanVenema gmazzap sebenarnya memberikan komentar untuk proses pemikirannya dan juga menyarankan koreksi pada cuplikan saya. Saya pikir kalau ada yang pantas menerima hadiah itu, itu dia. Juga, saya tidak menjawab pertanyaan untuk poin yang sama sekali tidak berguna. Saya suka: berinteraksi dengan orang-orang, tantangan dan umumnya membantu ketika saya bisa.
webtoure
1
Silakan lanjutkan diskusi untuk mengobrol, komentar tidak dimaksudkan untuk mereka. :)
Rarst