Funcția is_plugin_active nu există
Folosesc WordPress 3.0.5 și am testat cu 3.1rc4. În fișierul PHP principal al plugin-ului meu, când încerc să apelez is_plugin_active primesc eroarea Call to undefined function is_plugin_active()
. Pot apela add_action și add_filter. Ce ar trebui să verific/modific pentru a rezolva această problemă?
Acest lucru se întâmplă în panoul de administrare pe pagina Plugins. La începutul fișierului principal al plugin-ului meu am if (function_exists('is_plugin_active')) {
care returnează întotdeauna false.
De asemenea, nu pot vedea funcțiile din fișierul principal al plugin-ului meu în alte plugin-uri (dacă acest lucru ajută cu ceva).

Asta se întâmplă pentru că fișierul în care este definită funcția is_plugin_active() - wp-admin/includes/plugin.php
- este încărcat doar în administrare, după ce plugin-ul tău a fost încărcat.
Prin urmare, poți apela această funcție doar după ce acțiunea 'admin_init' a fost declanșată:
function check_some_other_plugin() {
if ( is_plugin_active('some-plugin.php') ) {
...
}
}
add_action( 'admin_init', 'check_some_other_plugin' );

Puteți apela funcția is_plugin_active() în șabloane și din paginile utilizatorului, ceea ce poate fi util pentru plugin-uri conexe (de exemplu, necesită ca plugin-ul 'xyz' să fie activ pentru ca noul meu plugin să funcționeze). Trebuie să includeți manual fișierul plugin.php așa cum este menționat în documentația is_plugin_active() din Codex.
Iată un exemplu funcțional pe care îl folosesc în pachetele mele premium de add-on-uri pentru a mă asigura că plugin-ul de bază gratuit este activ înainte de a invoca un obiect add-on. Acesta necesită anumite hook-uri și filtre să fie disponibile în plugin-ul de bază, altfel va genera erori.
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;
}
Ca o observație laterală, dacă întâmpinați probleme cu is_plugin_active() din interiorul unei sesiuni de administrare activă, este probabil pentru că testați înainte ca admin_init să se declanșeze. admin_menu se execută înaintea admin_init, iar efectuarea de teste în admin_menu m-a "mușcat" în trecut. Denumirea "admin_init" mi se pare contraintuitivă, având în vedere că admin_menu deja s-a executat. Eu mă gândesc la init ca la "primul lucru care se execută"... poate admin_kinda_init() ar fi mai potrivit. :)

O soluție rapidă și improvizată ar fi să duplicăm manual funcția:
if ( ! function_exists( 'is_plugin_active' ) ) {
function is_plugin_active( $plugin ) {
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
}
Este destul de scurtă, așa că nu ar trebui să fie prea dificil să o implementezi în propriul cod ca o soluție temporară.

Simplu și ușor. Luat din WP
if ( ! function_exists( 'is_plugin_active' ) )
require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
și apoi orice instanță de
if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {
}
primește verificarea funcției. Deci nu mai există erori.

Am preferat răspunsul lui Tom Auger cu definirea propriei funcții is_plugin_active în loc să includ plugin.php. Cu toate acestea, folosirea aceluiași nume de funcție a blocat zona de administrare. Folosirea unui nume diferit de funcție a rezolvat problema:
function is_plugin_active_byme( $plugin ) {
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

Folosești is_plugin_active
în zona de administrare sau pe front-end? Sunt destul de sigur că is_plugin_active
este doar o funcție disponibilă în administrație, care se găsește în wp-admin/includes/plugin.php.
În plus, fișierul principal al plugin-ului tău utilizează Wordpress File Header? Este plugin-ul tău încărcat după ce fișierul plugin.php menționat mai sus este încărcat?

Dacă utilizați Elementor și întâmpinați problema doar în frontend, dar funcționează în modul de editare.
Puteți folosi funcția is_edit_mode()
din Elementor, astfel încât condiția să ruleze doar în modul de editare.
if ( \Elementor\Plugin::$instance->editor->is_edit_mode() && is_plugin_active('some-plugin.php') ) {
return true;
} else {
return false;
}

Nici una dintre aceste soluții nu a funcționat pentru mine, dar asta a funcționat:
include_once('wp-admin/includes/plugin.php');
Am găsit această soluție pe codebangers.com
