. * * @package Timetics * @category Core * @author Arraytics * @version 1.0.0 */ // Exit if accessed directly. defined('ABSPATH') || exit; /** * The Main Plugin Requirements Checker * * @since 1.0.0 */ final class Timetics { /** * Static Property To Hold Singleton Instance * * @var Timetics The Timetics Requirement Checker Instance */ private static $instance; /** * Requirements Array * * @since 1.0.0 * @var array */ private $requirements = array( 'php' => array( 'name' => 'PHP', 'minimum' => '7.3', 'exists' => true, 'met' => false, 'checked' => false, 'current' => false, ), 'wp' => array( 'name' => 'WordPress', 'minimum' => '5.2', 'exists' => true, 'checked' => false, 'met' => false, 'current' => false, ), ); /** * Singleton Instance * * @return Timetics */ public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } /** * Setup Plugin Requirements * * @since 1.0.0 */ private function __construct() { // Always load translation. add_action('plugins_loaded', array($this, 'load_text_domain')); // Initialize plugin functionalities or quit. $this->requirements_met() ? $this->initialize_modules() : $this->quit(); } /** * Load Localization Files * * @since 1.0 * @return void */ public function load_text_domain() { $locale = apply_filters('plugin_locale', get_user_locale(), 'timetics'); unload_textdomain('timetics'); load_textdomain('timetics', WP_LANG_DIR . '/timetics/timetics-' . $locale . '.mo'); load_plugin_textdomain('timetics', false, self::get_plugin_dir() . 'languages/'); } /** * Initialize Plugin Modules * * @since 1.0.0 * @return void */ private function initialize_modules() { require_once dirname(__FILE__) . '/autoloader.php'; require_once dirname(__FILE__) . '/core/settings/settings.php'; require_once dirname(__FILE__) . '/utils/global-helper.php'; // Include the bootstrap file if not loaded. if (!class_exists('Timetics\Bootstrap')) { require_once self::get_plugin_dir() . 'bootstrap.php'; } // Initialize the bootstraper if exists. if (class_exists('Timetics\Bootstrap')) { // Initialize all modules through plugins_loaded. add_action('plugins_loaded', array($this, 'init')); register_activation_hook(self::get_plugin_file(), array($this, 'activate')); register_deactivation_hook(self::get_plugin_file(), array($this, 'deactivate')); } } /** * Check If All Requirements Are Fulfilled * * @return boolean */ private function requirements_met() { $this->prepare_requirement_versions(); $passed = true; $to_meet = wp_list_pluck($this->requirements, 'met'); foreach ($to_meet as $met) { if (empty($met)) { $passed = false; continue; } } return $passed; } /** * Requirement Version Prepare * * @since 1.0.0 * * @return void */ private function prepare_requirement_versions() { foreach ($this->requirements as $dependency => $config) { switch ($dependency) { case 'php': $version = phpversion(); break; case 'wp': $version = get_bloginfo('version'); break; default: $version = false; } if (!empty($version)) { $this->requirements[$dependency]['current'] = $version; $this->requirements[$dependency]['checked'] = true; $this->requirements[$dependency]['met'] = version_compare($version, $config['minimum'], '>='); } } } /** * Initialize everything * * @since 1.0.0 * * @return void */ public function init() { Timetics\Bootstrap::instantiate(self::get_plugin_file()); } /** * Called Only Once While Activation * * @return void */ public function activate() { // Insert new role. Timetics\Base\Role::instance()->init(); // Update default settings. timetics_update_default_settings(); } /** * Called Only Once While Deactivation * * @return void */ public function deactivate() { } /** * Quit Plugin Execution * * @return void */ private function quit() { add_action('admin_head', array($this, 'show_plugin_requirements_not_met_notice')); } /** * Show Error Notice For Missing Requirements * * @return void */ public function show_plugin_requirements_not_met_notice() { printf('