Catatan: Jawaban ini hanya ada di sini untuk mempermudah diskusi antara @scribu dan @kaiser. Mod: Tolong jangan hapus. Pengguna / Pembaca: Tolong jangan memilih. Jika Anda ingin mengikuti diskusi, lihat log revisi / edit. Jika Anda ingin bergabung dalam diskusi, edit Jawabannya. Jika diskusi memiliki hasil, maka itu akan ditandai seperti itu. Terima kasih.
Skenario
Ada juga berbagai skenario yang bobotnya berbeda, di mana Anda bisa memiliki ketergantungan plugin. (Contohnya hanya fiksi). Kata "(induk) Plugin" dapat ditukar dengan "Tema" dari sudut pandang orang tua.
- (Hard) Plugin anak yang hanya memperluas fungsionalitas atau mengubah tampilan (dan serupa) dari plugin yang ada dan karenanya tidak dapat ada tanpa orangtua. Contoh: BuddyPress »BuddyPress-FunkyCommentDisplay
- (normal) Plugin yang memiliki fungsionalitas diperluas saat plugin anak diaktifkan. Contoh: jQueryAttachmentCarousel »jQuerySlideDeck
- (Lembut) Plugin yang baru saja menambahkan fitur. Contoh: DisneyWonderlandTema »MickeysSocialLinks
Berikut ini saya mencoba untuk membuat sketsa apa yang terjadi ketika Anda memperbarui plugin "lain" dan cek tidak berfungsi lagi.
- Iklan 1) Plugin tidak akan ada tanpa BuddyPress diaktifkan »Stuff benar-benar rusak.
- Iklan 2) Plugin tidak dapat menawarkan opsi untuk beralih dari Carousel ke SlideDeck »Menampilkan kabel (Saya berasumsi bahwa gaya dimodifikasi ke SlideDeck).
- Iklan 3) MickeysSocialLinks menghilang.
Memeriksa
Ada tiga kemungkinan untuk diperiksa, jika Anda ingin tahu apakah plugin aktif:
- A. Apakah folder itu ada?
- B. Apakah file utama - opsi
'active_plugins'
- ada?
- C. Apakah ada fungsi tertentu?
Jika saya sekarang menggunakan Plugin Pemeriksa Tautan Internal saya sebagai contoh, yang tidak menawarkan API publik dan tidak dimaksudkan untuk diperpanjang, maka saya tidak melihat alasan (sebagai penulis) untuk tidak mengubah penamaan fungsi internal sesuai permintaan atau hanya atas kehendak . Jadi, jika seseorang akan mencoba untuk mendukung piggyback pada plugin ini, maka hal-hal akan rusak (tergantung pada fungsionalitas dan ketatnya bundling) pada pembaruan. Hal yang sama berlaku untuk nama file. Saya tidak punya alasan nyata (selain itu plugin akan dinonaktifkan pada pembaruan) untuk tidak mengubah nama file. Satu-satunya hal yang akan menahan saya untuk mengubah nama folder adalah bahwa pemeriksaan pembaruan & pemberitahuan berjalan terhadap nama file - jika itu di-host di repo resmi.
Jadi saya akan mengatakan dari bagian terlemah (mudah diubah) ke terberat (banyak yang menentang perubahan) dari plugin (induk) adalah:
fungsi »nama file utama» folder
Ketika saya mengatakan bahwa pemeriksaan fungsi kurang rapuh daripada menggunakan, is_plugin_active()
saya berasumsi bahwa fungsi yang dimaksud adalah yang didorong oleh pembuat plugin secara eksplisit. Contoh utama dari ini adalah wp_pagenavi()
tag template yang ditawarkan oleh plugin WP-PageNavi.
Kesulitan dalam mendefinisikan dependensi adalah bahwa tidak ada cara standar untuk secara unik mengidentifikasi plugin yang tidak melibatkan nama file.
Lebih banyak pemikiran tentang subjek:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unr reliable-plugin-namingidentifying-scheme
Saya kira kita sejauh ini dapat merangkumnya dalam tiga poin:
- Kami telah berbicara tentang topik yang sedikit berbeda
- Kami setuju bahwa tidak ada cara antipeluru untuk menyiasati topik yang saya pikirkan
- Dari pemahaman Anda tentang pertanyaan, Anda menawarkan cara yang valid untuk pergi
Cara (sejauh ini) paling cerdas yang dapat saya pikirkan, yang telah saya lihat di beberapa (terlalu banyak) plugin:
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Tanpa berpikir terlalu banyak tentang hal itu, tapi saya kira Anda bisa menghubungkan pemberitahuan Anda ke dalam cek pada 'semua' filter dan periksa di dalam filter saat ini jika dipicu ketika Anda berada di shutdown
hook ...?
Menggunakan kait akan bekerja dengan baik untuk dependensi 'normal' dan 'lemah'. Satu-satunya kelemahan adalah bahwa Anda masih perlu menggunakan function_exists()
atau is_plugin_active()
jika Anda ingin berhenti jika ketergantungan tidak terpenuhi. Menggunakan filter 'all' untuk itu akan menjadi IMO terlalu mahal.
@scibu Ini ditargetkan pada topik "Anda". (Saya sudah berhenti berbicara tentang milik saya). :)
Jadi pada dasarnya, jika Anda memerlukan dependensi - dan Anda memiliki penulis yang bagus - maka ia bisa menawarkan hook sebagai pengganti / sebagai pengganti tag templat. Karena plugin hanya akan menghubungkan ke dalamnya jika hook akan ada, atau tidak melakukan apa-apa. Dan di sisi lain Anda tidak akan memiliki kesalahan, ketika plugin tidak ada.
Inilah bagian yang sulit (atau lebih dari T): Untuk menulis pemberitahuan admin untuk memberi tahu pengguna tentang ketergantungan "Anda perlu menginstal» DisneyWonderLinks «", Anda dapat memeriksa array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Saya tidak yakin apakah ini akan berhasil, tetapi afaik array harus dapat diakses di kedua sisi (publik / admin).
Itu tidak akan berhasil. Hanya karena panggilan balik terdaftar ke sebuah kail tidak berarti bahwa kail akan dipicu ketika diharapkan. Satu-satunya hal yang akan semacam pekerjaan adalah menggunakan hook 'shutdown', yang Anda sebutkan sebelumnya:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Tentu saja, ini akan dicetak di bagian paling bawah, setelah </html>
tag, di front-end (karena di situlah tag template biasanya digunakan), yang tidak banyak digunakan.
Anda bisa mencoba menyimpan pesan di wp_options dan kemudian menampilkannya di admin area, tetapi itu akan membuka kaleng baru cacing: invalidation, caching plugins etc.
function_exists
, maka pengguna normal hanya akan mendapatkan pesan, bahwa dia belum menginstal plugin yang bergantung pada plugin lain. Masalahnya adalah, bahwa pengguna benar - benar akan menginstal plugin dan kemudian bertanya-tanya mengapa itu tidak berfungsi . Oh, dan aku tidak akan menurunkan kamu untuk itu.