2017-03-09 52 views
0

我試圖檢查WooCommerce是否活動,我創建了一個默認值爲false的屬性,然後創建了一個方法來檢查WooCommerce是使用is_plugin_active活躍的()和admin_init掛鉤,如果激活屬性的值必須更新爲真:這裏是代碼:不能通過WordPress插件中的方法更改屬性值

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

的問題是的var_dump返回false即使WooCommerce是活躍的,但是,如果我在函數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

如果我猜的話,那麼$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()); 
+0

謝謝你,第二個解決方案是工作得很好,我發現了另一個短的路該工程沒有使用admin_init,實際上沒有必要更新的屬性值,方法is_woo_active()會做 MyClass類{ \t //檢查WooCommerce是活躍 \t公共區域c函數is_woo_active(){include_once(ABSPATH。){if_woo_active(){ \t \t include_once 'wp-admin/includes/plugin.php'); \t \t if(is_plugin_active('woocommerce/woocommerce.php')){ \t \t \t return true; \t \t} else { \t \t \t return false; \t \t} \t} } 是$ var =新MyClass的(); var_dump($ var-> is_woo_active()); –