Как проверить активен ли плагин (WooCommerce)?

8 июл. 2015 г., 23:47:48
Просмотры: 31.1K
Голосов: 14

Я пытаюсь изменить шапку и подвал моих страниц WooCommerce. У меня есть условие if, которое должно работать для страниц магазина и корзины WooCommerce, но оно не работает. Если я изменяю PHP после оператора if, ничего не меняется. Но если я изменяю PHP в операторе else, это работает:

Это не работает:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/CHANGE'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/page-header'); ?>
<?php endif ?>

Это работает:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/CHANGE'); ?>
<?php endif ?>

Я думаю, что функция WooCommerce может быть неправильно определена, потому что это тоже работает:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
0
Все ответы на вопрос 7
7
27

Ваша правка натолкнула меня на эту идею, действительно, нет функции под названием "woocommerce", но есть класс »WooCommerce«. Важно учитывать, что проверка должна выполняться достаточно поздно, чтобы плагины успели инициализироваться, иначе — очевидно — класс не будет существовать, и проверка вернет false. Поэтому ваша проверка должна выглядеть так:

if ( class_exists( 'WooCommerce' ) ) {
  // какой-то код
} else {
  // другой код
}

На странице документации WooCommerce »Создание плагина для WooCommerce« я нашел следующее:

/**
 * Проверяет, активен ли WooCommerce
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Ваш код плагина здесь
}

Лично я считаю, что это не так надежно, как проверка наличия класса. По очевидным причинам: что, если имя папки/файла отличается, но плагин должен работать корректно. Кроме того, если вы делаете так, то есть API-функция, которую можно использовать, логично названная is_plugin_active(). Но поскольку она обычно доступна только на страницах админки, вам нужно сделать её доступной, подключив файл wp-admin/includes/plugin.php, где находится эта функция. Используя её, проверка будет выглядеть так:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // какой-то код
} else {
  // другой код
}
9 июл. 2015 г. 00:02:17
Комментарии

Это может быть забавной "вечеринкой" игр, поиск других способов ;-) Позвольте мне присоединиться с if( function_exists( 'WC' ) ), но более точно использовать проверку класса с именем плагина, как вы предложили ;-)

birgire birgire
9 июл. 2015 г. 02:05:26

Это забавная игра :) Полагаю, вы говорите гипотетически, потому что, насколько мне известно, функции WC не существует. Так что речь идет о повышении осведомленности о function_exists(). Я не добавил это в ответ, потому что автор вопроса уже упомянул это в своем вопросе. @birgire

Nicolai Grossherr Nicolai Grossherr
9 июл. 2015 г. 11:16:21

На самом деле функция WC() существует, я просто пытался найти более короткий способ, ссылаясь на нее ;-) Думаю, было бы точнее использовать if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) ) ;-). Играя дальше, мы также могли бы проверять константы (например, WOOCOMMERCE_VERSION) или действия (например, did_action( 'woocommerce_loaded' )) ;-) @ialocin

birgire birgire
9 июл. 2015 г. 11:28:25

Действительно, в конечном итоге существует множество возможностей! @birgire

Nicolai Grossherr Nicolai Grossherr
9 июл. 2015 г. 11:32:16

да, отсюда и идея игры для вечеринок ;-)

birgire birgire
9 июл. 2015 г. 11:33:56

Да, я понял :) Так что WPSE фактически является онлайн-версией »99 способов решить ваши PHP/WordPress проблемы« - мне пришлось придумать это, чтобы сделать официальным :) @birgire

Nicolai Grossherr Nicolai Grossherr
9 июл. 2015 г. 11:46:26

Этот ответ НЕ является надежным. Поскольку ни вопрос, ни ответ явно не указывают контекст, возможно, что WooCommerce активен, но загружается после этого кода. Например, в другом плагине, который случайно загружается раньше. Предложенная проверка класса гораздо надежнее, если дополнительно обернуть ее в хук plugins_loaded. То есть обернуть условие if в функцию check_for_woocommerce() и зарегистрировать ее с помощью add_action('plugins_loaded', 'check_for_woocommerce');

kontur kontur
30 окт. 2017 г. 15:27:35
Показать остальные 2 комментариев
1

Многие официальные плагины WooCommerce решают эту проблему, проверяя константу WC_VERSION, которую WooCommerce определяет после загрузки всех плагинов. Упрощённый код:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // WooCommerce не установлен :(
    } else {
        var_dump("Установлен WooCommerce версии", WC_VERSION);
    }
}

Дополнительным преимуществом является возможность использовать функцию PHP version_compare() для проверки, установлена ли достаточно новая версия WooCommerce (если ваш код требует определённых возможностей), так как константа WC_VERSION подходит для этого.

30 окт. 2017 г. 15:38:48
Комментарии

Это действительно хороший способ. Отличный совет для разработчиков плагинов, который тоже стоит включить.

Jacob Raccuia Jacob Raccuia
29 янв. 2018 г. 17:11:59
2

Для улучшения предложенных решений мы используем следующий код:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Здесь разместите код вашего плагина
}

Это предотвращает две проблемы:

  • Установка WooCommerce в нестандартном каталоге — в этом случае if ( in_array( 'woocommerce/woocommerce.php', apply_filters(... не сработает.
  • Вызов этой проверки до загрузки WooCommerce — в этом случае if ( class_exists( 'WooCommerce' ) ) { .. } не сработает.
17 нояб. 2016 г. 13:50:55
Комментарии

Этот ответ полезен для разработчиков плагинов, так как вы можете просто обернуть весь основной файл вашего плагина в этот оператор IF.

Dave Hilditch Dave Hilditch
30 апр. 2019 г. 11:59:57

Это единственное решение, которое сработало для моего плагина! Спасибо!!!

Sam Sam
19 мая 2019 г. 01:12:45
0

Я нашел эту полезную информацию в документации для разработчиков WooCommerce.

Вы можете просто вызвать функцию is_woocommerce_active() в файле вашего плагина.

Пример

if ( ! is_woocommerce_active() ) 
{
    add_action( 'admin_notices', 'WC_Subscriptions::woocommerce_inactive_notice' );
    return;
}

is_woocommerce_active определяется следующим образом согласно документации WooCommerce

/**
 * Проверяет, активирован ли WooCommerce
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
11 дек. 2019 г. 19:22:55
0

Решение, которое я использую в 2021 году:

add_action( 'admin_init', 'my_plugin_check_if_woocommerce_installed' );
function my_plugin_check_if_woocommerce_installed() {

    // Если WooCommerce НЕ установлен, деактивируем плагин
    if ( is_admin() && current_user_can( 'activate_plugins') && !is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Показываем уведомление об ошибке с возможностью закрыть
        add_action( 'admin_notices', 'my_plugin_woocommerce_check_notice' );

        // Деактивируем текущий плагин
        deactivate_plugins( plugin_basename( __FILE__) );
        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }
    }
    // Если WooCommerce установлен, активируем плагин и выполняем дальнейшие действия
    elseif ( is_admin() && is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Выполняем дальнейшие действия здесь
    }
}

// Показываем уведомление об ошибке, если WooCommerce отсутствует
function my_plugin_woocommerce_check_notice() {
    ?>
    <div class="alert alert-danger notice is-dismissible">
        <p>Извините, но для работы этого плагина требуется WooCommerce.
            Пожалуйста, убедитесь, что WooCommerce установлен и активирован.
        </p>
    </div>
    <?php
}

Код выполняется на хуке 'admin_init', а не на 'register_activation_hook', потому что ему необходимо, чтобы WooCommerce был загружен и успешно обнаружен. Если WooCommerce НЕ обнаружен, код выполняет следующее:

a) Показывает администратору уведомление об ошибке с возможностью закрыть, сообщая об отсутствии WooCommerce. Это более аккуратный подход по сравнению с использованием 'wp_die'.

b) Автоматически деактивирует ваш пользовательский плагин.

Если WooCommerce обнаружен, вы можете продолжить добавлять пункты меню и выполнять другие необходимые действия.

ВАЖНЫЕ ЗАМЕЧАНИЯ:

  1. Приведенное решение работает в предположении, что основное имя плагина WooCommerce и его главный файл остаются "woocommerce". Если это изменится в будущем, проверки перестанут работать. Поэтому для корректной работы кода в таком случае потребуется обновить имя директории WooCommerce и имя главного файла в условиях if и elseif.

  2. Обратите внимание, что если и WooCommerce, и ваш плагин успешно установлены и работают, то при деактивации WooCommerce по любой причине ваш плагин также будет автоматически деактивирован.

2 дек. 2021 г. 09:38:05
0

Это для поддержки мультисайтов.

$is_active = in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) );

if ( is_multisite() ) {
    if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
        include_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    if ( function_exists( 'is_plugin_active_for_network' ) ) {
        $is_active = is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) || $is_active;
    }
}

if ( $is_active ) {

}
14 янв. 2024 г. 21:19:38
2

Вы можете обернуть ваш плагин в проверку, установлен и активен ли WooCommerce или нет:

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) {
echo 'WooCommerce активен.';
} else {
echo 'WooCommerce не активен.';
}
28 июн. 2016 г. 13:36:35
Комментарии

Это не работает с мультисайтами

Andrew Lazarus Andrew Lazarus
20 окт. 2016 г. 14:38:16

@AndrewLazarus Спасибо, что упомянули об этом - я только что потратил час на эту проблему! :)

wickywills wickywills
2 янв. 2019 г. 15:27:33