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

时间:2017-03-09 15:53:01

标签: wordpress oop woocommerce

我正在尝试检查WooCommerce是否处于活动状态,我创建了一个默认值为false的属性,然后我使用is_plugin_active()和admin_init hook创建了一个检查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 sugested的第二个解决方案工作得很好,这也很好,很短

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() );

1 个答案:

答案 0 :(得分: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() );