is_plugin_active işlevi mevcut değil


17

WordPress 3.0.5 kullanıyorum ve 3.1rc4 ile test ettik. Eklentimin ana PHP dosyasında, is_plugin_active aramaya çalıştığımda alıyorum Call to undefined function is_plugin_active(). Add_action ve add_filter diyebilirim. Bunu düzeltmek için neyi kontrol etmeli / değiştirmeliyim?

Bu, Eklentiler sayfasındaki yöneticinin içinde oluyor. Ana eklenti dosyamın üstünde, if (function_exists('is_plugin_active')) {her zaman yanlış döndürür.

Diğer eklentilerdeki ana eklenti dosyamdaki işlevleri de göremiyorum (eğer yardımcı olursa).


Açıklamanızdan emin değilim - bu etkinleştirilmiş eklenti ile ilgili bir sorunsa veya etkinleştirme veya diğer belirli koşullar altında bir şey yapmaya çalışıyorsanız?
Rarst

Ben function_exists('is_plugin_active')bir yöntemin dışında ise ana eklenti dosyasından çağrıldığında yanlış ama activated_plugineylem için çağrılan yöntemin içinde çağrıldığında doğru buldum .
Carl

Hatayı hangi sayfada görüyorsunuz? Eklentinin sayfası (wp-admin / plugins.php)? Söz konusu eklentiyi etkinleştirmeden önce mi yoksa sonra mı? Rarst'ın iyi bir noktası var. Wordpress'te hangi noktada fonksiyonu çağırdığınızı biliyor musunuz?
Jonnybojangles

Eklentiyi etkinleştirdikten sonra wp-admin / plugins.php hatasını görüyorum. Ben eylem olarak bağladım bazı yöntemlerin kontrol var ve orada çalışır. İçerme siparişiyle bir ilgisi var gibi görünüyor.
Carl

Eklentiler alfabetik sırada yüklenir, bu nedenle eklentiniz yeterince erken işlenmiyor olabilir. Eklentinizi, daha önce yüklenecek şekilde a harfiyle (ör. A_myplugin-name) başlamak için yeniden adlandırmayı deneyin. Ancak en iyi seçenek, function_exists bloğunuzu eklentiler yüklendikten sonra çalışan bir işlev içinden çağırmak olacaktır. Kaba çalışma düzenini WP kodeksinde görebilirsiniz: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Yanıtlar:


29

Bunun nedeni, is_plugin_active () öğesinin tanımlandığı - wp-admin/includes/plugin.php- dosyasının , eklentiniz yüklendikten sonra yalnızca yöneticiye yüklenmesidir.

Bu nedenle, yalnızca 'admin_init' tetiklendikten sonra çağırabilirsiniz:

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

Zaten yöneticideysem, yanlış yapılandırılmış olabilecek bir şey var mı?
Carl

1
Güncellenmiş cevaba bakınız.
scribu

10

İlgili eklentiler için yararlı olabilecek şablonlarda ve kullanıcı sayfalarında da is_plugin_active () öğesini arayabilirsiniz (yeni eklentimi çalıştırmak için 'xyz' eklentisini gerektirir). Plugin.php dosyasını Codex'ta is_plugin_active () belgelerinde belirtildiği gibi el ile eklemeniz gerekir.

İşte eklenti nesnesini çağırmadan önce ücretsiz eklentinin etkin olduğundan emin olmak için premium eklenti paketlerimde kullandığım işlevsel bir örnek. Temel eklentide belirli kancaların ve filtrelerin bulunmasını gerektirir, aksi takdirde kilitlenir.

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;
}

Bir yana, is_plugin_active () ile aktif bir yönetici girişinde sorun yaşıyorsanız, büyük olasılıkla admin_init yangınlarından önce test ediyor olmanız olasıdır. admin_menu admin_init'ten önce tetiklenir ve admin_menu'da testler yapmak beni daha önce "ısırdı". Admin_menu zaten çalıştırıldığından beri bana karşı sezgisel görünen "admin_init" adı. Ben init "çalıştırmak için ilk şey" olarak düşünüyorum ... belki admin_kinda_init () daha iyi olurdu. :)


Eklemek include_once(ABSPATH.'wp-admin/includes/plugin.php');benim için hile yaptı. Teşekkürler!
Dave

8

Hızlı ve kirli bir çözüm, işlevi manuel olarak çoğaltmak olacaktır:

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

Oldukça kısadır, bu nedenle kendi kodunuzda geçici bir çözüm olarak uygulamak çok zor olmamalıdır.


4

Basit ve kolay. Alındığı WP

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

ve daha sonra

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

   }

fonksiyon kontrolü olsun. SO artık hata yok.


1
Eğer kullanıyorsanız requireoncemuhtemelen fonksiyonu kontrol etmek gerekmez ...?
Phill Healey

Bunu yapmayı denemeden önce eklentinin tanımlandığından emin olursunuz, aksi takdirde sorunla karşılaşabilirsiniz.
Spencer Labadie

3

Tom Auger'ın plugin.php yerine kendi is_plugin_active işlevinizi nasıl tanımlayacağınız cevabını tercih ettim. Ancak, aynı işlev adını kullanmak yönetici alanımın çökmesine neden oldu. Farklı bir işlev adı kullanarak çözüldü:

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

Katılıyorum. İşlev bildiriminizde çakışma olup olmadığını kontrol edebilirsiniz, ancak WP yapmaz ve bu nedenle WP'niz bir hata tetikler.
Chris Sprague

1

is_plugin_activeYönetici içinde mi yoksa ön uçta mı kullanıyorsunuz? is_plugin_activeSadece wp-admin / include / plugin.php içinde bulunan bir yönetici işlevi olduğundan eminim .

Ayrıca, ana eklenti dosyanız Wordpress Dosya Başlığını kullanıyor mu? Eklentiniz yukarıdaki plugin.php dosyası yüklendikten sonra ekleniyor mu?


Bu, Eklentiler sayfasındaki yöneticinin içinde oluyor. Eklenti önerilen WP dosya başlığına sahip. Plugin.php'den sonra eklentinin dahil edilip edilmediğini nasıl kontrol edebilirim?
Carl

1

Etkin eklentilerde hata ayıklamak için:

var_dump(get_option(...));

Belirli bir eklentiyi kontrol etmek için:

in_array(get_option(...));

Eylem " active_plugins" IIRC olarak adlandırılır .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.