Cómo verificar si WooCommerce está activado en el tema
Estoy creando un tema con WooCommerce que tiene lo siguiente:
<ul>
<li>
<?php
if( is_user_logged_in() ){
?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Mi Cuenta', 'woothemes' ); ?>"><?php _e( 'Mi Cuenta', 'woothemes' ); ?></a>
<?php } else { ?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Iniciar Sesión', 'woothemes' ); ?>"><?php _e( 'Iniciar Sesión', 'woothemes' ); ?></a>
<?php
}
?>
</li>
<li>
<a href="<?php echo get_option( 'home' ) . '/' . 'my-lists/' ?>" title="Mi Lista de Deseos">Lista de Deseos</a>
</li>
<!--
<li><a href="#" title="Actualizaciones por correo">Actualizaciones por Correo</a></li>
-->
<li>
<?php
global $woocommerce;
?>
<a id="header-ShoppingCart" class="cart-contents" href="<?php echo $woocommerce->cart->get_cart_url(); ?>" title="<?php _e( 'Ver tu carrito de compras', 'woothemes' ); ?>"><?php echo sprintf( _n( '%d item', 'Mi Bolsa (%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>
Sin embargo, esto rompe el sitio si el plugin WooCommerce no está activado. ¿Cómo puedo verificar si el plugin WooCommerce está activado?

class_exists('WooCommerce')
va a devolver falso, si el código está colocado en functions.php mientras se "activa el plugin" (el plugin se va a activar después de que verifiques la clase WooCommerce).

¿Entonces esto sería falso si alguien cargara la página exactamente en el momento en que se está activando el plugin?

No puedes cargar en el "momento exacto", puedes cargar 1ms antes o después.
Es importante prestar atención aquí, porque, si declaras alguna función de Woo para una condición donde WooCommerce no existe (como tu propia función is_woocommerce()
), entonces recibirás un error fatal al intentar activar el Plugin de WooCommerce, porque registrarás tu función primero, y solo entonces WooCommerce intentará registrar su función is_woocommerce()
, y eso va a causar un error fatal e impedirá que el plugin WooCommerce se active nunca.

¿Cómo evitaría que WooCommerce se cargue? ¿Si nombras una función que resultara ser la misma que algo dentro de WooCommerce?

Desencadenaría un Fatal Error, "Cannot redeclare function is_woocommerce"
. Pruébalo.

Correcto, pero mi punto es que solo fallaría si declaras una función que también esté declarada en WooCommerce. Simplemente detectar su existencia en un tema, como se menciona en la pregunta, no se vería afectado por esto.

Para verificar si WooCommerce o cualquier otro plugin está activo, pega el siguiente código en la plantilla donde deseas mostrar el mensaje.
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce está activo.';
} else {
echo 'WooCommerce no está activo.';
}

Esta respuesta parece ser la forma oficial de hacerlo. Consulta https://docs.woothemes.com/document/create-a-plugin/ .

Esto es incorrecto, ya que no funciona en multisitio, su documentación está equivocada, usa class_exist en su lugar.

class_exist no detecta woocommerce en multisitio para mí (WP 5.4.1, WC 4.1) La respuesta de @Arshid KK a continuación sí lo hace: https://wordpress.stackexchange.com/a/274000/34517

Yo realizaría la verificación de la clase una vez que todos los plugins estén cargados. Porque en algunos casos puede devolver un falso negativo.
add_action( 'plugins_loaded', 'verificar_plugins_cargados' );
function verificar_plugins_cargados() {
if ( class_exists( 'WooCommerce' ) ) {
// hacer lo que necesites
}
}

La nueva forma oficial de hacerlo con soporte multisitio:
// Comprueba si WooCommerce está activo (incluyendo activación en red).
$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() )
) {
// Código personalizado aquí. WooCommerce está activo, aunque no
// necesariamente inicializado (cuando eso es importante, considera
// usar la acción `woocommerce_init`).
}

Yo uso:
$is_woo = (function_exist('is_woocommerce') || class_exists( 'WooCommerce' ) );
if($is_woo){
// WooCommerce está activo
}else{
// WooCommerce no está activo
}
También puedes usar este método sencillo:
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 está activo
}else{
// WooCommerce no está activo
}
