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