Die Funktion is_plugin_active existiert nicht

15

Ich benutze WordPress 3.0.5 und habe mit 3.1rc4 getestet. In der Haupt-PHP-Datei meines Plugins erhalte ich, wenn ich versuche, is_plugin_active aufzurufen 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. Am Anfang meiner Haupt-Plugin-Datei habe ich, if (function_exists('is_plugin_active')) {die immer false zurückgibt.

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

Carl
quelle
Ich bin mir Ihrer Beschreibung nicht sicher - ob dies ein Problem mit dem aktivierten Plugin ist oder ob Sie versuchen, etwas bei der Aktivierung oder unter anderen spezifischen Bedingungen zu tun?
Rarst
Ich habe festgestellt, dass dies function_exists('is_plugin_active')falsch ist, wenn es von der Haupt-Plugin-Datei außerhalb einer Methode aufgerufen wird, aber wahr ist, wenn es innerhalb der Methode aufgerufen wird, die für die activated_pluginAktion aufgerufen wird .
Carl
Auf welcher Seite sehen Sie den Fehler? Die Seite des Plugins (wp-admin / plugins.php)? Befindet sich dies vor oder nach der Aktivierung des betreffenden Plugins? Rarst hat einen guten Punkt. Weißt du mit welchem ​​Punkt du die Funktion in WordPress aufrufst?
Jonnybojangles
Ich sehe den Fehler in wp-admin / plugins.php, nachdem ich das Plugin aktiviert habe. Ich habe das Einchecken einiger Methoden, die als Aktionen eingebunden sind, und es funktioniert dort. Scheint so, als hätte es etwas mit der Reihenfolge der Aufnahme zu tun.
Carl
Plugins werden in alphabetischer Reihenfolge geladen, daher kann es sein, dass Ihr Plugin nicht früh genug verarbeitet wird. Versuchen Sie, Ihr Plugin umzubenennen, indem Sie mit dem Buchstaben a beginnen (z. B. a_myplugin-name), damit es früher geladen wird. Die beste Option wäre jedoch, den function_exists-Block innerhalb einer Funktion aufzurufen, die nach dem Laden der Plugins ausgeführt wird. Sie können die raue Laufreihenfolge
Phill Healey

Antworten:

26

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' );
scribu
quelle
Wenn ich bereits im Admin bin, ist möglicherweise etwas falsch konfiguriert, das mir den Zugriff darauf verweigert?
Carl
1
Siehe aktualisierte Antwort.
Scribu
10

Sie können is_plugin_active () auch in Vorlagen und auf Benutzerseiten aufrufen, was für verwandte Plugins nützlich sein kann (dh Sie benötigen das Plugin 'xyz', um mein neues Plugin zu betreiben). 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. :)

Lance Cleveland
quelle
Hinzufügen include_once(ABSPATH.'wp-admin/includes/plugin.php');hat den Trick für mich getan. Vielen Dank!
Dave
8

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

if ( ! function_exists( 'is_plugin_active' ) ) {
    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.

Tom Auger
quelle
4

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.

Spencer Labadie
quelle
1
Wenn Sie verwenden, müssen requireonceSie die Funktion wahrscheinlich nicht überprüfen ...?
Phill Healey
Sie tun dies, um sicherzustellen, dass das Plugin definiert ist, bevor Sie es verwenden. Andernfalls können Probleme auftreten.
Spencer Labadie
3

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() ) );
}
Jeroen
quelle
Genau. Während Sie in Ihrer Deklaration der Funktion auf Konflikte prüfen können, führt WP nicht dazu, dass Ihr WP einen Fehler auslöst.
Chris Sprague
1

Benutzt du is_plugin_activeim Admin oder im Frontend? Ich bin mir ziemlich sicher, dass dies is_plugin_activenur eine Admin-Funktion ist, die in wp-admin / includes / plugin.php zu finden ist.

Verwendet Ihre Haupt-Plugin-Datei zusätzlich den Wordpress-Datei-Header ? Wird Ihr Plugin eingebunden, nachdem die obige Datei plugin.php geladen wurde?

Jonnybojangles
quelle
Dies geschieht innerhalb des Administrators auf der Plugins-Seite. Das Plugin hat den vorgeschlagenen WP-Datei-Header. Wie kann ich überprüfen, ob das Plugin nach plugin.php enthalten ist?
Carl
1

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.

hakre
quelle
0

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

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

Ich habe diese Lösung bei codebangers.com gefunden

Fenderflip
quelle