استفاده از تابع register_activation_hook درون هوک plugins_loaded

تاریخ: 17 اسفند 1397

اگر تلاش می کنید از تابع register_activation_hook درون هوک plugins_loaded استفاده کنید کاری اشتباه است و اتفاقی نخواهد افتاد.

چون هوک plugins_loaded زمانی fire می شود که افزونه های فعال شده (و نه در حال فعال شدن) در حال لود شدن هستند.

کد زیر کار نمی کند …

class MyPluginInit {
	private static $instance;

	public static function getInstance() {
                if (!self::$instance) {
                        self::$instance = new self();
                }
                return self::$instance;
	}

	private function __construct() {
		// application initialization code
		register_activation_hook( MY_PLUGIN_FILE, array( &$this, 'activate_plugin' ) );
	}

	public function activate_plugin() {
		// one-time plugin activation code
	}
}

add_action( 'plugins_loaded', array( 'MyPluginInit', 'getInstance' ) );

پس لازم است آن را خارج از این هوک استفاده کنید.

class MyPluginInit {
	private static $instance;

	public static function getInstance() {
                if (!self::$instance) {
                        self::$instance = new self();
                }
                return self::$instance;
	}

	private function __construct() {
		// application initialization code
		
	}

	public function activate_plugin() {
		// one-time plugin activation code
	}
}

add_action( 'plugins_loaded', array( 'MyPluginInit', 'getInstance' ) );

register_activation_hook( MY_PLUGIN_FILE, array( 'MyPluginInit', 'activate_plugin' ) );

ممکن است نیاز داشته باشید تا شی instance را در تابع register_activation_hook استفاده کنید. در این صورت می توانید از solution زیر استفاده نمایید.


class MyPluginInit {
	private static $instance;

	public static function getInstance() {
		if( !self::$instance ) {
			$class = __CLASS__;
			new $class;
		}
		return self::$instance;
	}

	private function __construct() {
		register_activation_hook( MY_PLUGIN_FILE, array( &$this, 'activate_plugin' ) );
		add_action( 'plugins_loaded', array( &$this, 'init' ) );
	}

	public function init() {
		// application initialization code
	}

	public function activate_plugin() {
		$this->init();
		// one-time plugin activation code
	}
}

MyPluginInit::getInstance();

دیدگاهتان را بنویسید

طراحی افزونه وردپرس