Bagaimana cara memuat parent_theme functions.php sebelum child_theme?

12

Saya mendapat masalah bahwa saya harus memuat functions.phpfile tema orang tua saya sebelum file tema anak saya functions.phpdimuat. Ini diperlukan untuk prosedur pengaturan & init. Saya melihat kait di dalam /wp_core_root/wp-settings.php (bernama:) do_action('setup_theme');.

Masalahnya adalah saya tidak tahu bagaimana cara menghubungkan ke sana, karena file pertama yang saya dapatkan adalah tema anak functions.php, jadi tidak add_action( 'setup_theme', 'my_init_function' );akan berfungsi.

Sunting:
a) Saya tahu bahwa plugin memuat lebih awal dari tema dan karena itu dapat mengakses bahkan Permintaan awal, tetapi saya tidak ingin bergantung pada Plugin.
b) Ini kode (disingkat) dari file wp-settings.php

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

Saya ingin menghindari dua hal: Pertama banyak penjelasan kepada pengguna. Kedua kemungkinan seseorang mematahkan apa pun jika talinya memotong dengan tidak sengaja menghapus prosedur init orang tua. Orang hanya akan bermain di dalam functions.php tanpa mengambil risiko untuk memecahkan apa pun tanpa menyadarinya.

Dengan kata lain: Bagaimana cara menjaga file theme.fp tema anak saya bersih, tetapi apakah bootstrap tema induk sudah selesai?

Ada ide? Terima kasih banyak!

kaisar
sumber
Tidak bisakah Anda memasukkannya?
wyrfel
Pertanyaan saya adalah: dari mana? File pertama yang dimuat dalam konteks tema adalah tema anak functions.php. Lihatlah file "molto loko" wp-settings.phpdi core (line: 275-279 @wp 3.1 rc) ... terlihat seperti ini:, if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );jadi saya tidak dapat melihat peluang ... Dan saya tidak ingin menggunakan sebuah plugin untuk mem-bootstrap tema saya.
kaiser
Saya mungkin benar-benar kehilangan sesuatu di sini, tetapi jika Anda menyisipkan include(/path/to/parent/themes/functions.php)di bagian atas tema functions.php anak Anda, maka semua yang ada di sana dimuat sebelumnya. Tidak?
wyrfel
@wyrfel: saya memperbarui Q untuk membuatnya lebih jelas
kaiser
Begitu ya, terima kasih, sudah jauh lebih jelas sekarang. Plus saya berasumsi Anda hanya melakukan ini untuk satu kali instalasi.
wyrfel

Jawaban:

11

Justin Tadlock baru-baru ini menulis posting yang bagus tentang membuat file functions.php yang lebih baik di
mana (jika saya ingat dengan benar) ia berurusan dengan masalah yang tepat ini.

Sayangnya situsnya sedang down saat ini jadi saya harus mengandalkan ingatan saya untuk saat ini.

Anda berada di jalur yang benar dengan after_setup_themehook.

  1. Sejauh yang saya ingat, triknya adalah membungkus filter dan tindakan Anda ke dalam fungsinya.
    Lihat contoh di bawah ini.
  2. Anda melakukan itu di kedua orangtua dan anak functions.phpfile.
  3. Kemudian Anda dapat bermain dengan prioritas kedua pengait ini.

Sedikit kode bernilai ribuan kata - tema orang tua Anda function.phpakan terlihat seperti ini:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}
Michal Mau
sumber
Ehm, terima kasih atas tulisannya (+1). Anda punya otak yang mengesankan;). Masalahnya adalah after_setup_themeini sudah terlambat, karena file functions.php sudah dimuat.
kaiser
EDIT: Setelah memikirkan kembali kode Anda dan membaca "lakukan itu di kedua function.php orang tua dan anak" & "bermain dengan prioritas" itu mulai masuk akal. Masih mencari solusi yang lebih baik sehingga pengguna tidak dapat memecahkannya dengan mudah, tetapi masuk akal! Terima kasih!
kaiser
Tidak ada solusi nyata di sini, jadi saya periksa tandai ini, karena Anda adalah orang pertama yang mengusulkan ini.
kaiser
9

Pertama, kamu tidak bisa. Function.php tema anak selalu memuat pertama, titik.

Kedua, tema tidak dapat terhubung ke setup_theme. Plugin bisa, tetapi hal pertama yang bisa dihubungkan tema adalah after_setup_theme.

Jika orang tua Anda dirancang dengan benar, maka anak tersebut mampu mengesampingkan fungsi dan hal-hal di dalam orang tua, tetapi hanya saat memuat terlebih dahulu.

Secara umum, jika Anda pikir Anda perlu memuat file fungsi orang tua terlebih dahulu, maka Anda mungkin melakukannya dengan salah. Anda perlu menjelaskan masalah yang lebih besar.

Otto
sumber
Terima kasih atas jawaban anda. Saya mengerti perlunya memuat plugin sebelum tema dan sudah menyadari faktanya (baca di atas: "Dan saya tidak ingin menggunakan plugin untuk mem-bootstrap tema saya."). Untuk menguraikan kasus saya: Saya mendapatkan file ini yang peduli tentang memuat semua bagian kerangka saya, yang dimulai dengan fungsi tema php dengan membutuhkan file dan memuat kelas init. InitClass peduli tentang memuat a) dan array data dari tema anak .ini-file dan kemudian mendorongnya ke dalam kelas yang berbeda untuk memproses lebih lanjut ex. kotak meta, tipe pos khusus, dll.
kaiser
Masalah saya adalah bahwa saya harus init semua ini dari file functions.php orang tua saya, sehingga pengguna normal tidak dapat merusaknya, ketika bermain-main di dalam tema anak. Masalah kedua saya adalah bahwa semua kelas-kelas itu tidak tersedia di dalam file functions.php tema anak, sehingga mereka tidak ada gunanya ... tapi mungkin saya punya kesalahan berpikir besar di sini. Adakah ide atau saran tentang cara menjadikannya lebih baik?
kaiser
3
.... Saya pikir Anda hanya harus menerima kenyataan bahwa jika pengguna merusak sesuatu, maka itu benar-benar masalah mereka. Intinya: Tidak ada cara untuk memuat fungsi theme.php orang tua terlebih dahulu dan meninggalkan tema anak "bersih". Jika Anda memerlukan sesuatu di child theme untuk dijalankan setelah file functions.php theme orangtua telah dimuat, maka Anda memasukkannya ke dalam fungsi yang terhubung ke after_setup_theme. Itu berjalan setelah kedua file functions.php dimuat.
Otto
Baik. Bukan masalah besar. Saya hanya diajak bicara jika ada kemungkinan. Pertanyaan: Untuk apa "kerangka kerja layak garam" kemudian memiliki hook setelah prosedur init dan tidak hanya menggunakan after_setup_themehook? Hanya untuk tidak "spam" kail, atau karena itu lebih "giat" atau "kool" er? Maksud saya: Apakah ide "praktik terbaik" di balik kait paralel tema khusus "tinggalkan kait inti untuk plugin"? (Begitulah cara saya mengatasinya saat ini.)
kaiser
"Jika kamu akan melakukannya, jangan repot-repot dengan tindakan ekstra. Cukup kaitkan ke after_setup_theme." Baik. Terima kasih. +1
kaiser
4

Jadi Anda mencoba mengeksekusi kode dari functions.php anak, tetapi setelah tema induk dimuat. Sederhana, cukup gunakan tindakan khusus:

Di akhir parent/functions.php:

do_action('parent_loaded');

Dalam child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

Semua tema orangtua layak diberi garam, lakukan dengan cara ini. Terlebih lagi, mereka memiliki beberapa tindakan lain dan filter yang disebarkan agar tema anak dapat digunakan.

scribu
sumber
Saya mencoba menghindari instruksi sebanyak mungkin. Itulah salah satu alasan saya beralih dari file config.php di folder tema anak dan sekarang menggunakan file ini sebagai gantinya. Dalam satu kalimat: Saya mencoba untuk menjauh dari solusi lama saya / Anda dan mendapatkan kembali ke inti dan codex mungkin. Masalah saya adalah bahwa saya tidak dapat memberikan fungsi tunggal dari tema anak, karena tidak ada kelas atau yang lain dari bootstrap saya tersedia di dalam file functions.php tema anak (tidak berbicara tentang tag templat kerangka kerja kustom).
kaiser
Lihat jawaban yang diperbarui.
scribu
Saya memperbarui Q juga. Setelah membaca bahwa 2/3 jawaban menunjuk saya ke sumber yang sama (tematik, sebelum edit Anda) saya merasa bahwa hanya ada metode "justin tadlock" termasuk, tetapi saya ingin memastikan.
kaiser
2
Jika Anda akan melakukannya, jangan repot-repot dengan tindakan ekstra. Cukup kaitkan ke after_setup_theme.
Otto
0

Mengapa Anda tidak memasukkan functions.phpfile tema orang tua ke file tema anak functions.php, seperti ini:

Dalam functions.phpfile tema anak :

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

Dengan cara ini, functions.phpfile tema induk tidak diubah (terkadang ini penting).

Anh Tran
sumber
seperti yang disebutkan dalam T: "Dengan kata lain: Bagaimana cara menjaga file theme.fp tema anak saya tetap bersih, tetapi apakah bootstrap tema induk sudah selesai?" Bahkan lebih baik: Bagaimana saya menghindari panggilan dari dalam file functions.php? Mengapa: Orang-orang terbiasa menghancurkan setiap omong kosong yang tidak mereka inginkan dalam file templat di sana. Jadi ada kemungkinan besar bahwa seseorang secara tidak sengaja menghapus beberapa baris. Pengalaman saya: Tidak ada yang benar-benar membaca komentar, readme atau dokumentasi.
kaiser
0

Saya memiliki masalah yang sama sebelumnya dan saya memperbaikinya dengan membuat "child-functions.php" ekstra kosong pada orangtua dan memasukkan ke dalam "functions.php" (parent juga) tepat setelah file / fungsi yang ingin saya gunakan pada child, kemudian di child theme saya membuat file "child-functions.php" dan ada di mana saya bisa mulai mensimulasikan menjalankan child.fp run setelah orangtua bukan solusi yang elegan tapi berhasil.

Softmixt
sumber