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

时间:2015-07-08 作者:Heather

我正在尝试修改WooCommerce页面的页眉和页脚。我有一个if 语句的目标应该是WooCommerce的商店和购物车,但事实并非如此if 声明无任何更改。但是如果我在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 ?>

6 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

您的编辑让我产生了这个想法,实际上没有名为»woocommerce«,有一个类»的函数WooCommerce«尽管如此。需要注意的一件事是,检查必须足够晚,这样插件才能真正初始化,否则很明显,类将不存在,检查将返回false. 因此,您的支票应如下所示:

if ( class_exists( \'WooCommerce\' ) ) {
  // some code
} else {
  / more code
}
在WooCommerce文档页面»Creating a plugin for 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
}

SO网友:kontur

许多官方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);
    }
}
额外的好处是,您可以使用PHPversion_compare() 进一步检查是否安装了足够新的WooCommerce版本(如果您的代码需要特定的功能),因为WC\\u version常量适用于此。

SO网友:Jan Żankowski

为了改进给出的答案,我们使用以下方法:

$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(... 不起作用if ( class_exists( \'WooCommerce\' ) ) { .. } 不起作用

SO网友:Nilesh

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

SO网友:Prem Tiwari

您可以在检查中包装插件,查看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.\';
}

SO网友:Devner

Solution that I use in 2021:

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

    // If WooCommerce is NOT installed, Deactivate the plugin
    if ( is_admin() && current_user_can( \'activate_plugins\') && !is_plugin_active( \'woocommerce/woocommerce.php\') ) {

        // Show dismissible error notice
        add_action( \'admin_notices\', \'my_plugin_woocommerce_check_notice\' );

        // Deactivate this plugin
        deactivate_plugins( plugin_basename( __FILE__) );
        if ( isset( $_GET[\'activate\'] ) ) {
            unset( $_GET[\'activate\'] );
        }
    }
    // If WooCommerce is installed, activate the plugin and carry out further processing
    elseif ( is_admin() && is_plugin_active( \'woocommerce/woocommerce.php\') ) {

        // Carry out further processing here
    }
}

// Show dismissible error notice if WooCommerce is not present
function my_plugin_woocommerce_check_notice() {
    ?>
    <div class="alert alert-danger notice is-dismissible">
        <p>Sorry, but this plugin requires WooCommerce in order to work.
            So please ensure that WooCommerce is both installed and activated.
        </p>
    </div>
    <?php
}
代码在上运行\'admin_init\', 而不是“register\\u activation\\u hook”,因为它需要WooCommerce才能成功加载和检测。因此,如果未检测到WooCommerce,它将执行以下操作:

a) 向管理员显示关于缺少WooCommerce的可驳回错误通知。这是非常优雅的,因为它不使用“wp\\u die”。

b) 自动停用自定义插件。

如果检测到WooCommerce,您可以根据需要继续添加菜单链接等。

CAVEATS:

上述解决方案的前提是WooCommerce插件及其主文件的核心名称仍然是;woocommerce;。如果这种情况在未来任何时候发生变化,那么支票将被打破。因此,为了使这段代码在当时起作用,应该在上述代码中更新当前的WooCommerce目录名和主文件名if 检查和elseif 检查

请注意,如果WooCommerce和您的插件都已成功安装并运行,那么如果您出于任何原因随时停用WooCommerce,那么它也会自动停用您的插件。

结束