A função is_plugin_active não existe

15

Estou usando o WordPress 3.0.5 e testei com 3.1rc4. No arquivo PHP principal do meu plug-in, quando tento chamar is_plugin_active, recebo Call to undefined function is_plugin_active(). Eu posso chamar add_action e add_filter. O que devo verificar / alterar para corrigir isso?

Isso está acontecendo dentro do administrador na página Plugins. No topo do meu arquivo principal de plug-in que tenho, if (function_exists('is_plugin_active')) {que sempre retorna false.

Também não consigo ver as funções do meu arquivo principal de plug-in em outros plug-ins (se isso ajudar).

Carl
fonte
Não tenho certeza da sua descrição - se isso é problema com o plug-in ativado ou se você está tentando fazer algo na ativação ou sob outras condições específicas?
Rarst
Descobri que isso function_exists('is_plugin_active')é falso quando chamado do arquivo principal do plug-in se estiver fora de um método, mas é verdadeiro quando chamado dentro do método chamado para a activated_pluginação.
24611 Carl
Em qual página você vê o erro? A página do plugin (wp-admin / plugins.php)? Isso é antes ou depois de você ativar o plug-in em questão? Rarst tem um bom argumento. Você sabe em que momento você está chamando a função no wordpress?
21711 Jonnybojangles
Vejo o erro em wp-admin / plugins.php depois de ativar o plug-in. Eu tenho o check-in em alguns dos métodos que estão ligados como ações e funciona lá. Parece que tem algo a ver com a ordem de inclusão.
22411 Carl
Os plug-ins são carregados em ordem alfabética, portanto, pode ser que o plug-in não esteja sendo processado com antecedência suficiente. Tente renomear seu plug-in para começar com a letra a (por exemplo, a_myplugin-name) para que ele carregue mais cedo. A melhor opção, no entanto, seria chamar o bloco function_exists de uma função que é executada após o carregamento dos plug-ins. Você pode ver a ordem de execução aproximada no codex do WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Respostas:

27

Isso ocorre porque o arquivo no qual is_plugin_active () está definido - wp-admin/includes/plugin.php- é carregado apenas no administrador, após o carregamento do plug-in.

Portanto, você só pode chamá-lo depois que o 'admin_init' for acionado:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );
scribu
fonte
Se eu já estiver no administrador, há algo que pode estar configurado incorretamente que me permitiria o acesso a isso?
15241 Carl
1
Veja a resposta atualizada.
scribu
10

Você pode chamar is_plugin_active () nos modelos e também nas páginas dos usuários, o que pode ser útil para plugins relacionados (por exemplo, é necessário o plug-in 'xyz' para operar meu novo plug-in). Você precisa incluir manualmente o arquivo plugin.php, conforme observado nos documentos is_plugin_active () no Codex.

Aqui está um exemplo funcional que eu uso nos meus pacotes de complementos premium para garantir que o plug-in de base livre esteja ativo antes de chamar um objeto de complemento. Requer que certos ganchos e filtros estejam disponíveis no plug-in de base ou ele trava.

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

Como um aparte, se você estiver tendo problemas com o is_plugin_active () de dentro de um login de administrador ativo, é provável que esteja testando antes que o admin_init seja acionado. O admin_menu é acionado antes do admin_init e a realização de testes no admin_menu "já havia me mordido". O nome "admin_init", que me parece contra-intuitivo, pois o admin_menu já está em execução. Eu penso no init como "a primeira coisa a ser executada" ... talvez admin_kinda_init () seja melhor. :)

Lance Cleveland
fonte
Adicionando include_once(ABSPATH.'wp-admin/includes/plugin.php');fez o truque para mim. Obrigado!
Dave
8

Uma solução rápida e suja seria duplicar a função manualmente:

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

Como é bastante curto, não deve ser muito difícil implementar em seu próprio código como solução alternativa.

Tom Auger
fonte
4

Simples e fácil. Retirado do WP

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

e, em seguida, quaisquer instâncias de

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

   }

obtenha a verificação da função. Portanto, não há mais erros.

Spencer Labadie
fonte
1
Se você estiver usando, requireonceprovavelmente não precisará verificar a função ...?
precisa
Você faz isso para garantir que o plug-in esteja definido antes de tentar usá-lo; caso contrário, poderá encontrar problemas na linha.
Spencer Labadie
3

Eu preferi a resposta de Tom Auger com como definir sua própria função is_plugin_active em vez de incluir o plugin.php. No entanto, o uso do mesmo nome de função causou uma falha na minha área de administração. O uso de um nome de função diferente resolveu:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
Jeroen
fonte
Concordo. Enquanto você pode verificar se há conflito na sua declaração da função, o WP não o faz e, portanto, o seu WP acionará um erro.
22818 Chris Sprague às
1

Você está usando is_plugin_activedentro do administrador ou do front-end? Tenho certeza de que is_plugin_activeé apenas uma função administrativa encontrada em wp-admin / includes / plugin.php.

Além disso, o seu arquivo principal de plug-in faz uso do Wordpress File Header ? Seu plug-in está sendo incluído após o carregamento do arquivo plugin.php acima?

Jonnybojangles
fonte
Isso está acontecendo dentro do administrador na página Plugins. O plug-in tem o cabeçalho do arquivo WP sugerido. Como posso verificar se o plugin está sendo incluído após o plugin.php?
15241 Carl
1

Para depurar plugins ativos:

var_dump(get_option(...));

Para verificar um plugin específico:

in_array(get_option(...));

A ação é chamada " active_plugins" IIRC.

hakre
fonte
0

Nenhuma dessas soluções funcionou para mim, mas isso funcionou:

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

Encontrei esta solução em codebangers.com

fenderflip
fonte