无法通过 WordPress 插件中的方法更改属性值

问题描述 投票:0回答:1

我正在尝试检查 WooCommerce 是否处于活动状态,我创建了一个默认值为 false 的属性,然后我创建了一个方法来使用 is_plugin_active() 和 admin_init 挂钩检查 WooCommerce 是否处于活动状态,如果处于活动状态,则值为该属性必须更新为 true:这是代码:

class MyClass{

    public $woo_active = false;

    public function __construct(){
        add_action( 'admin_init', array( $this, 'check_if_woo_active' ) );
    }

    // check if WooCommerce is active
    public function check_if_woo_active(){

        if( is_plugin_active( 'woocommerce/woocommerce.php' ) ){
            $this->woo_active = true;
        }

    }

    // is_woo_active()
    public function is_woo_active(){
        return $this->woo_active;
    }
}
$var = new MyClass();
var_dump( $var->is_woo_active() );  

问题是,即使 WooCommerce 处于活动状态,var_dump 也会返回 false,但是,如果我在函数 check_if_woo_active() 中使用 var_dump,它会返回 true。

为什么属性值没有更新?谢谢

更新:

@helgatheviking 建议的第二个解决方案效果很好,而且效果也很好而且很短

class MyClass{

    // check if WooCommerce is active
    public function is_woo_active(){
        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
        if( is_plugin_active( 'woocommerce/woocommerce.php' ) ){
            return true;
        }else{
            return false;
        }
    }
}

$var = new MyClass();
var_dump( $var->is_woo_active() );
php wordpress oop woocommerce
1个回答
1
投票

如果我不得不猜测,那么

$var = new MyClass();
会在 admin_init
 之前运行,因此 
check_if_woo_active()
 不会运行。 

您可以做几件事。首先,我通常会在

woocommerce_loaded

 钩子上启动我的插件。这样我就 100% 确定 WooCommerce 正在运行。 

class MyClass{ protected static $instance = null; /** * Main MyClass Instance * * Ensures only one instance of MyClass is loaded or can be loaded. * * @static * @see MyClass() * @return MyClass - Main instance * @since 0.1.0 */ public static function instance() { if ( ! isset( self::$instance ) && ! ( self::$instance instanceof MyClass ) ) { self::$instance = new MyClass(); } return self::$instance; } public function __construct(){ // Do what you want, WC is definitely active } } /** * Returns the main instance of class. * * @return MyClass */ function MyClass() { return MyClass::instance(); } // Launch the class if WooCommerce is loaded: add_action( 'woocommerce_loaded', 'MyClass' );

您还可以模仿 WooCommerce 使用其高级插件所做的事情,并检查存储活动插件的选项:

class MyClass{ private static $active_plugins; public static function get_active_plugins() { self::$active_plugins = (array) get_option( 'active_plugins', array() ); if ( is_multisite() ){ self::$active_plugins = array_merge( self::$active_plugins, get_site_option( 'active_sitewide_plugins', array() ) ); } } // check if WooCommerce is active public static function check_if_woo_active() { if ( ! self::$active_plugins ) self::get_active_plugins(); return in_array( 'woocommerce/woocommerce.php', self::$active_plugins ) || array_key_exists( 'woocommerce/woocommerce.php', self::$active_plugins ); } } var_dump( MyClass::check_if_woo_active() );
    
© www.soinside.com 2019 - 2024. All rights reserved.