Cum verifici dacă un plugin (WooCommerce) este activ?

8 iul. 2015, 23:47:48
Vizualizări: 31.1K
Voturi: 14

Încerc să modific header-ul și footer-ul paginilor WooCommerce. Am o instrucțiune if care ar trebui să țintească magazinul și coșul WooCommerce, dar nu funcționează. Dacă modific PHP-ul după instrucțiunea if nu se schimbă nimic. Dar dacă modific PHP-ul în instrucțiunea else funcționează:

Aceasta nu funcționează:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/CHANGE'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/page-header'); ?>
<?php endif ?>

Aceasta funcționează:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/CHANGE'); ?>
<?php endif ?>

Cred că funcția WooCommerce nu este definită corect, deoarece și aceasta funcționează:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
0
Toate răspunsurile la întrebare 7
7
27

Editarea ta m-a adus la această idee, într-adevăr nu există o funcție numită »woocommerce«, dar există o clasă »WooCommerce«. Un lucru de care trebuie să ții cont este că verificarea trebuie să se facă suficient de târziu, astfel încât plugin-urile să fie deja inițializate, altfel - evident - clasa nu va exista și verificarea va returna false. Deci verificarea ta ar trebui să arate astfel:

if ( class_exists( 'WooCommerce' ) ) {
  // codul tău aici
} else {
  // alt cod
}

Pe pagina de documentație WooCommerce »Crearea unui plugin pentru WooCommerce« am găsit acest lucru:

/**
 * Verifică dacă WooCommerce este activ
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Pune codul pluginului tău aici
}

Personal, cred că nu este la fel de fiabilă ca verificarea clasei. Din motive evidente, ce se întâmplă dacă numele folderului/fișierului este diferit, dar ar trebui să funcționeze și așa. În plus, dacă faci așa, atunci există o funcție API pe care o poți folosi, numită potrivit is_plugin_active(). Dar, deoarece este disponibilă în mod normal doar pe paginile de administrare, trebuie să o faci disponibilă prin includerea fișierului wp-admin/includes/plugin.php, unde se află funcția. Folosind-o, verificarea ar arăta astfel:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // codul tău aici
} else {
  // alt cod
}
9 iul. 2015 00:02:17
Comentarii

Aceasta ar putea fi un joc distractiv de "petrecere", găsind alte metode ;-) Permite-mi să mă alătur cu if( function_exists( 'WC' ) ), dar este mai precis să ai numele plugin-ului în verificarea clasei, așa cum ai sugerat ;-)

birgire birgire
9 iul. 2015 02:05:26

Este un joc distractiv de petrecere :) Presupun că vorbești ipotetic, pentru că, din câte știu eu, nu există funcția WC. Deci probabil e vorba de a crește gradul de conștientizare despre function_exists(). Nu am adăugat-o în răspuns, pentru că OP a acoperit deja acest aspect în întrebarea sa. @birgire

Nicolai Grossherr Nicolai Grossherr
9 iul. 2015 11:16:21

De fapt, această funcție WC() există, doar încercam să găsesc o cale mai scurtă referindu-mă la ea ;-) Cred că ar fi mai precis cu if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) ) ;-). Continuând jocul, am putea testa și constante (de ex. WOOCOMMERCE_VERSION) sau acțiuni (de ex. did_action( 'woocommerce_loaded' )) ;-) @ialocin

birgire birgire
9 iul. 2015 11:28:25

Adevărat, la urma urmei există o mulțime de posibilități! @birgire

Nicolai Grossherr Nicolai Grossherr
9 iul. 2015 11:32:16

da, de aici și ideea de joc de petrecere ;-)

birgire birgire
9 iul. 2015 11:33:56

Da, am înțeles :) Deci WPSE este cam versiunea online a »99 de moduri de a-ți rezolva problemele PHP/WordPress« - a trebuit să o formulez, să o fac oficială :) @birgire

Nicolai Grossherr Nicolai Grossherr
9 iul. 2015 11:46:26

Acest răspuns NU este de încredere. Deoarece nici întrebarea, nici răspunsul nu specifică în mod explicit contextul, este posibil ca WooCommerce să fie activ, dar încărcat după acest cod. De exemplu, într-un alt plugin care se încarcă întâmplător înainte. Verificarea clasei sugerate este mult mai sigură, dacă o înfășurați suplimentar în hook-ul plugins_loaded. Adică înfășurați condiția if într-o funcție check_for_woocommerce() și înregistrați-o cu add_action('plugins_loaded', 'check_for_woocommerce');

kontur kontur
30 oct. 2017 15:27:35
Arată celelalte 2 comentarii
1

Multe dintre plugin-urile oficiale WooCommerce rezolvă acest lucru prin verificarea constantei WC_VERSION, pe care WooCommerce o definește, după ce toate plugin-urile s-au încărcat. Cod simplificat:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // nu există WooCommerce :(
    } else {
        var_dump("WooCommerce instalat în versiunea", WC_VERSION);
    }
}

Bonusul adăugat este că poți folosi funcția PHP version_compare() pentru a verifica în continuare dacă este instalată o versiune suficient de nouă de WooCommerce (dacă codul tău necesită funcționalități specifice), deoarece constanta WC_VERSION este potrivită pentru aceasta.

30 oct. 2017 15:38:48
Comentarii

aceasta este o metodă foarte bună. Sfat bun pentru dezvoltatorii de plugin-uri să includă și ei.

Jacob Raccuia Jacob Raccuia
29 ian. 2018 17:11:59
2

Pentru a îmbunătăți răspunsurile oferite, folosim următoarea abordare:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Puneți codul plugin-ului aici
}

Aceasta preîntâmpină două probleme:

  • WooCommerce instalat într-un director nestandard - caz în care if ( in_array( 'woocommerce/woocommerce.php', apply_filters(... nu funcționează.
  • Această verificare este invocată înainte ca WooCommerce să fie încărcat - caz în care if ( class_exists( 'WooCommerce' ) ) { .. } nu funcționează.
17 nov. 2016 13:50:55
Comentarii

Acest răspuns este util pentru dezvoltatorii de plugin-uri, deoarece poți pur și simplu să înfășori întregul fișier principal al plugin-ului tău cu această instrucțiune IF.

Dave Hilditch Dave Hilditch
30 apr. 2019 11:59:57

Aceasta a fost singura soluție care a funcționat pentru mine în plugin-ul meu! Mulțumesc!!!

Sam Sam
19 mai 2019 01:12:45
0

Am găsit acest lucru util din documentația pentru dezvoltatorii WooCommerce.

Puteți apela simplu funcția is_woocommerce_active() în fișierul pluginului dumneavoastră.

Exemplu

if ( ! is_woocommerce_active() ) 
{
    add_action( 'admin_notices', 'WC_Subscriptions::woocommerce_inactive_notice' );
    return;
}

is_woocommerce_active definit după cum urmează conform documentației WooCommerce

/**
 * Verifică dacă WooCommerce este activat
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
11 dec. 2019 19:22:55
0

Soluția pe care o folosesc în 2021:

add_action( 'admin_init', 'my_plugin_check_if_woocommerce_installed' );
function my_plugin_check_if_woocommerce_installed() {

    // Dacă WooCommerce NU este instalat, dezactivează pluginul
    if ( is_admin() && current_user_can( 'activate_plugins') && !is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Afișează notificarea de eroare care poate fi închisă
        add_action( 'admin_notices', 'my_plugin_woocommerce_check_notice' );

        // Dezactivează acest plugin
        deactivate_plugins( plugin_basename( __FILE__) );
        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }
    }
    // Dacă WooCommerce este instalat, activează pluginul și continuă procesarea
    elseif ( is_admin() && is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Continuă procesarea aici
    }
}

// Afișează notificarea de eroare care poate fi închisă dacă WooCommerce nu este prezent
function my_plugin_woocommerce_check_notice() {
    ?>
    <div class="alert alert-danger notice is-dismissible">
        <p>Ne pare rău, dar acest plugin necesită WooCommerce pentru a funcționa.
            Vă rugăm să vă asigurați că WooCommerce este atât instalat, cât și activat.
        </p>
    </div>
    <?php
}

Codul rulează pe acțiunea 'admin_init', în loc de 'register_activation_hook', deoarece are nevoie ca WooCommerce să fie încărcat și detectat cu succes. Astfel, dacă WooCommerce NU este detectat, face următoarele:

a) Afișează administratorului o notificare de eroare care poate fi închisă, despre absența WooCommerce. Aceasta este o abordare elegantă, deoarece nu folosește 'wp_die'.

b) Dezactivează automat pluginul personalizat.

Dacă WooCommerce este detectat, puteți continua cu adăugarea de link-uri în meniu, etc., după cum este necesar.

ATENȚIE:

  1. Soluția de mai sus funcționează cu presupunerea că numele de bază al pluginului WooCommerce și fișierul său principal rămân "woocommerce". Dacă acest lucru s-ar schimba în viitor, atunci verificările vor eșua. Deci, pentru a face acest cod să funcționeze atunci, ar trebui actualizat numele directorului WooCommerce și numele fișierului principal din codul de mai sus, în cadrul verificărilor if și elseif.

  2. Rețineți că dacă atât WooCommerce, cât și pluginul dumneavoastră sunt instalate și rulează cu succes, atunci dacă dezactivați WooCommerce din orice motiv, acest lucru va determina și dezactivarea automată a pluginului dumneavoastră.

2 dec. 2021 09:38:05
0

Acest cod este pentru suportul multisite.

$is_active = in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) );

if ( is_multisite() ) {
    if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
        include_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    if ( function_exists( 'is_plugin_active_for_network' ) ) {
        $is_active = is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) || $is_active;
    }
}

if ( $is_active ) {

}
14 ian. 2024 21:19:38
2

Puteți înfășura plugin-ul într-o verificare pentru a vedea dacă WooCommerce este instalat și activ sau nu:

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) {
echo 'WooCommerce este activ.';
} else {
echo 'WooCommerce nu este activ.';
}
28 iun. 2016 13:36:35
Comentarii

Acest lucru nu funcționează cu multisite-uri

Andrew Lazarus Andrew Lazarus
20 oct. 2016 14:38:16

@AndrewLazarus Mulțumesc pentru mențiune - tocmai am pierdut o oră cu această problemă! :)

wickywills wickywills
2 ian. 2019 15:27:33