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;
|
|
}
|
|
} |