343 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Icon Picker
 | |
|  *
 | |
|  * @package Icon_Picker
 | |
|  * @version 0.5.0
 | |
|  * @author Dzikri Aziz <kvcrvt@gmail.com>
 | |
|  *
 | |
|  *
 | |
|  * Plugin Name: Icon Picker
 | |
|  * Plugin URI:  http://kucrut.org/
 | |
|  * Description: Pick an icon of your choice.
 | |
|  * Version:     0.5.0
 | |
|  * Author:      Dzikri Aziz
 | |
|  * Author URI:  http://kucrut.org/
 | |
|  * License:     GPLv2
 | |
|  * Text Domain: icon-picker
 | |
|  * Domain Path: /languages
 | |
|  */
 | |
| 
 | |
| final class Icon_Picker {
 | |
| 
 | |
| 	const VERSION = '0.5.0';
 | |
| 
 | |
| 	/**
 | |
| 	 * Icon_Picker singleton
 | |
| 	 *
 | |
| 	 * @static
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    Icon_Picker
 | |
| 	 */
 | |
| 	protected static $instance;
 | |
| 
 | |
| 	/**
 | |
| 	 * Plugin directory path
 | |
| 	 *
 | |
| 	 * @access protected
 | |
| 	 * @since  0.1.0
 | |
| 	 * @var    array
 | |
| 	 */
 | |
| 	protected $dir;
 | |
| 
 | |
| 	/**
 | |
| 	 * Plugin directory url path
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    array
 | |
| 	 */
 | |
| 	protected $url;
 | |
| 
 | |
| 	/**
 | |
| 	 * Icon types registry
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    Icon_Picker_Types_Registry
 | |
| 	 */
 | |
| 	protected $registry;
 | |
| 
 | |
| 	/**
 | |
| 	 * Loader
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    Icon_Picker_Loader
 | |
| 	 */
 | |
| 	protected $loader;
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether the functionality is loaded on admin
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    bool
 | |
| 	 */
 | |
| 	protected $is_admin_loaded = false;
 | |
| 
 | |
| 	/**
 | |
| 	 * Default icon types
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @var    array
 | |
| 	 */
 | |
| 	protected $default_types = array(
 | |
| 		'dashicons'        => 'Dashicons',
 | |
| 		'elusive'          => 'Elusive',
 | |
| 		'fa'               => 'Font_Awesome',
 | |
| 		'foundation-icons' => 'Foundation',
 | |
| 		'genericon'        => 'Genericons',
 | |
| 		'image'            => 'Image',
 | |
| 		'svg'              => 'Svg',
 | |
| 	);
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Setter magic
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  string $name Property name.
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public function __isset( $name ) {
 | |
| 		return isset( $this->$name );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Getter magic
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  string $name Property name.
 | |
| 	 * @return mixed  NULL if attribute doesn't exist.
 | |
| 	 */
 | |
| 	public function __get( $name ) {
 | |
| 		if ( isset( $this->$name ) ) {
 | |
| 			return $this->$name;
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Get instance
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @param  array $args Arguments {@see Icon_Picker::__construct()}.
 | |
| 	 * @return Icon_Picker
 | |
| 	 */
 | |
| 	public static function instance( $args = array() ) {
 | |
| 		if ( is_null( self::$instance ) ) {
 | |
| 			self::$instance = new self( $args );
 | |
| 		}
 | |
| 
 | |
| 		return self::$instance;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @param  array $args {
 | |
| 	 *     Optional. Arguments to override class property defaults.
 | |
| 	 *
 | |
| 	 *     @type string $dir Plugin directory path (without trailing slash).
 | |
| 	 *     @type string $url Plugin directory url path (without trailing slash).
 | |
| 	 * }
 | |
| 	 * @return Icon_Picker
 | |
| 	 */
 | |
| 	protected function __construct( $args = array() ) {
 | |
| 		$defaults = array(
 | |
| 			'dir' => untrailingslashit( plugin_dir_path( __FILE__ ) ),
 | |
| 			'url' => untrailingslashit( plugin_dir_url( __FILE__ ) ),
 | |
| 		);
 | |
| 
 | |
| 		$args = wp_parse_args( $args, $defaults );
 | |
| 		$keys = array_keys( get_object_vars( $this ) );
 | |
| 
 | |
| 		// Disallow.
 | |
| 		unset( $args['registry'] );
 | |
| 		unset( $args['loader'] );
 | |
| 		unset( $args['is_admin_loaded'] );
 | |
| 
 | |
| 		foreach ( $keys as $key ) {
 | |
| 			if ( isset( $args[ $key ] ) ) {
 | |
| 				$this->$key = $args[ $key ];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$locale = apply_filters( 'plugin_locale', get_locale(), 'icon-picker' );
 | |
| 
 | |
| 		load_textdomain( 'icon-picker', WP_LANG_DIR . "/icon-picker/icon-picker-{$locale}.mo" );
 | |
| 		load_plugin_textdomain( 'icon-picker', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
 | |
| 
 | |
| 		add_action( 'wp_loaded', array( $this, 'init' ) );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Register icon types
 | |
| 	 *
 | |
| 	 * @since   0.1.0
 | |
| 	 * @wp_hook action wp_loaded
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function init() {
 | |
| 		// Initialize icon types registry.
 | |
| 		$this->init_registry();
 | |
| 
 | |
| 		// Initialize loader.
 | |
| 		$this->init_loader();
 | |
| 
 | |
| 		// Initialize field.
 | |
| 		$this->init_field();
 | |
| 
 | |
| 		/**
 | |
| 		 * Fires when Icon Picker is ready
 | |
| 		 *
 | |
| 		 * @since 0.1.0
 | |
| 		 * @param Icon_Picker $this Icon_Picker instance.
 | |
| 		 */
 | |
| 		do_action( 'icon_picker_init', $this );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Initialize icon types registry
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected function init_registry() {
 | |
| 		require_once "{$this->dir}/includes/registry.php";
 | |
| 		$this->registry = Icon_Picker_Types_Registry::instance();
 | |
| 
 | |
| 		$this->register_default_types();
 | |
| 
 | |
| 		/**
 | |
| 		 * Fires when Icon Picker's Registry is ready and the default types are registered.
 | |
| 		 *
 | |
| 		 * @since 0.1.0
 | |
| 		 * @param Icon_Picker $this Icon_Picker instance.
 | |
| 		 */
 | |
| 		do_action( 'icon_picker_types_registry_ready', $this );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Register default icon types
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 */
 | |
| 	protected function register_default_types() {
 | |
| 		require_once "{$this->dir}/includes/fontpack.php";
 | |
| 		Icon_Picker_Fontpack::instance();
 | |
| 
 | |
| 		/**
 | |
| 		 * Allow themes/plugins to disable one or more default types
 | |
| 		 *
 | |
| 		 * @since 0.1.0
 | |
| 		 * @param array $default_types Default icon types.
 | |
| 		 */
 | |
| 		$default_types = array_filter( (array) apply_filters( 'icon_picker_default_types', $this->default_types ) );
 | |
| 
 | |
| 		/**
 | |
| 		 * Validate filtered default types
 | |
| 		 */
 | |
| 		$default_types = array_intersect( $this->default_types, $default_types );
 | |
| 
 | |
| 		if ( empty( $default_types ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		foreach ( $default_types as $filename => $class_suffix ) {
 | |
| 			$class_name = "Icon_Picker_Type_{$class_suffix}";
 | |
| 
 | |
| 			require_once "{$this->dir}/includes/types/{$filename}.php";
 | |
| 			$this->registry->add( new $class_name() );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Initialize loader
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @access protected
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected function init_loader() {
 | |
| 		require_once "{$this->dir}/includes/loader.php";
 | |
| 		$this->loader = Icon_Picker_Loader::instance();
 | |
| 
 | |
| 		/**
 | |
| 		 * Fires when Icon Picker's Registry is ready and the default types are registered.
 | |
| 		 *
 | |
| 		 * @since 0.1.0
 | |
| 		 * @param Icon_Picker $this Icon_Picker instance.
 | |
| 		 */
 | |
| 		do_action( 'icon_picker_loader_ready', $this );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Initialize field functionalities
 | |
| 	 *
 | |
| 	 * @since  0.2.0
 | |
| 	 * @access protected
 | |
| 	 */
 | |
| 	protected function init_field() {
 | |
| 		require_once "{$this->dir}/includes/fields/base.php";
 | |
| 
 | |
| 		add_filter( 'cmb_field_types', array( $this, 'register_cmb_field' ) );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Register the field for Custom Meta Boxes
 | |
| 	 *
 | |
| 	 * @since   0.2.0
 | |
| 	 * @wp_hook filter  cmb_field_types
 | |
| 	 * @link    https://github.com/humanmade/Custom-Meta-Boxes/ Custom Meta Boxes
 | |
| 	 *
 | |
| 	 * @param   array  $field_types Available CMB field types.
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function register_cmb_field( $field_types ) {
 | |
| 		require_once "{$this->dir}/includes/fields/cmb.php";
 | |
| 
 | |
| 		$field_types['icon'] = 'Icon_Picker_Field_Cmb';
 | |
| 
 | |
| 		return $field_types;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Load icon picker functionality on an admin page
 | |
| 	 *
 | |
| 	 * @since  0.1.0
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function load() {
 | |
| 		if ( true === $this->is_admin_loaded ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$this->loader->load();
 | |
| 		$this->is_admin_loaded = true;
 | |
| 	}
 | |
| }
 | |
| if ( function_exists( 'add_action' ) ) {
 | |
| 	add_action( 'plugins_loaded', array( 'Icon_Picker', 'instance' ), 7 );
 | |
| }
 |