Bagaimana membuat plugin diperlukan dalam tema wp tanpa menggunakan pernyataan kondisional php saat memanggil fungsi individual dari plugin itu?

9

Salah satu tema Wordpress saya memerlukan beberapa plugin pihak ketiga untuk berjalan dengan benar.

Sebagian besar waktu saya digunakan untuk memanggil fungsi dari plugin pihak ketiga menggunakan pernyataan kondisional seperti

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

misalkan saya perlu menggunakan satu plugin secara ekstensif melalui banyak file tema saya ... saya ingin menghindari menggunakan banyak kondisi JIKA ... apakah ada cara yang tepat untuk meminta plugin spesifik tertentu untuk dipasang di WP atau bahkan menginstalnya dengan lebih baik jika mereka hilang sebelum mengaktifkan tema?

Terima kasih

unfulvio
sumber

Jawaban:

7

is_plugin_active()agak rapuh: itu akan rusak ketika pengaya plugin mengubah nama file utama atau ketika pengguna mengubah nama direktori plugin atau file utama. Lebih baik memeriksa apakah ada fungsi publik tertentu.

Untuk menghindari keharusan melakukan pengecekan setiap kali Anda memerlukan beberapa fungsi plugin, Anda dapat menampilkan pesan di area admin:

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

Alternatif lain adalah menggunakan sesuatu seperti http://tgmpluginactivation.com/

scribu
sumber
Jika pembuat plugin mengubah nama fungsi yang Anda tanyakan 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.
kaiser
Jika Anda peduli dengan suara, maka Anda harus memilih-pilih Q itu sendiri, karena itu bagus.
kaiser
Jika pembuat plugin mengubah nama fungsi, ia akan menerima keluhan dari lebih banyak pengguna daripada jika ia akan mengubah nama file.
scribu
Dan saya menurunkan jawaban Anda karena tidak menjawab pertanyaan, IMO. Atau apakah Anda lebih suka saya downvote diam-diam, tanpa penjelasan yang ditawarkan?
scribu
Saya hanya berbicara tentang downvote, bukan komentar. Komentarnya sendiri ok, karena topik ini adalah sesuatu yang perlu didiskusikan. Saya akan menambahkan jawaban lain sebagai pemikiran saya di belakang yang akan melebihi panjang komentar. Harap edit saja jawabannya, sehingga kami dapat menyimpan hasil diskusi di revisi untuk diikuti semua orang. Terima kasih.
kaiser
1

Meskipun ini tidak akan mencegah tema dari pecah ketika plugin dinonaktifkan, saya akan melihat artikel ini tentang plugin "Cara Menampilkan Pemberitahuan Admin untuk Tema yang Diperlukan" . Saya tidak pernah merasa nyaman dengan gagasan tentang tema yang memaksa plugin untuk diinstal, dan jadi ini sepertinya pilihan terbaik berikutnya.

Pikiran cepat lainnya: Saya belum pernah mencoba ini, tetapi saya ingin tahu apakah Anda dapat menemukan cara cerdas untuk memasang beberapa kait dalam satu kondisi. Mungkin Anda dapat memisahkan semua fungsi kondisional dalam file yang berbeda dan hanya memerlukannya jika if( function_exists( 'plugin_function' ) )kembali true(dengan pengertian bahwa ini adalah pemeriksaan yang tidak sempurna.

mrwweb
sumber
0

Jika Anda hanya membutuhkan halaman plugin, maka ada is_plugin_active(). Jika Anda membutuhkannya di luar, Anda lebih baik menyalin / menempelkan fungsi inti ke tema Anda dan kemudian menggunakannya kembali:

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

Persyaratan menghindari kesalahan dengan mendefinisikan fungsi dua kali lipat.

kaisar
sumber
Itu tidak benar-benar menjawab pertanyaan. Itu hanya menggantikan if(function_exist('plugin_function'))denganif(is_plugin_active('plugin-file.php'))
scribu
0

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.

  1. (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
  2. (normal) Plugin yang memiliki fungsionalitas diperluas saat plugin anak diaktifkan. Contoh: jQueryAttachmentCarousel »jQuerySlideDeck
  3. (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 shutdownhook ...?


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.

kaisar
sumber
Sebagai catatan, ini adalah cara yang agak tidak lazim menggunakan fungsi situs. Itu mengingatkan saya pada c2.com/cgi/wiki
scribu
Ya itu. Tetapi saya tidak tahu bagaimana kita bisa melanjutkan diskusi tanpa menyembunyikannya dari pembaca kemudian.
kaiser
Saya tidak akan menyadari bahwa memposting pertanyaan akan menghasilkan diskusi yang cukup :) Tapi itu memang menarik dan saya ucapkan terima kasih atas upaya dan waktu Anda memberikan saran dan memberikan beberapa debat yang bijaksana. Saya pikir saran dari scribu (salah satu dari banyak yang ada) untuk menggunakan kelas Aktivasi TGM dapat menawarkan solusi untuk jawaban saya setidaknya dari sudut pandang praktis, saya akan memeriksanya. Namun, saya masih mengawasi seluruh diskusi karena juga metode lain yang diusulkan masuk akal dalam skenario tertentu dan sangat menarik untuk saya baca, terima kasih!
unfulvio