La funzione is_plugin_active non esiste


15

Sto usando WordPress 3.0.5 e ho testato con 3.1rc4. Nel file PHP principale del mio plugin, quando provo a chiamare is_plugin_active ottengo Call to undefined function is_plugin_active(). Posso chiamare add_action e add_filter. Cosa devo controllare / modificare per risolvere questo problema?

Questo accade all'interno dell'amministratore nella pagina Plugin. Nella parte superiore del mio file plugin principale che ho, if (function_exists('is_plugin_active')) {che restituisce sempre false.

Inoltre non riesco a vedere le funzioni dal mio file di plugin principale in altri plugin (se ciò aiuta).


Non sono sicuro dalla tua descrizione: se questo è un problema con il plugin attivato o se stai cercando di fare qualcosa all'attivazione o in altre condizioni specifiche?
Rarst

Ho scoperto che function_exists('is_plugin_active')è falso quando viene chiamato dal file del plugin principale se al di fuori di un metodo ma è vero quando viene chiamato all'interno del metodo chiamato per l' activated_pluginazione.
Carl,

In quale pagina vedi l'errore? La pagina del plugin (wp-admin / plugins.php)? È prima o dopo aver attivato il plugin in questione? Rarst ha un buon punto. Sai a che punto stai chiamando la funzione in wordpress?
Jonnybojangles,

Vedo l'errore su wp-admin / plugins.php dopo aver attivato il plugin. Ho il controllo in alcuni dei metodi che sono collegati come azioni e funziona lì. Sembra che abbia qualcosa a che fare con l'ordine di inclusione.
Carl,

I plug-in vengono caricati in ordine alfabetico, quindi potrebbe essere che il plug-in non sia stato elaborato abbastanza presto. Prova a rinominare il tuo plugin per iniziare con la lettera a (es. A_myplugin-name) in modo che si carichi prima. L'opzione migliore sarebbe comunque quella di chiamare il blocco function_exists all'interno di una funzione che viene eseguita dopo il caricamento dei plug-in. Puoi vedere l'ordine approssimativo di esecuzione sul codice WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Risposte:


27

Questo perché il file in cui è definito is_plugin_active () - wp-admin/includes/plugin.php- viene caricato solo nell'amministratore , dopo il caricamento del plug-in.

Pertanto, puoi chiamarlo solo dopo che "admin_init" è stato attivato:

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

Se sono già nell'amministratore, c'è qualcosa che potrebbe essere configurato in modo errato che mi impedirebbe di accedervi?
Carl,

1
Vedi la risposta aggiornata.
scribu,

10

Puoi chiamare is_plugin_active () nei modelli e anche dalle pagine degli utenti, il che può essere utile per i plug-in correlati (ad esempio, per utilizzare il mio nuovo plug-in è necessario il plug-in 'xyz'). Devi includere manualmente il file plugin.php come indicato nei documenti is_plugin_active () su Codex.

Ecco un esempio funzionale che utilizzo nei miei pacchetti di componenti aggiuntivi premium per assicurarmi che il plug-in di base gratuito sia attivo prima di invocare un oggetto aggiuntivo. Richiede che alcuni hook e filtri siano disponibili nel plug-in di base o si bloccherà.

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

A parte questo, se riscontri problemi con is_plugin_active () dall'interno di un login di amministratore attivo, è probabile che tu stia testando prima che admin_init si attivi. admin_menu spara prima che admin_init e fare test in admin_menu mi abbia "morso" prima. Il nome "admin_init" che mi sembra poco intuitivo poiché admin_menu è già in esecuzione. Penso a init come "prima cosa da eseguire" ... forse admin_kinda_init () sarebbe meglio. :)


L'aggiunta ha include_once(ABSPATH.'wp-admin/includes/plugin.php');fatto il trucco per me. Grazie!
Dave,

8

Una soluzione rapida e sporca sarebbe duplicare manualmente la funzione:

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

È piuttosto breve, quindi non dovrebbe essere troppo difficile da implementare nel proprio codice come soluzione alternativa.


4

Semplice e facile. Tratto da WP

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

e quindi qualsiasi istanza di

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

   }

ottenere il controllo delle funzioni. Quindi non più errori.


1
Se stai usando requireonceprobabilmente non è necessario controllare la funzione ...?
Phill Healey,

Lo fai in modo da assicurarti che il plugin sia definito prima di provare a usarlo, altrimenti potresti incorrere in problemi lungo la linea.
Spencer Labadie,

3

Ho preferito la risposta di Tom Auger su come definire la tua funzione is_plugin_active invece di includere plugin.php. Tuttavia, l'utilizzo dello stesso nome di funzione ha causato l'arresto anomalo della mia area di amministrazione. Utilizzando un nome di funzione diverso risolto:

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

Sono d'accordo. Mentre è possibile verificare la presenza di conflitti nella dichiarazione della funzione, il WP non lo fa e quindi il WP genererà un errore.
Chris Sprague,

1

Stai utilizzando is_plugin_activeall'interno dell'amministratore o del front-end? Sono abbastanza sicuro che is_plugin_activesia solo una funzione di amministrazione che si trova all'interno di wp-admin / Includes / plugin.php.

Inoltre, il file del plug-in principale utilizza l' intestazione del file Wordpress ? Il tuo plugin è stato incluso dopo aver caricato il file plugin.php sopra?


Questo accade all'interno dell'amministratore nella pagina Plugin. Il plugin ha l'intestazione del file WP suggerita. Come posso verificare se il plugin è stato incluso dopo plugin.php?
Carl,

1

Per eseguire il debug dei plug-in attivi:

var_dump(get_option(...));

Per verificare la presenza di un plug-in specifico:

in_array(get_option(...));

L'azione si chiama " active_plugins" IIRC.


0

Nessuna di queste soluzioni ha funzionato per me, ma questo ha funzionato:

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

Ho trovato questa soluzione su codebangers.com

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.