web-dev-qa-db-fra.com

la fonction is_plugin_active n'existe pas

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

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

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

13
Carl

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 pourrez l'appeler qu'après le lancement de 'admin_init':

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

Vous pouvez appeler is_plugin_active () dans les modèles et à partir des pages utilisateur également, ce qui peut être utile pour les plugins associés (c’est-à-dire que le plugin 'xyz' est nécessaire pour utiliser mon nouveau plugin). Vous devez inclure manuellement le fichier plugin.php, comme indiqué dans la documentation is_plugin_active () du Codex.

Voici un exemple fonctionnel que j'utilise dans mes packs d'add-on premium pour m'assurer que le plug-in de base libre est actif avant d'appeler un objet add-on. Certains crochets et filtres doivent être disponibles dans le plugin de base, sinon cela va planter.

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

Par ailleurs, si vous rencontrez des problèmes avec is_plugin_active () à partir d'une connexion active, cela est probablement dû au fait que vous testez avant le lancement de admin_init. admin_menu se déclenche avant admin_init et des tests dans admin_menu m'ont déjà "mordu". Le nom "admin_init" qui me semble contre-intuitif puisque admin_menu est déjà lancé. Je pense à init comme étant "la première chose à exécuter" ... peut-être que admin_kinda_init () serait mieux. :)

9
Lance Cleveland

Une solution rapide et incorrecte consisterait à dupliquer la fonction manuellement:

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

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

8
Tom Auger

Simple et facile. Tiré de WP

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

et puis toutes les instances de

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

   }

obtenir la vérification de la fonction. SO plus d'erreurs.

4
Spencer Labadie

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é le blocage de ma zone d’administration. Utiliser un nom de fonction différent a résolu le problème:

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

Pour déboguer des plugins actifs:

var_dump(get_option(...));

Pour vérifier un plugin spécifique:

in_array(get_option(...));

L'action s'appelle "active_plugins" IIRC.

1
hakre

Utilisez-vous is_plugin_active à l'intérieur de l'admin ou du front-end? Je suis à peu près sûr que is_plugin_active est seulement une fonction d'administration qui se trouve dans wp-admin/includes/plugin.php.

De plus, votre fichier de plugin principal utilise-t-il Wordpress File Header ? Votre plugin est-il inclus après le chargement du fichier plugin.php ci-dessus?

1
Jonnybojangles

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

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

J'ai trouvé cette solution sur codebangers.com

0
fenderflip