Fungsi is_plugin_active tidak ada


15

Saya menggunakan WordPress 3.0.5 dan telah diuji dengan 3.1rc4. Di file PHP utama plugin saya, ketika saya mencoba menelepon is_plugin_active saya dapatkan Call to undefined function is_plugin_active(). Saya dapat memanggil add_action dan add_filter. Apa yang harus saya periksa / ubah untuk memperbaikinya?

Ini terjadi di dalam admin pada halaman Plugin. Di atas file plugin utama saya, if (function_exists('is_plugin_active')) {yang selalu bernilai false.

Saya juga tidak dapat melihat fungsi dari file plugin utama saya di plugin lain (jika itu membantu).


Saya tidak yakin dari uraian Anda - apakah ini masalah dengan plugin yang diaktifkan atau jika Anda mencoba melakukan sesuatu saat aktivasi atau dalam kondisi spesifik lainnya?
Paling lambat

Saya telah menemukan bahwa function_exists('is_plugin_active')itu salah ketika dipanggil dari file plugin utama jika di luar metode tetapi benar ketika dipanggil di dalam metode yang dipanggil untuk activated_plugintindakan.
Carl

Di halaman mana Anda melihat kesalahan? Halaman plugin (wp-admin / plugins.php)? Apakah ini sebelum atau setelah Anda mengaktifkan plugin yang dimaksud? Rarst punya poin bagus. Apakah Anda tahu pada titik apa Anda memanggil fungsi dengan di wordpress?
Jonnybojangles

Saya melihat kesalahan pada wp-admin / plugins.php setelah saya mengaktifkan plugin. Saya telah memeriksa beberapa metode yang terhubung sebagai tindakan dan berfungsi di sana. Sepertinya ada hubungannya dengan urutan inklusi.
Carl

Plugin dimuat dalam urutan abjad, jadi mungkin saja plugin Anda tidak diproses cukup awal. Coba ganti nama plugin Anda untuk mulai dengan huruf a (mis. A_myplugin-name) sehingga memuat lebih awal. Namun opsi terbaik adalah dengan memanggil blok function_exists Anda dari dalam fungsi yang berjalan setelah plugin dimuat. Anda dapat melihat perintah berjalan kasar pada codex WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Jawaban:


27

Itu karena file yang is_plugin_active () didefinisikan - wp-admin/includes/plugin.php- hanya dimuat di admin, setelah plugin Anda dimuat.

Dengan demikian, Anda hanya dapat memanggilnya setelah 'admin_init' dipecat:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );

Jika saya sudah berada di admin, apakah ada sesuatu yang mungkin dikonfigurasi salah yang akan melarang saya mengakses ini?
Carl

1
Lihat jawaban yang diperbarui.
scribu

10

Anda dapat memanggil is_plugin_active () di templat dan dari halaman pengguna juga, yang dapat berguna untuk plugin terkait (yaitu memerlukan plugin 'xyz' untuk mengoperasikan plugin baru saya). Anda harus secara manual memasukkan file plugin.php seperti yang tercantum dalam dokumen is_plugin_active () pada Codex.

Berikut ini adalah contoh fungsional yang saya gunakan dalam paket add-on premium saya untuk memastikan plugin basis gratis aktif sebelum memanggil objek add-on. Ini membutuhkan kait & filter tertentu untuk tersedia di plugin dasar atau itu akan macet.

include_once(ABSPATH.'wp-admin/includes/plugin.php');
if (!function_exists('is_plugin_active') || !is_plugin_active('store-locator-le/store-locator-le.php')) { 
   return;
}

Selain itu, jika Anda mengalami masalah dengan is_plugin_active () dari dalam login admin aktif, kemungkinan karena Anda menguji sebelum admin_init kebakaran. admin_menu diaktifkan sebelum admin_init dan melakukan tes di admin_menu telah "menggigit" saya sebelumnya. Nama "admin_init" yang tampaknya kontra-intuitif bagi saya karena admin_menu sudah dijalankan. Saya menganggap init sebagai "hal pertama yang harus dijalankan" ... mungkin admin_kinda_init () akan lebih baik. :)


Menambahkan include_once(ABSPATH.'wp-admin/includes/plugin.php');melakukan trik untuk saya. Terima kasih!
Dave

8

Solusi cepat dan kotor adalah untuk menduplikasi fungsi secara manual:

if ( ! function_exists( 'is_plugin_active' ) ) {
    function is_plugin_active( $plugin ) {
        return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
    }
}

Ini cukup pendek sehingga seharusnya tidak terlalu sulit untuk diterapkan dalam kode Anda sendiri sebagai solusinya.


4

Sederhana dan mudah. Diambil dari WP

if ( ! function_exists( 'is_plugin_active' ) )
     require_once( ABSPATH . '/wp-admin/includes/plugin.php' );

dan kemudian setiap contoh

 if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {

   }

periksa fungsinya. JADI tidak ada lagi kesalahan.


1
Jika Anda menggunakan requireonceAnda mungkin tidak perlu memeriksa fungsinya ...?
Phill Healey

Anda melakukannya sehingga Anda dapat memastikan plugin didefinisikan sebelum mencoba menggunakannya, jika tidak, Anda bisa mengalami masalah di telepon.
Spencer Labadie

3

Saya lebih suka jawaban Tom Auger dengan cara mendefinisikan fungsi is_plugin_active Anda sendiri daripada memasukkan plugin.php. Namun, menggunakan nama fungsi yang sama menyebabkan area admin saya mogok. Menggunakan nama fungsi yang berbeda menyelesaikannya:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

Saya setuju. Meskipun Anda dapat memeriksa konflik dalam deklarasi fungsi Anda, WP tidak dan karenanya WP Anda akan memicu kesalahan.
Chris Sprague

1

Apakah Anda menggunakan is_plugin_activedi dalam admin atau front-end? Saya cukup yakin itu is_plugin_activehanya fungsi admin yang ditemukan di dalam wp-admin / include / plugin.php.

Selain itu, apakah file plugin utama Anda menggunakan Wordpress File Header ? Apakah plugin Anda dimasukkan setelah file plugin.php di atas dimuat?


Ini terjadi di dalam admin pada halaman Plugin. Plugin ini memang memiliki header file WP yang disarankan. Bagaimana saya bisa mengecek apakah plugin dimasukkan setelah plugin.php?
Carl

1

Untuk debug plugin aktif:

var_dump(get_option(...));

Untuk memeriksa plugin tertentu:

in_array(get_option(...));

Tindakan ini disebut " active_plugins" IIRC.


0

Tidak satu pun dari solusi ini yang bekerja untuk saya, tetapi ini berhasil:

include_once('wp-admin/includes/plugin.php');

Saya menemukan solusi ini di codebangers.com

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.