2017-03-09 5 views
0

WooCommerceがアクティブかどうかをチェックしようとしています。既定値がfalseのプロパティを作成した後、WooCommerceここでのコードは次のとおりです: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はWooCommerceがアクティブな場合でもfalseを返すということですが、プロパティの有効値がtrueに更新する必要がある場合、(is_plugin_active)とadmin_initフックを使用してアクティブになっています関数check_if_woo_active()の中でvar_dumpを使うとtrueを返します。

なぜプロパティ値が更新されないのですか?おかげ

更新

私は推測していた場合は、$var = new MyClass();は前を実行している@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()); 

答えて

1

ショートを推薦して第二の溶液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は()WooCommerceは \t publiがアクティブであるかどうかを確認// MyClassクラス{ \tを行いますプロパティ値を更新する必要はありませんc関数is_woo_active(){ \t \t include_once(ABSPATH。 '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()); –

関連する問題