Funcția is_plugin_active nu există

15 feb. 2011, 01:59:14
Vizualizări: 36K
Voturi: 31

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).

5
Comentarii

Nu sunt sigur din descrierea ta - dacă aceasta este o problemă cu un plugin activat sau dacă încerci să faci ceva la activare sau în alte condiții specifice?

Rarst Rarst
15 feb. 2011 21:15:59

Am descoperit că function_exists('is_plugin_active') returnează fals atunci când este apelată din fișierul principal al plugin-ului, în afara unei metode, dar returnează adevărat atunci când este apelată în interiorul metodei care este chemată pentru acțiunea activated_plugin.

Carl Carl
16 feb. 2011 05:36:06

Pe ce pagină vezi eroarea? Pagina de plugin-uri (wp-admin/plugins.php)? Este înainte sau după ce activezi plugin-ul în cauză?
Rarst are un punct bun. Știi în ce moment al procesării apelezi funcția în WordPress?

Jonnybojangles Jonnybojangles
16 feb. 2011 21:58:30

Văd eroarea în wp-admin/plugins.php după ce activez pluginul. Am verificat în unele dintre metodele care sunt conectate ca acțiuni și funcționează acolo. Se pare că are legătură cu ordinea de includere.

Carl Carl
17 feb. 2011 01:37:40

Plugin-urile sunt încărcate în ordine alfabetică, așa că poate fi pur și simplu faptul că plugin-ul tău nu este procesat suficient de devreme. Încearcă să redenumești plugin-ul să înceapă cu litera a (de exemplu a_myplugin-name) pentru a se încărca mai devreme. Cea mai bună opțiune ar fi să apelezi blocul tău function_exists dintr-o funcție care rulează după ce plugin-urile sunt încărcate. Poți vedea ordinea aproximativă de rulare pe WP codex: https://codex.wordpress.org/Plugin_API/Action_Reference

Phill Healey Phill Healey
19 feb. 2019 21:07:04
Toate răspunsurile la întrebare 11
2
45

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' );
15 feb. 2011 03:12:53
Comentarii

Dacă sunt deja în panoul de administrare, există ceva care ar putea fi configurat greșit și care să-mi interzică accesul la asta?

Carl Carl
15 feb. 2011 16:03:48

Vezi răspunsul actualizat.

scribu scribu
30 apr. 2011 03:06:09
1
20

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. :)

26 feb. 2013 20:45:06
Comentarii

Adăugarea include_once(ABSPATH.'wp-admin/includes/plugin.php'); a funcționat pentru mine. Mulțumesc!

Dave Dave
12 apr. 2018 03:42:27
0
14

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ă.

30 apr. 2011 02:14:42
2

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.

15 iul. 2014 01:34:40
Comentarii

Dacă folosești requireonce probabil nu ai nevoie să verifici funcția... ?

Phill Healey Phill Healey
23 mar. 2017 22:07:12

Faci asta pentru a te asigura că plugin-ul este definit înainte de a încerca să-l folosești, altfel ai putea avea probleme pe parcurs.

Spencer Labadie Spencer Labadie
19 feb. 2019 20:06:49
1

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() ) );
}
3 oct. 2015 12:19:18
Comentarii

Sunt de acord. Deși poți verifica dacă există conflicte în declarația funcției tale, WP nu face acest lucru și, prin urmare, WP-ul tău va declanșa o eroare.

Chris Sprague Chris Sprague
9 sept. 2018 13:54:23
0

Pentru a depana plugin-urile active:

var_dump(get_option(...));

Pentru a verifica un anumit plugin:

in_array(get_option(...));

Acțiunea se numește "active_plugins" dacă îmi amintesc corect.

15 feb. 2011 02:46:44
1

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?

15 feb. 2011 03:23:15
Comentarii

Aceasta se întâmplă în cadrul administrării pe pagina de Plugini. Pluginul are antetul de fișier WP recomandat. Cum pot verifica dacă pluginul este inclus după plugin.php?

Carl Carl
15 feb. 2011 16:02:40
0

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;
}
29 oct. 2020 10:11:58
0

Puteți verifica dacă un plugin este activ astfel:

/**
 * Verifică dacă Some Plugin este activ
 **/
if ( in_array( 'some-plugin/some-plugin.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Puneți aici codul pentru plugin
}
30 nov. 2020 13:50:11
0

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

3 iun. 2014 17:57:33
0

Îmi place soluția rapidă și simplă:

if (in_array('some-plugin', (array) get_option('active_plugins', array()))) {
       // ... fă ceva
}
26 mar. 2025 11:22:41