Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t通过WordPress插件中的方法更改属性值_Wordpress_Oop_Woocommerce - Fatal编程技术网

Can';t通过WordPress插件中的方法更改属性值

Can';t通过WordPress插件中的方法更改属性值,wordpress,oop,woocommerce,Wordpress,Oop,Woocommerce,我正在尝试检查WooCommerce是否处于活动状态,我创建了一个默认值为false的属性,然后我创建了一个方法,使用is_plugin_active()和admin_init hook检查WooCommerce是否处于活动状态,如果处于活动状态,则该属性的值必须更新为true:代码如下: class MyClass{ public $woo_active = false; public function __construct(){ add_action(

我正在尝试检查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() );

如果让我猜的话,那么
$var=newmyclass()
admin\u init
之前运行,因此
检查\u if\u woo\u active()
未运行

你可以做几件事。首先,我通常会在加载的
hook上启动我的插件。这样,我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() ); 

谢谢,第二个解决方案工作得很好,我发现了另一个不使用admin_init的短方法,实际上不需要更新属性值,方法是_-woo_-active(),将执行类MyClass{//检查WooCommerce是否处于活动状态公共函数是_-woo_-active(){包含}(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());