web-dev-qa-db-de.com

die Funktion is_plugin_active existiert nicht

Ich benutze WordPress 3.0.5 und habe mit 3.1rc4 getestet. Wenn ich versuche, is_plugin_active aufzurufen, erhalte ich in der Hauptdatei PHP meines Plugins Call to undefined function is_plugin_active(). Ich kann add_action und add_filter aufrufen. Was sollte ich überprüfen/ändern, um dies zu beheben?

Dies geschieht innerhalb des Administrators auf der Plugins-Seite. Oben in meiner Haupt-Plugin-Datei steht if (function_exists('is_plugin_active')) {, was immer false zurückgibt.

Ich kann die Funktionen aus meiner Haupt-Plugin-Datei auch nicht in anderen Plugins sehen (wenn das hilft).

13
Carl

Das liegt daran, dass die Datei, in der is_plugin_active () definiert ist - wp-admin/includes/plugin.php -, erst im Admin geladen wird, nachdem Ihr Plugin geladen wurde.

Daher können Sie es erst aufrufen, nachdem "admin_init" ausgelöst wurde:

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

Sie können is_plugin_active () auch in Vorlagen und auf Benutzerseiten aufrufen, was für verwandte Plugins nützlich sein kann (d. H. Das Plugin 'xyz' zum Betreiben meines neuen Plugins erforderlich machen). Sie müssen die Datei plugin.php manuell einbinden, wie in den is_plugin_active () -Dokumenten im Codex angegeben.

Hier ist ein Funktionsbeispiel, das ich in meinen Premium-Add-On-Paketen verwende, um sicherzustellen, dass das Free Base-Plug-In aktiv ist, bevor das Add-On-Objekt aufgerufen wird. Bestimmte Hooks und Filter müssen im Basis-Plugin verfügbar sein, sonst stürzt es ab.

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

Wenn Sie außerdem Probleme mit is_plugin_active () innerhalb einer aktiven Administratoranmeldung haben, liegt dies wahrscheinlich daran, dass Sie testen, bevor admin_init ausgelöst wird. admin_menu wird ausgelöst, bevor admin_init ausgeführt wird, und Tests in admin_menu haben mich zuvor "gebissen". Der Name "admin_init" erscheint mir kontraintuitiv, da admin_menu bereits ausgeführt wird. Ich stelle mir init als "erstes" vor ... vielleicht wäre admin_kinda_init () besser. :)

9
Lance Cleveland

Eine schnelle und fehlerhafte Lösung wäre, die Funktion manuell zu duplizieren:

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

Es ist ziemlich kurz, daher sollte es nicht zu schwierig sein, es als Workaround in Ihren eigenen Code zu implementieren.

8
Tom Auger

Simpel und einfach. Entnommen aus WP

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

und dann alle Instanzen von

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

   }

holen Sie sich die Funktionsprüfung. SO keine Fehler mehr.

4
Spencer Labadie

Ich bevorzuge Tom Augers Antwort mit dem Definieren Ihrer eigenen is_plugin_active-Funktion, anstatt plugin.php einzuschließen. Die Verwendung des gleichen Funktionsnamens führte jedoch zum Absturz meines Administrationsbereichs. Die Verwendung eines anderen Funktionsnamens löste es:

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

So debuggen Sie aktive Plugins:

var_dump(get_option(...));

So suchen Sie nach einem bestimmten Plugin:

in_array(get_option(...));

Die Aktion heißt "active_plugins" IIRC.

1
hakre

Verwenden Sie is_plugin_active im Admin oder im Frontend? Ich bin mir ziemlich sicher, dass is_plugin_active nur eine Admin-Funktion ist, die in wp-admin/includes/plugin.php enthalten ist.

Verwendet Ihre Haupt-Plugin-Datei außerdem Wordpress File Header ? Wird Ihr Plugin eingebunden, nachdem die obige Datei plugin.php geladen wurde?

1
Jonnybojangles

Keine dieser Lösungen hat für mich funktioniert, aber dies hat:

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

Ich fand diese Lösung bei codebangers.com

0
fenderflip