Как проверить, активен ли плагин (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
}

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; }
    }
}

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.