Can';t通过WordPress插件中的方法更改属性值
我正在尝试检查WooCommerce是否处于活动状态,我创建了一个默认值为false的属性,然后我创建了一个方法,使用is_plugin_active()和admin_init hook检查WooCommerce是否处于活动状态,如果处于活动状态,则该属性的值必须更新为true:代码如下: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(
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());