La función is_plugin_active no existe

15

Estoy usando WordPress 3.0.5 y lo he probado con 3.1rc4. En el archivo PHP principal de mi complemento, cuando intento llamar a is_plugin_active me sale Call to undefined function is_plugin_active(). Puedo llamar a add_action y add_filter. ¿Qué debo verificar / cambiar para solucionar esto?

Esto está sucediendo dentro del administrador en la página de Complementos. En la parte superior de mi archivo de complemento principal que tengo, if (function_exists('is_plugin_active')) {que siempre devuelve falso.

Tampoco puedo ver las funciones de mi archivo de complemento principal en otros complementos (si eso ayuda a alguno).

Carl
fuente
No estoy seguro de su descripción: si esto es un problema con el complemento activado o si está tratando de hacer algo en la activación o en otras condiciones específicas.
Rarst
Descubrí que function_exists('is_plugin_active')es falso cuando se llama desde el archivo de complemento principal si está fuera de un método, pero es verdadero cuando se llama dentro del método que se llama para la activated_pluginacción.
Carl
¿En qué página ves el error? ¿La página del complemento (wp-admin / plugins.php)? ¿Es esto antes o después de activar el complemento en cuestión? Rarst tiene un buen punto. ¿Sabes en qué punto estás llamando a la función en wordpress?
Jonnybojangles
Veo el error en wp-admin / plugins.php después de activar el complemento. Tengo el control de algunos de los métodos que están conectados como acciones y funciona allí. Parece que tiene algo que ver con el orden de inclusión.
Carl
Los complementos se cargan en orden alfabético, por lo que puede ser simplemente que su complemento no se esté procesando lo suficientemente temprano. Intente cambiar el nombre de su complemento para comenzar con la letra a (por ejemplo, a_myplugin-name) para que se cargue antes. Sin embargo, la mejor opción sería llamar a su bloque function_exists desde una función que se ejecuta después de cargar los complementos. Puede ver el orden aproximado en el código de WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Respuestas:

27

Esto se debe a que el archivo en el que se define is_plugin_active () wp-admin/includes/plugin.php- solo se carga en el administrador, después de cargar el complemento.

Por lo tanto, solo puede llamarlo después de que 'admin_init' se haya disparado:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );
scribu
fuente
Si ya estoy en el administrador, ¿hay algo que pueda estar configurado incorrectamente que no me permita acceder a esto?
Carl
1
Ver respuesta actualizada.
scribu
10

Puede llamar a is_plugin_active () en plantillas y también desde páginas de usuario, lo que puede ser útil para complementos relacionados (es decir, requiere el complemento 'xyz' para operar mi nuevo complemento). Debe incluir manualmente el archivo plugin.php como se indica en los documentos is_plugin_active () en Codex.

Aquí hay un ejemplo funcional que uso en mis paquetes de complementos premium para asegurarme de que el complemento base gratuito esté activo antes de invocar un objeto de complemento. Requiere que ciertos ganchos y filtros estén disponibles en el complemento base o se bloqueará.

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

Por otro lado, si tiene problemas con is_plugin_active () desde un inicio de sesión de administrador activo, es probable que esté probando antes de que se active admin_init. admin_menu se dispara antes de admin_init y hacer pruebas en admin_menu me ha "mordido" antes. El nombre "admin_init" que me parece contrario a la intuición ya que admin_menu ya está ejecutado. Pienso en init como "lo primero que se debe ejecutar" ... tal vez admin_kinda_init () sería mejor. :)

Lance Cleveland
fuente
Agregar include_once(ABSPATH.'wp-admin/includes/plugin.php');hizo el truco para mí. ¡Gracias!
Dave
8

Una solución rápida y sucia sería duplicar la función manualmente:

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

Es bastante corto, por lo que no debería ser demasiado difícil de implementar en su propio código como solución alternativa.

Tom Auger
fuente
4

Simple y fácil. Tomado de WP

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

y luego cualquier instancia de

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

   }

obtener la verificación de funcionamiento. Así que no más errores.

Spencer Labadie
fuente
1
Si está utilizando requireonce, probablemente no necesite verificar la función ...?
Phill Healey
Lo hace para asegurarse de que el complemento esté definido antes de intentar usarlo; de lo contrario, podría tener problemas más adelante.
Spencer Labadie
3

Preferí la respuesta de Tom Auger con cómo definir su propia función is_plugin_active en lugar de incluir plugin.php. Sin embargo, usar el mismo nombre de función causó que mi área de administración se bloqueara. Usando un nombre de función diferente lo resolvió:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
Jeroen
fuente
Estoy de acuerdo. Si bien puede verificar si hay conflictos en su declaración de la función, WP no lo hace y, por lo tanto, su WP activará un error.
Chris Sprague
1

¿Está utilizando is_plugin_activedentro del administrador o el front-end? Estoy bastante seguro de que is_plugin_activesolo es una función de administrador que se encuentra dentro de wp-admin / includes / plugin.php.

Además, ¿su archivo de complemento principal utiliza el Encabezado de archivo de Wordpress ? ¿Se incluye su complemento después de cargar el archivo plugin.php anterior?

Jonnybojangles
fuente
Esto está sucediendo dentro del administrador en la página de Complementos. El complemento tiene el encabezado de archivo WP sugerido. ¿Cómo puedo verificar si el complemento se incluye después de plugin.php?
Carl
1

Para depurar complementos activos:

var_dump(get_option(...));

Para buscar un complemento específico:

in_array(get_option(...));

La acción se llama " active_plugins" IIRC.

hakre
fuente
0

Ninguna de estas soluciones funcionó para mí, pero esto sí:

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

Encontré esta solución en codebangers.com

fenderflip
fuente