Как проверить активирован ли WooCommerce в теме WordPress
Я создаю тему с WooCommerce, которая содержит следующее:
<ul>
<li>
<?php
if( is_user_logged_in() ){
?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Мой аккаунт', 'woothemes' ); ?>"><?php _e( 'Мой аккаунт', 'woothemes' ); ?></a>
<?php } else { ?>
<a href="<?php echo get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); ?>" title="<?php _e( 'Войти', 'woothemes' ); ?>"><?php _e( 'Войти', 'woothemes' ); ?></a>
<?php
}
?>
</li>
<li>
<a href="<?php echo get_option( 'home' ) . '/' . 'my-lists/' ?>" title="Мой список желаний">Список желаний</a>
</li>
<!--
<li><a href="#" title="Обновления по email">Обновления по 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( 'Просмотр корзины', 'woothemes' ); ?>"><?php echo sprintf( _n( '%d товар', 'Моя корзина (%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>
Однако это ломает сайт, если плагин WooCommerce не активирован. Как можно проверить, активирован ли плагин WooCommerce?

class_exists('WooCommerce')
вернет false, если код размещен в functions.php во время "активации плагина" (плагин будет активирован после проверки на наличие класса WooCommerce).

Значит, это вернет false, если кто-то загрузит страницу в точный момент активации плагина?

Невозможно загрузить страницу в "точный момент", можно загрузить на 1 мс раньше или позже.
Здесь важно быть внимательным, потому что если вы объявите какую-то функцию Woo для условия, когда WooCommerce не существует (например, вашу собственную is_woocommerce()
), то при попытке активации плагина WooCommerce вы получите фатальную ошибку. Это произойдет потому, что ваша функция зарегистрируется первой, и только потом WooCommerce попытается зарегистрировать свою функцию is_woocommerce()
, что вызовет фатальную ошибку и предотвратит активацию плагина WooCommerce.

Как это может помешать загрузке WooCommerce? Если вы назовете функцию, которая совпадает с чем-то внутри WooCommerce?

Это вызовет Фатальную ошибку: "Cannot redeclare function is_woocommerce"
. Попробуйте.

Верно, но моя точка в том, что ошибка возникнет только если вы объявите функцию, которая уже объявлена в WooCommerce. Простое обнаружение её наличия в теме, как указано в вопросе, не будет затронуто этим.

Чтобы проверить, активен ли WooCommerce или любой другой плагин, вставьте следующий код в шаблон, где вы хотите отобразить сообщение.
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce активен.';
} else {
echo 'WooCommerce не активен.';
}

Этот ответ, похоже, является официальным способом сделать это. Смотрите https://docs.woothemes.com/document/create-a-plugin/ .

Это неправильно, так как не работает в мультисайте, их документация ошибочна, используйте class_exist вместо этого.

class_exist не определяет woocommerce в мультисайте у меня (WP 5.4.1, WC 4.1) ответ @Arshid KK ниже работает: https://wordpress.stackexchange.com/a/274000/34517

Я бы проверял наличие класса только после полной загрузки всех плагинов. Потому что в некоторых случаях это может дать ложный отрицательный результат.
add_action( 'plugins_loaded', 'see_all_plugins_loaded' );
function see_all_plugins_loaded() {
if ( class_exists( 'WooCommerce' ) ) {
// выполняем нужные действия
}
}

Новый официальный способ с поддержкой мультисайта:
// Проверяем, активен ли WooCommerce (включая сетевую активацию).
$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() )
) {
// Пользовательский код здесь. WooCommerce активен, однако он не обязательно
// инициализирован (когда это важно, используйте действие `woocommerce_init`).
}

Я использую:
$is_woo = (function_exists('is_woocommerce') || class_exists( 'WooCommerce' ) );
if($is_woo){
// WooCommerce активен
}else{
// WooCommerce не активен
}
Вы также можете использовать этот простой метод:
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 активен
}else{
// WooCommerce не активен
}
