Come verificare se WooCommerce è attivato nel tema
Sto creando un tema con WooCommerce che ha quanto segue:
<ul>
<li>
<?php
if( is_user_logged_in() ){
?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Il mio Account', 'woothemes' ); ?>"><?php _e( 'Il mio Account', 'woothemes' ); ?></a>
<?php } else { ?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Accedi', 'woothemes' ); ?>"><?php _e( 'Accedi', 'woothemes' ); ?></a>
<?php
}
?>
</li>
<li>
<a href="<?php echo get_option( 'home' ) . '/' . 'my-lists/' ?>" title="La mia Lista dei Desideri">Lista dei Desideri</a>
</li>
<!--
<li><a href="#" title="Aggiornamenti via email">Aggiornamenti via 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( 'Visualizza il tuo carrello', 'woothemes' ); ?>"><?php echo sprintf( _n( '%d articolo', 'Il mio Carrello (%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>
Tuttavia questo causa problemi al sito se il plugin WooCommerce non è attivato. Come posso verificare se il plugin WooCommerce è attivato?

class_exists('WooCommerce')
restituirà false, se il codice è posizionato in functions.php durante l'"attivazione del plugin" (il plugin verrà attivato dopo aver verificato la presenza della classe WooCommerce).

Quindi questo sarebbe falso se qualcuno caricasse la pagina esattamente nel momento in cui il plugin viene attivato?

Non puoi davvero caricare nel "momento esatto", puoi caricare 1ms prima o dopo.
È importante prestare attenzione qui, perché, se dichiari una qualche funzione Woo per una condizione in cui WooCommerce non esiste (come la tua funzione personalizzata is_woocommerce()
), riceverai un errore fatale quando tenti di attivare il Plugin WooCommerce, perché registrerai prima la tua funzione, e solo dopo WooCommerce tenterà di registrare la sua funzione is_woocommerce()
, e questo causerà un errore fatale impedendo l'attivazione del plugin WooCommerce.

Come potrebbe impedire a WooCommerce di caricarsi? Se hai nominato una funzione che per caso è la stessa di qualcosa all'interno di WooCommerce?

Scatenerebbe un Fatal Error, "Cannot redeclare function is_woocommerce"
. Provalo.

Esatto, ma il mio punto è che fallirebbe solo se dichiari una funzione che è già dichiarata in WooCommerce. Semplicemente rilevare la sua esistenza in un tema, come indicato nella domanda, non sarebbe influenzato da questo.

Per verificare se WooCommerce o qualsiasi altro plugin è attivo, incolla il seguente codice nel template dove vuoi visualizzare il messaggio.
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce è attivo.';
} else {
echo 'WooCommerce non è attivo.';
}

Questa risposta sembra essere il modo ufficiale per farlo. Vedi https://docs.woothemes.com/document/create-a-plugin/.

Questo è sbagliato, perché non funziona sul multisito, la loro documentazione è errata, usa class_exist invece.

class_exist non rileva woocommerce sul multisito per me (WP 5.4.1, WC 4.1) La risposta di @Arshid KK qui sotto funziona: https://wordpress.stackexchange.com/a/274000/34517

Eseguirei il controllo della classe solo dopo che tutti i plugin sono stati caricati. In alcuni casi, infatti, potrebbe restituire un falso negativo.
add_action( 'plugins_loaded', 'see_all_plugins_loaded' );
function see_all_plugins_loaded() {
if ( class_exists( 'WooCommerce' ) ) {
// fai quello che devi fare
}
}

Il nuovo metodo ufficiale per farlo con supporto multisito:
// Verifica se WooCommerce è attivo (incluso l'attivazione in rete)
$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() )
) {
// Codice personalizzato qui. WooCommerce è attivo, tuttavia non è
// necessariamente inizializzato (quando questo è importante, considera
// di usare l'azione `woocommerce_init`).
}

Io uso:
$is_woo = (function_exist('is_woocommerce') || class_exists( 'WooCommerce' ) );
if($is_woo){
// WooCommerce è attivo
}else{
// WooCommerce non è attivo
}
puoi usare anche questo metodo semplice:
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 è attivo
}else{
// WooCommerce non è attivo
}
