Как проверить активирован ли WooCommerce в теме WordPress

26 авг. 2014 г., 18:36:41
Просмотры: 41.3K
Голосов: 11

Я создаю тему с 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?

0
Все ответы на вопрос 6
7
36

Вы можете проверить, существует ли класс 'WooCommerce', и затем выполнить код, который требует WooCommerce.

<?php
if ( class_exists( 'WooCommerce' ) ) {
  // код, требующий WooCommerce
} else {
  // похоже, WooCommerce не активирован
}
?>
26 авг. 2014 г. 18:42:54
Комментарии

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

pyronaur pyronaur
28 янв. 2015 г. 13:58:52

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

hereswhatidid hereswhatidid
28 янв. 2015 г. 16:49:48

Невозможно загрузить страницу в "точный момент", можно загрузить на 1 мс раньше или позже.

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

pyronaur pyronaur
29 янв. 2015 г. 18:14:04

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

hereswhatidid hereswhatidid
29 янв. 2015 г. 18:28:45

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

pyronaur pyronaur
30 янв. 2015 г. 16:35:58

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

hereswhatidid hereswhatidid
30 янв. 2015 г. 17:37:53

Да, и я не спорю с тобой, я просто публикую актуальную информацию на случай, если кто-то решит переопределить функцию, если WooCommerce не существует

pyronaur pyronaur
5 февр. 2015 г. 11:38:14
Показать остальные 2 комментариев
3
13

Чтобы проверить, активен ли WooCommerce или любой другой плагин, вставьте следующий код в шаблон, где вы хотите отобразить сообщение.

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    echo 'WooCommerce активен.';
} else {
    echo 'WooCommerce не активен.';
}
2 февр. 2016 г. 22:54:50
Комментарии

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

Boycott A.I. Boycott A.I.
8 мар. 2016 г. 19:25:30

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

Goran Jakovljevic Goran Jakovljevic
8 июн. 2016 г. 14:19:32

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

Larzan Larzan
16 мая 2020 г. 23:04:59
1

Используйте следующий код. Он будет работать и в мультисайтовой среде.

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php') ) {
  // Здесь можно выполнить нужные действия, если WooCommerce установлен
}
20 июл. 2017 г. 12:51:03
Комментарии

На данный момент это должно быть принятым ответом.

Aleksandar Aleksandar
7 янв. 2021 г. 19:12:17
0

Я бы проверял наличие класса только после полной загрузки всех плагинов. Потому что в некоторых случаях это может дать ложный отрицательный результат.

add_action( 'plugins_loaded', 'see_all_plugins_loaded' );

function see_all_plugins_loaded() {
   if ( class_exists( 'WooCommerce' ) ) {
       // выполняем нужные действия
   }
 }
10 окт. 2022 г. 03:19:16
0

Новый официальный способ с поддержкой мультисайта:

// Проверяем, активен ли 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`).
}
21 апр. 2023 г. 21:56:01
0

Я использую:

$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 не активен
}
19 окт. 2023 г. 21:31:02