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

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

Solutions Collecting From Web of "Как проверить, активен ли плагин (WooCommerce)?"

Примечание. Для нового, более полного, лучшего и более или менее официального способа взгляните на ответ kontur . По его словам , это можно сделать с помощью проверки класса.


Ваше редактирование привлекло меня к этой идее, там действительно нет функции под названием «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 } 

Многие из официальных плагинов 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.

Вы можете обернуть свой плагин в чек, чтобы убедиться, что 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.'; } 

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

 $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' ) ) { .. } не работает.