219 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Sphere\Debloat;
 | 
						|
 | 
						|
/**
 | 
						|
 * The Plugin Bootstrap and Setup.
 | 
						|
 * 
 | 
						|
 * Dual acts as a container and a facade.
 | 
						|
 * 
 | 
						|
 * @author  asadkn
 | 
						|
 * @since   1.0.0
 | 
						|
 * 
 | 
						|
 * @method static FileSystem  file_system()  Extends \WP_Filesystem_Base
 | 
						|
 * @method static Process process()
 | 
						|
 * @method static Options    options()
 | 
						|
 * @method static DelayLoad  delay_load()
 | 
						|
 * @method static FileCache  file_cache()
 | 
						|
 * @method static OptimizeCss\GoogleFonts google_fonts()
 | 
						|
 */
 | 
						|
class Plugin 
 | 
						|
{
 | 
						|
	/**
 | 
						|
	 * Plugin version
 | 
						|
	 */
 | 
						|
	const VERSION = '1.2.3';
 | 
						|
 | 
						|
	public static $instance;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var string Can be 'dev' for debgging.
 | 
						|
	 */
 | 
						|
	public $env = 'production';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Path to plugin folder, trailing slashed.
 | 
						|
	 */
 | 
						|
	public $dir_path;
 | 
						|
	public $dir_url;
 | 
						|
 | 
						|
	public $plugin_file;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * A pseudo service container
 | 
						|
	 */
 | 
						|
	public $container;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Set it hooks on init.
 | 
						|
	 */
 | 
						|
	public function init() 
 | 
						|
	{
 | 
						|
		$this->dir_path = plugin_dir_path($this->plugin_file);
 | 
						|
		$this->dir_url  = plugin_dir_url($this->plugin_file);
 | 
						|
 | 
						|
		// Fire up the main autoloader.
 | 
						|
		require_once $this->dir_path . 'inc/autoloader.php';
 | 
						|
		new Autoloader([
 | 
						|
			'Sphere\Debloat\\'  => $this->dir_path . 'inc', 
 | 
						|
		]);
 | 
						|
 | 
						|
		// Composer autoloader.
 | 
						|
		require_once $this->dir_path . 'vendor/autoload.php';
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Setup and init common requires.
 | 
						|
		 */
 | 
						|
		// Options object with bound constructor args.
 | 
						|
		$this->container['options'] = $this->shared(
 | 
						|
			__NAMESPACE__ . '\Options', 
 | 
						|
			[
 | 
						|
				['debloat_options', 'debloat_options_js', 'debloat_options_general']
 | 
						|
			]
 | 
						|
		);
 | 
						|
 | 
						|
		// The process handler.
 | 
						|
		$this->container['process'] = $this->shared(__NAMESPACE__ . '\Process');
 | 
						|
 | 
						|
		// File system with lazy init singleton.
 | 
						|
		$this->container['file_system'] = $this->shared(__NAMESPACE__ . '\FileSystem');
 | 
						|
 | 
						|
		// Delay Load assets.
 | 
						|
		$this->container['delay_load'] = $this->shared(__NAMESPACE__ . '\DelayLoad');
 | 
						|
 | 
						|
		// File cache handler.
 | 
						|
		$this->container['file_cache'] = $this->shared(__NAMESPACE__ . '\FileCache');
 | 
						|
 | 
						|
		// Google Fonts is a singleton.
 | 
						|
		$this->container['google_fonts'] = $this->shared(__NAMESPACE__ . '\OptimizeCss\GoogleFonts');
 | 
						|
		
 | 
						|
		/**
 | 
						|
		 * Admin only requires
 | 
						|
		 * 
 | 
						|
		 * We load these only on Admin side to keep things lean and performant.
 | 
						|
		 * 
 | 
						|
		 * Note on CMB2: 
 | 
						|
		 *  It's used ONLY as an admin side dependency and never even
 | 
						|
		 *  loaded on the frontend. Use native WP options API on front.
 | 
						|
		 */
 | 
						|
		if (is_admin() || defined('WP_CLI')) {
 | 
						|
 | 
						|
			$admin = new Admin;
 | 
						|
			$admin->init();
 | 
						|
 | 
						|
			// We don't want CMB2 backend loaded at all in AJAX requests (admin-ajax.php passes is_admin() test)
 | 
						|
			if (!wp_doing_ajax()) {
 | 
						|
				require_once $this->dir_path . 'vendor/cmb2/init.php';
 | 
						|
			}
 | 
						|
 | 
						|
			// Path bug fix for cmb2 in composer
 | 
						|
			add_filter('cmb2_meta_box_url', function() {
 | 
						|
				return self::get_instance()->dir_url . 'vendor/cmb2';
 | 
						|
			});
 | 
						|
 | 
						|
			// WP-CLI commands.
 | 
						|
			if (class_exists('\WP_CLI')) {
 | 
						|
				\WP_CLI::add_command('debloat', '\Sphere\Debloat\WpCli\Commands');
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Utility functions.
 | 
						|
		require_once $this->dir_path . 'inc/util.php';
 | 
						|
 | 
						|
		$this->register_hooks();
 | 
						|
 | 
						|
		// Load the options.
 | 
						|
		self::options()->init();
 | 
						|
 | 
						|
		// Init process to setup hooks.
 | 
						|
		self::process()->init();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Creates a single instance class for container.
 | 
						|
	 * 
 | 
						|
	 * @param string     $class  Fully-qualifed class name
 | 
						|
	 * @param array|null $args   Bound args to pass to constructor
 | 
						|
	 */
 | 
						|
	public function shared($class, $args = null) 
 | 
						|
	{
 | 
						|
		return function($fresh = false) use ($class, $args) {
 | 
						|
			static $object;
 | 
						|
 | 
						|
			if (!$object || $fresh) {
 | 
						|
 | 
						|
				if (!$args) {
 | 
						|
					$object = new $class;
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					$ref = new \ReflectionClass($class);
 | 
						|
					$object = $ref->newInstanceArgs($args);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			return $object;
 | 
						|
		};
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Setup hooks actions.
 | 
						|
	 */
 | 
						|
	public function register_hooks()
 | 
						|
	{
 | 
						|
		// Translations
 | 
						|
		add_action('plugins_loaded', array($this, 'load_textdomain'));
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Setup translations.
 | 
						|
	 */
 | 
						|
	public function load_textdomain()
 | 
						|
	{
 | 
						|
		load_plugin_textdomain(
 | 
						|
			'debloat',
 | 
						|
			false,
 | 
						|
			basename($this->dir_path) . '/languages'
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Gets an object from container.
 | 
						|
	 */
 | 
						|
	public function get($name, $args = array()) 
 | 
						|
	{
 | 
						|
		if (!isset($this->container[$name])) {
 | 
						|
			throw new \Exception("No container exists with key '{$name}'");
 | 
						|
		}
 | 
						|
 | 
						|
		$object = $this->container[$name];
 | 
						|
 | 
						|
		if (is_callable($object)) {
 | 
						|
			return call_user_func_array($object, $args);
 | 
						|
		}
 | 
						|
		else if (is_string($object)) {
 | 
						|
			$object = new $object;
 | 
						|
		}
 | 
						|
 | 
						|
		return $object;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @uses self::get()
 | 
						|
	 */
 | 
						|
	public static function __callStatic($name, $args = array())
 | 
						|
	{
 | 
						|
		return self::get_instance()->get($name, $args);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return $this
 | 
						|
	 */
 | 
						|
	public static function get_instance()
 | 
						|
	{
 | 
						|
		if (self::$instance == null) {
 | 
						|
			self::$instance = new static();
 | 
						|
		}
 | 
						|
 | 
						|
		return self::$instance;
 | 
						|
	}
 | 
						|
} |