Cum să verifici dacă WooCommerce este activat în temă
Creez o temă cu WooCommerce care conține următoarele:
<ul>
<li>
<?php
if( is_user_logged_in() ){
?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Contul Meu', 'woothemes' ); ?>"><?php _e( 'Contul Meu', 'woothemes' ); ?></a>
<?php } else { ?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Autentificare', 'woothemes' ); ?>"><?php _e( 'Autentificare', 'woothemes' ); ?></a>
<?php
}
?>
</li>
<li>
<a href="<?php echo get_option( 'home' ) . '/' . 'my-lists/' ?>" title="Lista mea de dorințe">Lista de dorințe</a>
</li>
<!--
<li><a href="#" title="Actualizări prin email">Actualizări Email</a></li>
-->
<li>
<?php
global $woocommerce;
?>
<a id="header-ShoppingCart" class="cart-contents" href="<?php echo $woocommerce->cart->get_cart_url(); ?>" title="<?php _e( 'Vezi coșul tău de cumpărături', 'woothemes' ); ?>"><?php echo sprintf( _n( '%d produs', 'Coșul meu (%d)', $woocommerce->cart->cart_contents_count, 'woothemes' ), $woocommerce->cart->cart_contents_count ); ?> - <span id="header-cartCount"><?php echo $woocommerce->cart->get_cart_total(); ?></span></a>
</li>
</ul>
Totuși, acest cod strică site-ul dacă plugin-ul WooCommerce nu este activat. Cum pot verifica dacă plugin-ul WooCommerce este activat?

class_exists('WooCommerce')
va returna false, dacă codul este plasat în functions.php în timp ce "se activează pluginul" (pluginul va fi activat după ce verifici existența clasei WooCommerce).

Deci acest lucru ar returna false dacă cineva încarcă pagina exact în momentul în care pluginul este în curs de activare?

Nu poți încărca la "momentul exact", poți încărca cu 1ms înainte sau după.
Este important să fii atent aici, deoarece, dacă declari o funcție Woo pentru o condiție în care WooCommerce nu există (cum ar fi propria ta funcție is_woocommerce()
), atunci vei primi o eroare fatală în momentul încerci să activezi WooCommerce Plugin, deoarece vei înregistra mai întâi funcția ta, iar abia apoi WooCommerce va încerca să înregistreze funcția lor is_woocommerce()
, iar acest lucru va provoca o eroare fatală și va împiedica activarea pluginului WooCommerce.

Cum ar împiedica asta WooCommerce să se încarce? Dacă ai denumit o funcție care coincide cu ceva din WooCommerce?

Ar declanșa o Eroare Fatală, "Cannot redeclare function is_woocommerce"
. Încearcă.

Corect, dar ideea mea este că ar eșua doar dacă ai declarat o funcție care este deja declarată în WooCommerce. Simpla detectare a existenței ei într-o temă, așa cum se menționează în întrebare, nu ar fi afectată de acest lucru.

Pentru a verifica dacă WooCommerce sau orice alt plugin este activ, inserează următorul cod în template-ul unde dorești să afișezi mesajul.
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce este activ.';
} else {
echo 'WooCommerce nu este activ.';
}

Acest răspuns pare să fie metoda oficială de a face acest lucru. Vezi https://docs.woothemes.com/document/create-a-plugin/ .

Aceasta este greșit, deoarece nu funcționează pe multisite, documentația lor este incorectă, folosește class_exist în schimb.

class_exist nu detectează woocommerce pe multisite pentru mine (WP 5.4.1, WC 4.1) Răspunsul lui @Arshid KK de mai jos funcționează: https://wordpress.stackexchange.com/a/274000/34517

Aș verifica clasa după ce toate plugin-urile sunt încărcate. Pentru că în unele cazuri poate returna un fals negativ.
add_action( 'plugins_loaded', 'see_all_plugins_loaded' );
function see_all_plugins_loaded() {
if ( class_exists( 'WooCommerce' ) ) {
// faci ce ai de făcut
}
}

Noul mod oficial de a face acest lucru cu suport pentru multisite:
// Testează dacă WooCommerce este activ (inclusiv activat în rețea).
$plugin_path = trailingslashit( WP_PLUGIN_DIR ) . 'woocommerce/woocommerce.php';
if (
in_array( $plugin_path, wp_get_active_and_valid_plugins() )
|| in_array( $plugin_path, wp_get_active_network_plugins() )
) {
// Cod personalizat aici. WooCommerce este activ, însă nu este
// neapărat inițializat (când acest lucru este important, ia în
// considerare utilizarea acțiunii `woocommerce_init`).
}

Eu folosesc:
$is_woo = (function_exist('is_woocommerce') || class_exists( 'WooCommerce' ) );
if($is_woo){
// WooCommerce este activ
}else{
// WooCommerce nu este activ
}
poți folosi și această metodă simplă:
function kdev_is_active_woocommerce(){
return (function_exists('is_woocommerce') || class_exists( 'WooCommerce' ) ) || ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) );
}
if(kdev_is_active_woocommerce()){
// WooCommerce este activ
}else{
// WooCommerce nu este activ
}
