如何检查插件(WooCommerce)是否处于活动状态?


9

我正在尝试修改WooCommerce页面的头部和底部。我有一条if声明应该针对WooCommerce的商店和购物车,但事实并非如此。如果在if语句后修改PHP,则没有任何变化。但是如果我在else声明中修改PHP 是可行的:

这不起作用:

<?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 ?>

Answers:


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
Nicolai

1
是的,去吧:)所以WPSE实际上是»99种解决PHP / WorPress问题的方法的在线版本«-我不得不铸造它,使其正式成为:) @birgire
Nicolai

2
这个答案不可靠。由于问题和答案均未明确说明上下文,因此WooCommerce可能处于活动状态,但在此代码之后加载。例如,在另一个插件中,它恰好在之前被加载。如果另外将其包装在plugins_loaded hook中,则建议的类检查更加可靠。check_for_woocommerce()add_action('plugins_loaded', 'check_for_woocommerce');
即将

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
这不适用于多站点
Andrew Lazarus

@AndrewLazarus谢谢您提到-我刚刚在这个问题上花了一个小时!:)
wickywills
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.