Bagaimana cara mengganti fungsi pluggable dalam tema?

10

Semua dokumentasi yang saya temui membahas fungsi pluggable utama melalui plugin Anda.

Bagaimana jika Anda melakukan pengembangan tema?

Functions.php saya memerlukan file lain yang mengesampingkan get_user_by()fungsi, didefinisikan dalam pluggable.php.

Jika saya menghilangkan if( function_exists() )panggilan, saya mendapatkan kesalahan "Tidak dapat mendeklarasikan ulang ...".

Jika saya memasukkan if( function exists() )panggilan, maka saya tidak mendapatkan kesalahan, tetapi tentu saja fungsi saya kemudian diabaikan, karena versi pluggable ada.

Berdasarkan posting Dominic yang luar biasa pada urutan startup WordPress , jelas yang pluggable.phpdimuat sebelum tema Anda functions.phpdan sebagainya, sehingga menjelaskan kesalahan.

Jadi pertanyaannya adalah - bagaimana Anda bisa mengambil keuntungan dari arsitektur pluggable yang bagus dari dalam suatu tema, tanpa harus menulis plugin yang kemudian harus dibundel atau diinstal dengan tema?

Catatan lebih lanjut : Jadi nampaknya argumennya adalah bahwa tema tidak boleh mencoba melakukan apa yang dilakukan plugin. Tapi argumen itu sudah lebih dari empat tahun (menurut nomor trac 4 digit). Saya ingin mendengar dari beberapa pemukul berat apakah filosofi ini masih berlaku, mengingat topologi kompleks dari lanskap pengembangan tema saat ini. Saya ingin percaya bahwa kita telah berevolusi sejak saat itu.

Konteks : Saya sedang mengembangkan solusi CMS satu kali untuk pelanggan, dengan banyak metadata khusus, kustomisasi Admin back-end, proses login / otentikasi, pekerjaan. Dan tentu saja, ada komponen desain - di situlah bagian tema masuk. Faktanya, ini adalah komponen yang tidak dapat digunakan kembali - mereka tidak akan pernah berlaku untuk klien lain, mereka tidak akan pernah ditempatkan di bawah GPL dan open source, dan mereka yang paling tentu saja tidak akan didistribusikan / diinstal pada penyebaran WordPress lainnya. Paling-paling ada beberapa praktik terbaik yang akan saya manfaatkan pada proyek-proyek masa depan, tetapi itu hanya akan menjadi pekerjaan referensi / salin-tempel.

Ini kedengarannya bukan kasus penggunaan untuk plugin bagi saya. Tema diinstal, mungkin tema anak dari Twenty Eleven, mungkin mandiri, fungsinya. Php panggilan dalam satu kapal berisi, masing-masing menangani aspek yang berbeda dari CMS yang bersangkutan. Kemudian file templat tema menggunakan 'templat tag' khusus yang ditentukan di dalamnya. Saya tidak ingin memiliki file tema dengan dependensi pada beberapa plugin atau yang sedang diaktifkan, dll. Itu tidak masuk akal untuk membangun kompleksitas ke dalam sistem. Tentu, saya dapat meletakkannya di folder plug-in yang harus digunakan, tetapi itu masih terasa seperti hack - sekarang, semua yang ada hubungannya dengan penyesuaian yang dibuat untuk proyek ini terkandung di dalamnya wp-content/themes/my-theme/. Saya juga tidak mau harus mempertimbangkan untuk mencari hal-hal di beberapa folder plugin juga.

Jangan salah sangka. Saya suka plugin dan saya menggunakannya dan menulisnya. Dan saya menggunakan plugin dalam hubungannya dengan pengembangan tema yang sangat dikustomisasi ketika plugin ini adalah pihak ketiga dan mewakili praktik terbaik jauh melampaui apa yang saya bisa jalankan dalam jangka waktu yang masuk akal. Tetapi ketika saya perlu memodifikasi fungsionalitas inti untuk skenario satu kali, saya beralih ke kait tindakan, kait filter, dan saya ingin dapat mengandalkan fungsi yang dapat dicolokkan bagi pengguna dan sisi otentikasi hal-hal juga.

Tom Auger
sumber
Untuk sedikit pun, saya telah membuka kembali core.trac.wordpress.org/ticket/2479
Tom Auger
Sedikit pun, tiket ditutup lagi, dengan penjelasan yang baik tentang mengapa.
Tom Auger

Jawaban:

10

Jika Anda membangun ini untuk satu klien, Anda harus benar-benar memanfaatkannya mu-plugins.

Ada banyak hal di WordPress yang tidak dapat Anda lakukan functions.php. Fungsi pluggable adalah salah satunya, tetapi lebih jelas, sejumlah kait (baik aksi dan filter) menyala sebelumnya functions.php. Dalam beberapa kasus, kait ini bahkan menyala sebelum plugin biasa, yang kemudian mengharuskan Anda untuk menggunakan mu-pluginsatau plugin yang diaktifkan jaringan. Masih dalam beberapa kasus lain, bahkan plugin-mu sudah terlambat. Mungkin Anda membutuhkan sesuatu sunrise.php. Atau bahkan sesuatu (konstan atau sebaliknya) di wp-config.php.

Saya lebih suka menambahkan beberapa kait ke fungsi pluggable, daripada membuatnya lebih mudah untuk menimpanya. Kami sepertinya tidak akan pernah lagi memiliki fungsi pluggable lainnya - mereka kait pre-date dan saya hampir tidak pernah melihat situasi di mana ada keuntungan bagi mereka daripada hook kuno (mode baru?) Yang bagus.

Saya masih setuju, enam tahun kemudian, dengan Andy Skelton - "Ada banyak perbedaan antara file fungsi tema dan sebuah plugin. Mari tetap seperti itu."

Selain itu, perubahan seperti ini tidak akan pernah terjadi. Itu akan menghancurkan banyak hal. Tema yang tak terhitung jumlahnya memanggil fungsi dalam tubuh functions.phpyang akan menghasilkan kesalahan fatal jika pluggable.phpbelum dimuat - seperti current_user_can(), atau wp_create_nonce(). Mereka semua gagal. Dan itu akan merusak plugin, yang biasanya bisa mulai memanggil fungsi-fungsi ini plugins_loaded. (Hanya bergerak pluggable.phplebih rendah wp-settings.phpdan saya yakin setengah dari inti akan pecah - atau paling tidak, penyesuai akan.)

Akhirnya, ada ide yang tak terelakkan bahwa sebuah tema dapat menyertakan file terpisah seperti pluggable.phpyang dapat kita muat sedini kita memuat plugin, dan karena itu dapat mengesampingkan fungsi yang dapat dicolokkan. Selain ini merupakan ide yang buruk (lihat empat paragraf pertama dari komentar ini), itu masih belum kompatibel, karena sampai setup_themepengait, orang dapat mengganti tema mana yang akan dimuat dengan memfilter stylesheet dan nilai template.

Sayangnya, ini tidak dapat dipertahankan mengingat bagaimana WordPress dirancang. Hal yang baik adalah, ada banyak cara (yang lebih baik) untuk melakukannya.

(Awalnya diposting di sini: http://core.trac.wordpress.org/ticket/2479#comment# )

Andrew Nacin
sumber
Menghargai Anda meluangkan waktu untuk mengirim silang jawaban Anda di sini. Sekarang setelah Anda menjelaskannya, saya melihat semuanya dengan cara Anda. Masuk akal. Terima kasih!
Tom Auger
5

Dalam konteks proyek sekali saja, sangat tepat untuk memasukkan kode yang harus digunakan mu-plugins. Jika "memiliki semuanya di satu tempat" adalah masalah, buat saja symlink di tema dir ke mu-pluginsdrop-in, jadi itu akan muncul saat mencari direktori tema.

Mark Jaquith
sumber
Mark, terima kasih atas sarannya tentang symlink. Meskipun tidak membantu migrasi, akan sangat nyaman saat dikembangkan.
Tom Auger
0

Saya tidak bisa memikirkan cara untuk mencapai ini, terlalu dini dalam urutan pemuatan.

Yang paling dekat dengan solusi waras adalah menambahkan custom include to wp-config.php(dengan kode atau meminta pengguna), tetapi membandingkannya dengan bundling plugin mungkin akan lebih masuk akal.

Jarang
sumber
Ya, ceritakan tentang itu.
Tom Auger