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

9

Я пытаюсь изменить голову и ногу моих страниц 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 ?>
вереск
источник

Ответы:

18

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

if ( class_exists( 'WooCommerce' ) ) {
  // some code
} else {
  / more code
}

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

/**
 * Check if WooCommerce is active
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Put your plugin code here
}

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

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}
Nicolai
источник
3
Это может быть веселая игра для вечеринок, поиск других путей ;-) Позвольте мне присоединиться к ней if( function_exists( 'WC' ) ), но точнее будет указать имя плагина в проверке класса, как вы и предлагали ;-)
birgire
2
На самом деле эта функция WC() существует , я просто пытался найти более короткий путь, ссылаясь на нее ;-) Я думаю, это было бы более точно с if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Играя вместе, мы могли бы также проверить на наличие констант (например WOOCOMMERCE_VERSION) или действий (например did_action( 'woocommerce_loaded' )) ;-) @ialocin
birgire
1
Правда, в конце дня много возможностей! @birgire
Николай
1
Да, иди :) Так что WPSE на самом деле своего рода онлайн-версия »99 способов решить твои проблемы с PHP / WorPress« - мне пришлось пометить это, чтобы сделать его официальным :) @birgire
Nicolai
2
Этот ответ не является надежным. Поскольку ни вопрос, ни ответ явно не указывают контекст, возможно, WooCommerce активен, но загружен после этого кода. Например, в другом плагине, который загружается раньше. Предложенная проверка классов намного надежнее, если вы дополнительно включите ее в ловушку plugins_loaded . Т.е. обернуть условие if в check_for_woocommerce()функцию и зарегистрировать его сadd_action('plugins_loaded', 'check_for_woocommerce');
kontur
6

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

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // no woocommerce :(
    } else {
        var_dump("WooCommerce installed in version", WC_VERSION);
    }
}

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

КОНТУР
источник
это действительно хороший способ. Хороший совет для разработчиков плагинов.
Джейкоб Раккуя
3

Чтобы улучшить ответы, мы используем это:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Put your plugin code here
}

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

  • WooCommerce устанавливается в нестандартном каталоге - в этом случае if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...не работает.
  • Эта проверка вызывается до загрузки WooCommerce - в этом случае if ( class_exists( 'WooCommerce' ) ) { .. }не работает.
Ян Жаньковский
источник
Этот ответ полезен для разработчиков плагинов, так как вы можете просто обернуть весь основной файл плагина этим оператором IF.
Дейв Хилдич
Это было единственное решение, которое сработало для меня в моем плагине! Спасибо!!!
Сэм
1

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

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

пример

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

is_woocommerce_active, определенный как ниже согласно документации woo

/**
 * Check if WooCommerce is activated
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
Nilesh
источник
0

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

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce is active.';
} else {
echo 'WooCommerce is not Active.';
}
Прем Тивари
источник
3
Это не работает с мультисайтами
Эндрю Лазарь
@AndrewLazarus Спасибо, что упомянули об этом - я только что потерял час на эту проблему! :)
wickywills