استفاده از تابع 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();