La fonction is_plugin_active n'existe pas

15

J'utilise WordPress 3.0.5 et j'ai testé avec 3.1rc4. Dans le fichier PHP principal de mon plugin, lorsque j'essaie d'appeler is_plugin_active, je reçois Call to undefined function is_plugin_active(). Je peux appeler add_action et add_filter. Que dois-je vérifier / modifier pour résoudre ce problème?

Cela se produit à l'intérieur de l'administrateur sur la page Plugins. En haut de mon fichier de plugin principal que j'ai, if (function_exists('is_plugin_active')) {qui retourne toujours faux.

Je ne peux pas non plus voir les fonctions de mon fichier de plugin principal dans d'autres plugins (si cela aide).

Carl
la source
Je ne suis pas sûr de votre description - si c'est un problème avec le plugin activé ou si vous essayez de faire quelque chose lors de l'activation ou dans d'autres conditions spécifiques?
Rarst le
J'ai trouvé que function_exists('is_plugin_active')c'est faux lorsqu'il est appelé à partir du fichier du plugin principal si en dehors d'une méthode, mais c'est vrai lorsqu'il est appelé à l'intérieur de la méthode qui est appelée pour l' activated_pluginaction.
Carl
Sur quelle page voyez-vous l'erreur? La page du plugin (wp-admin / plugins.php)? Est-ce avant ou après avoir activé le plugin en question? Rarst a un bon point. Savez-vous à quel moment vous appelez la fonction dans wordpress?
Jonnybojangles
Je vois l'erreur sur wp-admin / plugins.php après avoir activé le plugin. J'ai la vérification dans certaines des méthodes qui sont connectées en tant qu'actions et cela fonctionne là-bas. Il semble que cela ait quelque chose à voir avec l'ordre d'inclusion.
Carl
Les plugins sont chargés par ordre alphabétique, il se peut donc simplement que votre plugin ne soit pas traité suffisamment tôt. Essayez de renommer votre plugin pour commencer par la lettre a (par exemple a_myplugin-name) afin qu'il se charge plus tôt. Cependant, la meilleure option serait d'appeler votre bloc function_exists depuis une fonction qui s'exécute après le chargement des plugins. Vous pouvez voir l'ordre de fonctionnement approximatif sur le codex WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Réponses:

27

En effet, le fichier dans lequel is_plugin_active () est défini - wp-admin/includes/plugin.php- n'est chargé que dans l'administrateur, une fois votre plugin chargé.

Ainsi, vous ne pouvez l'appeler qu'après le déclenchement de 'admin_init':

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );
scribu
la source
Si je suis déjà administrateur, y a-t-il quelque chose qui pourrait être mal configuré qui me refuserait l'accès à cela?
Carl
1
Voir la réponse mise à jour.
scribu
10

Vous pouvez appeler is_plugin_active () dans les modèles et à partir des pages utilisateur, ce qui peut être utile pour les plugins associés (c'est-à-dire exiger le plugin 'xyz' pour faire fonctionner mon nouveau plugin). Vous devez inclure manuellement le fichier plugin.php comme indiqué dans les documents is_plugin_active () sur Codex.

Voici un exemple fonctionnel que j'utilise dans mes packs de modules complémentaires premium pour m'assurer que le plugin de base gratuit est actif avant d'appeler un objet module complémentaire. Cela nécessite que certains crochets et filtres soient disponibles dans le plugin de base, sinon il se plantera.

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

Soit dit en passant, si vous rencontrez des problèmes avec is_plugin_active () à partir d'une connexion administrateur active, c'est probablement parce que vous testez avant que admin_init ne se déclenche. admin_menu se déclenche avant admin_init et faire des tests dans admin_menu m'a "mordu" auparavant. Le nom "admin_init" qui me semble contre-intuitif puisque admin_menu est déjà lancé. Je pense à init comme "la première chose à faire" ... peut-être que admin_kinda_init () serait mieux. :)

Lance Cleveland
la source
L'ajout a include_once(ABSPATH.'wp-admin/includes/plugin.php');fait l'affaire pour moi. Merci!
Dave
8

Une solution rapide et sale serait de dupliquer la fonction manuellement:

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

Il est assez court, il ne devrait donc pas être trop difficile à implémenter dans votre propre code comme solution de contournement.

Tom Auger
la source
4

Simple et facile. Extrait de WP

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

puis toutes les instances de

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

   }

obtenez le contrôle de fonction. Donc plus d'erreurs.

Spencer Labadie
la source
1
Si vous utilisez, requireoncevous n'avez probablement pas besoin de vérifier la fonction ...?
Phill Healey
Vous faites cela pour vous assurer que le plugin est défini avant d'essayer de l'utiliser, sinon vous pourriez rencontrer des problèmes sur toute la ligne.
Spencer Labadie
3

J'ai préféré la réponse de Tom Auger sur la façon de définir votre propre fonction is_plugin_active au lieu d'inclure plugin.php. Cependant, l'utilisation du même nom de fonction a provoqué un plantage de ma zone d'administration. L'utilisation d'un nom de fonction différent l'a résolu:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
Jeroen
la source
Je suis d'accord. Bien que vous puissiez vérifier les conflits dans votre déclaration de la fonction, WP ne le fait pas et, par conséquent, votre WP déclenchera une erreur.
Chris Sprague
1

Utilisez-vous à l' is_plugin_activeintérieur de l'administrateur ou du front-end? Je suis sûr que ce is_plugin_activen'est qu'une fonction d'administration qui se trouve dans wp-admin / includes / plugin.php.

De plus, votre fichier de plugin principal utilise- t-il l'en- tête de fichier Wordpress ? Votre plugin est-il inclus après le chargement du fichier plugin.php ci-dessus?

Jonnybojangles
la source
Cela se produit à l'intérieur de l'administrateur sur la page Plugins. Le plugin a l'en-tête de fichier WP suggéré. Comment puis-je vérifier si le plugin est inclus après plugin.php?
Carl
1

Pour déboguer les plugins actifs:

var_dump(get_option(...));

Pour rechercher un plugin spécifique:

in_array(get_option(...));

L'action s'appelle " active_plugins" IIRC.

hakre
la source
0

Aucune de ces solutions n'a fonctionné pour moi, mais cela a:

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

J'ai trouvé cette solution sur codebangers.com

fenderflip
la source