scripts array JS scripts * > styles array Stylesheets */ protected $files = array( 'scripts' => array(), 'styles' => array(), ); /** * Properties that can be inherited from parent * @var array */ protected $parent_props = array(); /*-** Methods **-*/ /** * Constructor * @param string $id Unique ID for content type * @param array $props (optional) Type properties (optional because props can be set post-init) */ public function __construct( $id, $props = null ) { parent::__construct(); $this ->set_id( $id ) ->set_props( $props ); } /** * Checks if object is valid * To be overriden by child classes */ public function is_valid() { return true; } /*-** Getters/Setters **-*/ /** * Get ID * @return string ID */ public function get_id() { return $this->id; } /** * Set ID * @param string $id ID * @return object Current instance */ public function set_id( $id ) { $id = ( is_string( $id ) ) ? trim( $id ) : ''; if ( ! empty( $id ) ) { $this->id = $id; } return $this; } /** * Set type properties * @param array $props Type properties to set */ protected function set_props( $props ) { if ( is_array( $props ) && ! empty( $props ) ) { foreach ( $props as $key => $val ) { // Check for setter method $m = 'set_' . $key; if ( method_exists( $this, $m ) ) { $this->{$m}( $val ); } } } return $this; } /** * Get parent * @return object|null Parent */ public function get_parent() { return $this->parent; } /** * Set parent * @param object $parent Parent object * @return object Current instance */ public function set_parent( $parent ) { $this->parent = ( $parent instanceof $this ) ? $parent : null; return $this; } /** * Check if parent is set * @return bool TRUE if parent is set */ public function has_parent() { return ( is_null( $this->parent ) ) ? false : true; } /** * Retrieve all ancestors * @return array Ancestors */ public function get_ancestors() { $ret = array(); $curr = $this; while ( $curr->has_parent() ) { // Get next ancestor. $curr = $curr->get_parent(); // Add ancestor. $ret[] = $curr; } return $ret; } /* Files */ /** * Add file * @param string $type Group to add file to * @param string $handle Name for resource * @param string $src File URI * @return object Current instance */ protected function add_file( $type, $handle, $src, $deps = array() ) { if ( is_string( $type ) && is_string( $handle ) && is_string( $src ) ) { // Validate dependencies if ( ! is_array( $deps ) ) { $deps = array(); } // Init file group if ( ! isset( $this->files[ $type ] ) || ! is_array( $this->files[ $type ] ) ) { $this->files[ $type ] = array(); } // Add file to group $this->files[ $type ][ $handle ] = array( 'handle' => $handle, 'uri' => $src, 'deps' => $deps, ); } return $this; } /** * Add multiple files * @param string $type Group to add files to * @param array $files Files to add * @see add_file() for file parameters * @return object Current instance */ protected function add_files( $type, $files ) { if ( ! is_array( $files ) || empty( $files ) ) { return false; } $m = $this->m( 'add_file' ); foreach ( $files as $file ) { if ( ! is_array( $file ) || empty( $file ) ) { continue; } array_unshift( $file, $type ); call_user_func_array( $m, $file ); } return $this; } /** * Retrieve files * All files or a specific group of files can be retrieved * @param string $type (optional) File group to retrieve * @return array Files */ protected function get_files( $type = null ) { $ret = $this->files; if ( is_string( $type ) ) { $ret = ( isset( $ret[ $type ] ) ) ? $ret[ $type ] : array(); } if ( ! is_array( $ret ) ) { $ret = array(); } return $ret; } /** * Retrieve file * @param string $type Group to retrieve file from * @param string $handle * @param string $format (optional) Format of return value (Default: array) * @return array|null File properties (Default: NULL) */ protected function get_file( $type, $handle, $format = null ) { // Get files $files = $this->get_files( $type ); // Get specified file $ret = ( is_string( $type ) && isset( $files[ $handle ] ) ) ? $files[ $handle ] : null; // Format return value if ( ! empty( $ret ) && ! ! $format ) { switch ( $format ) { case 'uri': $ret = $ret['uri']; // Normalize URI if ( ! $this->util->is_uri( $ret ) ) { $ret = $this->util->normalize_path( site_url(), $ret ); } break; case 'path': $ret = $ret['uri']; // Normalize path if ( ! $this->util->is_uri( $ret ) ) { $ret = $this->util->get_relative_path( $ret ); $ret = $this->util->normalize_path( ABSPATH, $ret ); } break; case 'object': $ret = (object) $ret; break; case 'contents': $ret = $ret['uri']; if ( ! $this->util->is_uri( $ret ) ) { $ret = $this->util->normalize_path( site_url(), $ret ); } $get = wp_safe_remote_get( $ret ); $ret = ( ! is_wp_error( $get ) && 200 === $get['response']['code'] ) ? $get['body'] : ''; break; } } return $ret; } /** * Add stylesheet * @param string $handle Name of the stylesheet * @param string $src Stylesheet URI * @return object Current instance */ public function add_style( $handle, $src, $deps = array() ) { return $this->add_file( 'styles', $handle, $src, $deps ); } /** * Retrieve stylesheet files * @return array Stylesheet files */ public function get_styles( $opts = null ) { $files = $this->get_files( 'styles' ); if ( is_array( $opts ) ) { $opts = (object) $opts; } if ( is_object( $opts ) && ! empty( $opts ) ) { // Parse options // URI Format if ( isset( $opts->uri_format ) ) { foreach ( $files as $hdl => $props ) { switch ( $opts->uri_format ) { case 'full': if ( ! $this->util->is_uri( $props['uri'] ) ) { $files[ $hdl ]['uri'] = $this->util->normalize_path( site_url(), $props['uri'] ); } break; } } } } return $files; } /** * Retrieve stylesheet file * @param string $handle Name of stylesheet * @param string $format (optional) Format of return value (@see `get_file()`) * @return array|null File properties (Default: NULL) */ public function get_style( $handle, $format = null ) { return $this->get_file( 'styles', $handle, $format ); } /** * Add script * @param string $handle Name of the script * @param string $src Script URI * @return object Current instance */ public function add_script( $handle, $src, $deps = array() ) { return $this->add_file( 'scripts', $handle, $src, $deps ); } /** * Retrieve script files * @return array Script files */ public function get_scripts() { return $this->get_files( 'scripts' ); } /** * Retrieve script file * @param string $handle Name of script * @param string $format (optional) Format of return value (@see `get_file()`) * @return array|null File properties (Default: NULL) */ public function get_script( $handle, $format = null ) { return $this->get_file( 'scripts', $handle, $format ); } }