Funkcja is_plugin_active nie istnieje

17

Używam WordPress 3.0.5 i przetestowałem z 3.1rc4. W głównym pliku PHP mojej wtyczki, kiedy próbuję wywołać is_plugin_active, dostaję Call to undefined function is_plugin_active(). Mogę zadzwonić do add_action i add_filter. Co powinienem sprawdzić / zmienić, aby to naprawić?

Dzieje się tak wewnątrz administratora na stronie wtyczek. Na górze mojego głównego pliku wtyczki mam, if (function_exists('is_plugin_active')) {który zawsze zwraca false.

Nie widzę też funkcji z mojego głównego pliku wtyczek w innych wtyczkach (jeśli to pomaga).

Carl
źródło
Nie jestem pewien z twojego opisu - czy to jest problem z aktywowaną wtyczką, czy próbujesz coś zrobić podczas aktywacji lub w innych szczególnych warunkach?
Rarst
Odkryłem, że function_exists('is_plugin_active')jest to fałsz, gdy jest wywoływany z głównego pliku wtyczki, jeśli jest poza metodą, ale jest prawdziwy, gdy jest wywoływany w metodzie, która jest wywoływana dla activated_pluginakcji.
Carl
Na której stronie widzisz błąd? Strona wtyczki (wp-admin / plugins.php)? Czy dzieje się to przed czy po aktywacji danej wtyczki? Rarst ma dobrą rację. Czy wiesz, w którym momencie wywołujesz funkcję w wordpress?
Jonnybojangles
Widzę błąd na wp-admin / plugins.php po aktywacji wtyczki. Mam sprawdzenie niektórych metod, które są zaczepione jako akcje i działa tam. Wygląda na to, że ma to coś wspólnego z kolejnością włączenia.
Carl
Wtyczki są ładowane w kolejności alfabetycznej, więc może być tak, że wtyczka nie jest przetwarzana wystarczająco wcześnie. Spróbuj zmienić nazwę wtyczki, aby zacząć od litery a (np. Nazwa_mplugina), aby ładowała się wcześniej. Najlepszą opcją byłoby jednak wywołanie bloku function_exists z funkcji, która działa po załadowaniu wtyczek. Szorstki porządek działania można zobaczyć na kodeksie WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Odpowiedzi:

29

Dzieje się tak, ponieważ plik, w którym zdefiniowano is_plugin_active () - wp-admin/includes/plugin.php- jest ładowany tylko do administratora, po załadowaniu wtyczki.

Dlatego możesz wywoływać go tylko po uruchomieniu „admin_init”:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );
scribu
źródło
Jeśli jestem już administratorem, czy istnieje coś, co może być źle skonfigurowane, co uniemożliwiłoby mi dostęp do tego?
Carl
1
Zobacz zaktualizowaną odpowiedź.
scribu 30.04.11
10

Możesz wywoływać funkcję is_plugin_active () w szablonach i na stronach użytkownika, co może być przydatne w przypadku powiązanych wtyczek (tj. Wymaga wtyczki „xyz” do obsługi mojej nowej wtyczki). Musisz ręcznie dołączyć plik plugin.php, jak zauważono w dokumentacji is_plugin_active () w Codex.

Oto funkcjonalny przykład, którego używam w moich pakietach dodatków premium, aby upewnić się, że wtyczka wolnej bazy jest aktywna przed wywołaniem obiektu dodatku. Wymaga, aby niektóre wtyczki i filtry były dostępne we wtyczce podstawowej, w przeciwnym razie ulegnie awarii.

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

Nawiasem mówiąc, jeśli masz problemy z is_plugin_active () z poziomu aktywnego logowania administratora, prawdopodobnie jest tak, ponieważ testujesz przed uruchomieniem admin_init. admin_menu odpala przed admin_init i wykonywanie testów w admin_menu już wcześniej mnie „ugryzło”. Nazwa „admin_init”, która wydaje mi się sprzeczna z intuicją, ponieważ menu admin_menu jest już uruchomione. Myślę, że init jest „pierwszą rzeczą do uruchomienia” ... może admin_kinda_init () byłby lepszy. :)

Lance Cleveland
źródło
Dodanie include_once(ABSPATH.'wp-admin/includes/plugin.php');pomogło mi. Dzięki!
Dave
8

Szybkim i brudnym obejściem byłoby ręczne skopiowanie funkcji:

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

Jest dość krótki, więc nie powinno być zbyt trudne do wdrożenia we własnym kodzie jako obejście.

Tom Auger
źródło
4

Proste i łatwe. Zaczerpnięte z WP

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

a następnie wszelkie wystąpienia

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

   }

uzyskać kontrolę działania. TAK, nigdy więcej błędów.

Spencer Labadie
źródło
1
Jeśli używasz requireonce, prawdopodobnie nie musisz sprawdzać funkcji ...?
Phill Healey
Robisz to, aby upewnić się, że wtyczka jest zdefiniowana, zanim spróbujesz jej użyć, w przeciwnym razie możesz napotkać problemy.
Spencer Labadie
3

Wolałem odpowiedź Toma Augera, jak zdefiniować własną funkcję is_plugin_active zamiast włączać plugin.php. Jednak użycie tej samej nazwy funkcji spowodowało awarię mojego obszaru administracyjnego. Użycie innej nazwy funkcji rozwiązało to:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
Jeroen
źródło
Zgadzam się. Podczas gdy możesz sprawdzić konflikt w deklaracji funkcji, WP nie robi tego, a zatem WP wywoła błąd.
Chris Sprague,
1

Czy korzystasz is_plugin_activez interfejsu administratora lub interfejsu użytkownika? Jestem prawie pewien, że is_plugin_activejest to tylko funkcja administratora, która znajduje się w wp-admin / obejmuje / plugin.php.

Ponadto, czy główny plik wtyczki korzysta z Nagłówka pliku Wordpress ? Czy Twoja wtyczka jest dołączana po załadowaniu powyższego pliku plugin.php?

Jonnybojangles
źródło
Dzieje się tak wewnątrz administratora na stronie wtyczek. Wtyczka ma sugerowany nagłówek pliku WP. Jak mogę sprawdzić, czy wtyczka jest dołączana po plugin.php?
Carl
1

Aby debugować aktywne wtyczki:

var_dump(get_option(...));

Aby sprawdzić konkretną wtyczkę:

in_array(get_option(...));

Działanie nosi nazwę active_plugins„IIRC.

hakre
źródło
0

Żadne z tych rozwiązań nie działało dla mnie, ale działało:

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

Znalazłem to rozwiązanie na codebangers.com

fenderflip
źródło