2012-03-28 00:14:09 -04:00
< ? php
/**
* Customize Control Class
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
class WP_Customize_Control {
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var WP_Customize_Manager
*/
2012-03-28 00:14:09 -04:00
public $manager ;
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var string
*/
2012-03-28 00:14:09 -04:00
public $id ;
2012-07-26 17:45:33 -04:00
/**
* All settings tied to the control .
*
* @ access public
* @ var array
*/
2012-03-28 00:14:09 -04:00
public $settings ;
2012-06-09 20:32:19 -04:00
2012-07-26 17:45:33 -04:00
/**
* The primary setting for the control ( if there is one ) .
*
* @ access public
* @ var string
*/
2012-06-09 20:32:19 -04:00
public $setting = 'default' ;
2012-03-28 00:14:09 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var int
*/
2014-03-04 15:21:14 -05:00
public $priority = 10 ;
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var string
*/
2014-03-04 15:21:14 -05:00
public $section = '' ;
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var string
*/
2014-03-04 15:21:14 -05:00
public $label = '' ;
2012-07-31 22:30:02 -04:00
2014-06-30 11:55:17 -04:00
/**
* @ access public
* @ var string
*/
public $description = '' ;
2012-07-26 17:45:33 -04:00
/**
* @ todo : Remove choices
*
* @ access public
* @ var array
*/
2014-03-04 15:21:14 -05:00
public $choices = array ();
2012-03-28 00:14:09 -04:00
2014-06-30 15:48:13 -04:00
/**
* @ access public
* @ var array
*/
public $input_attrs = array ();
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var array
*/
2012-03-29 02:35:54 -04:00
public $json = array ();
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var string
*/
2012-03-28 00:14:09 -04:00
public $type = 'text' ;
2014-07-09 19:58:16 -04:00
/**
2014-07-13 20:32:16 -04:00
* Callback .
2014-07-09 19:58:16 -04:00
*
* @ since 4.0 . 0
* @ access public
2014-07-13 20:32:16 -04:00
*
2014-07-09 19:58:16 -04:00
* @ see WP_Customize_Control :: active ()
2014-07-13 20:32:16 -04:00
*
* @ var callable Callback is called with one argument , the instance of
* WP_Customize_Control , and returns bool to indicate whether
* the control is active ( such as it relates to the URL
* currently being previewed ) .
2014-07-09 19:58:16 -04:00
*/
public $active_callback = '' ;
2012-03-28 00:14:09 -04:00
/**
* Constructor .
*
2014-03-04 15:21:14 -05:00
* Supplied $args override class property defaults .
*
2012-03-28 00:14:09 -04:00
* If $args [ 'settings' ] is not defined , use the $id as the setting ID .
*
* @ since 3.4 . 0
2012-07-26 17:45:33 -04:00
*
* @ param WP_Customize_Manager $manager
* @ param string $id
* @ param array $args
2012-03-28 00:14:09 -04:00
*/
2014-05-19 01:45:16 -04:00
public function __construct ( $manager , $id , $args = array () ) {
2012-03-29 02:35:54 -04:00
$keys = array_keys ( get_object_vars ( $this ) );
2012-03-28 00:14:09 -04:00
foreach ( $keys as $key ) {
2014-07-09 19:58:16 -04:00
if ( isset ( $args [ $key ] ) ) {
2012-03-28 00:14:09 -04:00
$this -> $key = $args [ $key ];
2014-07-09 19:58:16 -04:00
}
2012-03-28 00:14:09 -04:00
}
$this -> manager = $manager ;
$this -> id = $id ;
2014-07-09 19:58:16 -04:00
if ( empty ( $this -> active_callback ) ) {
$this -> active_callback = array ( $this , 'active_callback' );
}
2012-03-28 00:14:09 -04:00
// Process settings.
2014-07-09 19:58:16 -04:00
if ( empty ( $this -> settings ) ) {
2012-03-28 00:14:09 -04:00
$this -> settings = $id ;
2014-07-09 19:58:16 -04:00
}
2012-03-28 00:14:09 -04:00
$settings = array ();
if ( is_array ( $this -> settings ) ) {
foreach ( $this -> settings as $key => $setting ) {
$settings [ $key ] = $this -> manager -> get_setting ( $setting );
}
} else {
$this -> setting = $this -> manager -> get_setting ( $this -> settings );
$settings [ 'default' ] = $this -> setting ;
}
$this -> settings = $settings ;
}
/**
* Enqueue control related scripts / styles .
*
* @ since 3.4 . 0
*/
2012-04-25 17:03:29 -04:00
public function enqueue () {}
2012-03-28 00:14:09 -04:00
2014-07-09 19:58:16 -04:00
/**
2014-10-15 13:21:19 -04:00
* Check whether control is active to current Customizer preview .
2014-07-09 19:58:16 -04:00
*
* @ since 4.0 . 0
2014-07-13 20:32:16 -04:00
* @ access public
2014-07-09 19:58:16 -04:00
*
2014-07-13 20:32:16 -04:00
* @ return bool Whether the control is active to the current preview .
2014-07-09 19:58:16 -04:00
*/
public final function active () {
$control = $this ;
$active = call_user_func ( $this -> active_callback , $this );
/**
* Filter response of WP_Customize_Control :: active () .
*
* @ since 4.0 . 0
*
2014-07-13 20:32:16 -04:00
* @ param bool $active Whether the Customizer control is active .
* @ param WP_Customize_Control $control WP_Customize_Control instance .
2014-07-09 19:58:16 -04:00
*/
$active = apply_filters ( 'customize_control_active' , $active , $control );
return $active ;
}
/**
* Default callback used when invoking WP_Customize_Control :: active () .
*
* Subclasses can override this with their specific logic , or they may
* provide an 'active_callback' argument to the constructor .
*
2014-07-13 20:32:16 -04:00
* @ since 4.0 . 0
* @ access public
*
* @ return bool Always true .
2014-07-09 19:58:16 -04:00
*/
public function active_callback () {
return true ;
}
2012-03-28 00:14:09 -04:00
/**
* Fetch a setting ' s value .
* Grabs the main setting by default .
*
* @ since 3.4 . 0
2012-07-26 17:45:33 -04:00
*
* @ param string $setting_key
* @ return mixed The requested setting ' s value , if the setting exists .
2012-03-28 00:14:09 -04:00
*/
public final function value ( $setting_key = 'default' ) {
2014-07-09 19:58:16 -04:00
if ( isset ( $this -> settings [ $setting_key ] ) ) {
2012-03-28 00:14:09 -04:00
return $this -> settings [ $setting_key ] -> value ();
2014-07-09 19:58:16 -04:00
}
2012-03-28 00:14:09 -04:00
}
2012-03-29 02:35:54 -04:00
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
*/
public function to_json () {
$this -> json [ 'settings' ] = array ();
2012-03-28 00:14:09 -04:00
foreach ( $this -> settings as $key => $setting ) {
2012-03-29 02:35:54 -04:00
$this -> json [ 'settings' ][ $key ] = $setting -> id ;
2012-03-28 00:14:09 -04:00
}
2012-03-29 02:35:54 -04:00
$this -> json [ 'type' ] = $this -> type ;
2014-07-09 19:58:16 -04:00
$this -> json [ 'active' ] = $this -> active ();
2012-03-28 00:14:09 -04:00
}
/**
* Check if the theme supports the control and check user capabilities .
*
* @ since 3.4 . 0
*
* @ return bool False if theme doesn 't support the control or user doesn' t have the required permissions , otherwise true .
*/
public final function check_capabilities () {
foreach ( $this -> settings as $setting ) {
if ( ! $setting -> check_capabilities () )
return false ;
}
$section = $this -> manager -> get_section ( $this -> section );
if ( isset ( $section ) && ! $section -> check_capabilities () )
return false ;
return true ;
}
/**
2012-04-04 13:32:03 -04:00
* Check capabilities and render the control .
2012-03-28 00:14:09 -04:00
*
* @ since 3.4 . 0
2012-07-26 17:45:33 -04:00
* @ uses WP_Customize_Control :: render ()
2012-03-28 00:14:09 -04:00
*/
public final function maybe_render () {
if ( ! $this -> check_capabilities () )
return ;
2014-03-06 08:51:14 -05:00
/**
* Fires just before the current Customizer control is rendered .
*
* @ since 3.4 . 0
*
* @ param WP_Customize_Control $this WP_Customize_Control instance .
*/
2012-03-28 00:14:09 -04:00
do_action ( 'customize_render_control' , $this );
2014-03-06 08:51:14 -05:00
/**
* Fires just before a specific Customizer control is rendered .
*
* The dynamic portion of the hook name , $this -> id , refers to
* the control ID .
*
* @ since 3.4 . 0
*
* @ param WP_Customize_Control $this WP_Customize_Control instance .
*/
2012-03-28 00:14:09 -04:00
do_action ( 'customize_render_control_' . $this -> id , $this );
$this -> render ();
}
/**
2014-03-04 15:21:14 -05:00
* Renders the control wrapper and calls $this -> render_content () for the internals .
2012-03-28 00:14:09 -04:00
*
* @ since 3.4 . 0
*/
protected function render () {
2012-03-28 05:10:29 -04:00
$id = 'customize-control-' . str_replace ( '[' , '-' , str_replace ( ']' , '' , $this -> id ) );
2012-03-28 00:14:09 -04:00
$class = 'customize-control customize-control-' . $this -> type ;
2012-04-18 13:13:31 -04:00
?> <li id="<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $class ); ?>">
2012-03-28 00:14:09 -04:00
< ? php $this -> render_content (); ?>
</ li >< ? php
}
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
2014-03-04 15:21:14 -05:00
* Get the data link attribute for a setting .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
*
* @ param string $setting_key
* @ return string Data link parameter , if $setting_key is a valid setting , empty string otherwise .
*/
2012-03-28 05:45:51 -04:00
public function get_link ( $setting_key = 'default' ) {
2012-03-28 00:14:09 -04:00
if ( ! isset ( $this -> settings [ $setting_key ] ) )
2012-03-28 05:45:51 -04:00
return '' ;
2012-03-28 00:14:09 -04:00
2012-03-28 05:45:51 -04:00
return 'data-customize-setting-link="' . esc_attr ( $this -> settings [ $setting_key ] -> id ) . '"' ;
}
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
2014-03-04 15:21:14 -05:00
* Render the data link attribute for the control ' s input element .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
* @ uses WP_Customize_Control :: get_link ()
*
* @ param string $setting_key
*/
2012-03-28 05:45:51 -04:00
public function link ( $setting_key = 'default' ) {
echo $this -> get_link ( $setting_key );
2012-03-28 00:14:09 -04:00
}
2014-07-09 19:58:16 -04:00
/**
2014-06-30 15:48:13 -04:00
* Render the custom attributes for the control ' s input element .
*
* @ since 4.0 . 0
2014-07-13 20:32:16 -04:00
* @ access public
2014-06-30 15:48:13 -04:00
*/
public function input_attrs () {
foreach ( $this -> input_attrs as $attr => $value ) {
echo $attr . '="' . esc_attr ( $value ) . '" ' ;
}
}
2012-03-28 00:14:09 -04:00
/**
* Render the control ' s content .
*
2014-03-04 15:21:14 -05:00
* Allows the content to be overriden without having to rewrite the wrapper in $this -> render () .
*
2014-06-30 15:48:13 -04:00
* Supports basic input types `text` , `checkbox` , `textarea` , `radio` , `select` and `dropdown-pages` .
* Additional input types such as `email` , `url` , `number` , `hidden` and `date` are supported implicitly .
2012-03-28 00:14:09 -04:00
*
* @ since 3.4 . 0
*/
protected function render_content () {
switch ( $this -> type ) {
case 'checkbox' :
?>
< label >
2012-04-25 17:03:29 -04:00
< input type = " checkbox " value = " <?php echo esc_attr( $this->value () ); ?> " < ? php $this -> link (); checked ( $this -> value () ); ?> />
2012-05-11 20:48:20 -04:00
< ? php echo esc_html ( $this -> label ); ?>
2014-06-30 11:55:17 -04:00
< ? php if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 11:55:17 -04:00
< ? php endif ; ?>
2012-03-28 00:14:09 -04:00
</ label >
< ? php
break ;
case 'radio' :
if ( empty ( $this -> choices ) )
return ;
$name = '_customize-radio-' . $this -> id ;
2014-06-30 11:55:17 -04:00
if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 11:55:17 -04:00
< ? php endif ;
2012-03-28 00:14:09 -04:00
foreach ( $this -> choices as $value => $label ) :
?>
< label >
< input type = " radio " value = " <?php echo esc_attr( $value ); ?> " name = " <?php echo esc_attr( $name ); ?> " < ? php $this -> link (); checked ( $this -> value (), $value ); ?> />
< ? php echo esc_html ( $label ); ?> <br/>
</ label >
< ? php
endforeach ;
break ;
case 'select' :
if ( empty ( $this -> choices ) )
return ;
?>
< label >
2014-06-30 11:55:17 -04:00
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 11:55:17 -04:00
< ? php endif ; ?>
2012-04-25 17:03:29 -04:00
< select < ? php $this -> link (); ?> >
2012-03-28 00:14:09 -04:00
< ? php
foreach ( $this -> choices as $value => $label )
echo '<option value="' . esc_attr ( $value ) . '"' . selected ( $this -> value (), $value , false ) . '>' . $label . '</option>' ;
?>
</ select >
</ label >
< ? php
break ;
2014-06-30 15:48:13 -04:00
case 'textarea' :
?>
< label >
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 15:48:13 -04:00
< ? php endif ; ?>
< textarea rows = " 5 " < ? php $this -> link (); ?> ><?php echo esc_textarea( $this->value() ); ?></textarea>
</ label >
< ? php
break ;
2012-03-28 00:14:09 -04:00
case 'dropdown-pages' :
2012-03-28 05:45:51 -04:00
$dropdown = wp_dropdown_pages (
array (
'name' => '_customize-dropdown-pages-' . $this -> id ,
'echo' => 0 ,
'show_option_none' => __ ( '— Select —' ),
'option_none_value' => '0' ,
'selected' => $this -> value (),
)
);
// Hackily add in the data link parameter.
$dropdown = str_replace ( '<select' , '<select ' . $this -> get_link (), $dropdown );
2012-03-28 00:14:09 -04:00
printf (
'<label class="customize-control-select"><span class="customize-control-title">%s</span> %s</label>' ,
$this -> label ,
2012-03-28 05:45:51 -04:00
$dropdown
2012-03-28 00:14:09 -04:00
);
break ;
2014-06-30 15:48:13 -04:00
default :
?>
< label >
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 15:48:13 -04:00
< ? php endif ; ?>
< input type = " <?php echo esc_attr( $this->type ); ?> " < ? php $this -> input_attrs (); ?> value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->link(); ?> />
</ label >
< ? php
break ;
2012-03-28 00:14:09 -04:00
}
}
2012-03-29 02:35:54 -04:00
}
2012-07-26 17:45:33 -04:00
/**
* Customize Color Control Class
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2012-04-25 17:03:29 -04:00
class WP_Customize_Color_Control extends WP_Customize_Control {
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var string
*/
2012-04-25 17:03:29 -04:00
public $type = 'color' ;
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ access public
* @ var array
*/
2012-04-25 17:03:29 -04:00
public $statuses ;
2012-07-26 17:45:33 -04:00
/**
* Constructor .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager
* @ param string $id
* @ param array $args
*/
2012-04-25 17:03:29 -04:00
public function __construct ( $manager , $id , $args = array () ) {
$this -> statuses = array ( '' => __ ( 'Default' ) );
parent :: __construct ( $manager , $id , $args );
}
2012-07-26 17:45:33 -04:00
/**
2014-03-04 15:21:14 -05:00
* Enqueue scripts / styles for the color picker .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
*/
2012-04-25 17:03:29 -04:00
public function enqueue () {
2012-09-26 21:57:38 -04:00
wp_enqueue_script ( 'wp-color-picker' );
wp_enqueue_style ( 'wp-color-picker' );
2012-04-25 17:03:29 -04:00
}
2012-07-26 17:45:33 -04:00
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Control :: to_json ()
*/
2012-04-25 17:03:29 -04:00
public function to_json () {
parent :: to_json ();
$this -> json [ 'statuses' ] = $this -> statuses ;
}
2012-07-26 17:45:33 -04:00
/**
* Render the control ' s content .
*
* @ since 3.4 . 0
*/
2012-04-25 17:03:29 -04:00
public function render_content () {
2012-09-26 21:57:38 -04:00
$this_default = $this -> setting -> default ;
$default_attr = '' ;
if ( $this_default ) {
if ( false === strpos ( $this_default , '#' ) )
$this_default = '#' . $this_default ;
$default_attr = ' data-default-color="' . esc_attr ( $this_default ) . '"' ;
}
// The input's value gets set by JS. Don't fill it.
2012-04-25 17:03:29 -04:00
?>
< label >
2014-06-30 11:55:17 -04:00
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 11:55:17 -04:00
< ? php endif ; ?>
2012-04-25 17:03:29 -04:00
< div class = " customize-control-content " >
2013-05-08 14:15:14 -04:00
< input class = " color-picker-hex " type = " text " maxlength = " 7 " placeholder = " <?php esc_attr_e( 'Hex Value' ); ?> " < ? php echo $default_attr ; ?> />
2012-04-25 17:03:29 -04:00
</ div >
</ label >
< ? php
}
}
2012-07-26 17:45:33 -04:00
/**
* Customize Upload Control Class
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2012-03-29 02:35:54 -04:00
class WP_Customize_Upload_Control extends WP_Customize_Control {
public $type = 'upload' ;
public $removed = '' ;
public $context ;
2012-11-09 23:59:46 -05:00
public $extensions = array ();
2012-03-29 02:35:54 -04:00
2012-07-26 17:45:33 -04:00
/**
* Enqueue control related scripts / styles .
*
* @ since 3.4 . 0
*/
2012-03-29 02:35:54 -04:00
public function enqueue () {
wp_enqueue_script ( 'wp-plupload' );
}
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Control :: to_json ()
*/
2012-03-29 02:35:54 -04:00
public function to_json () {
parent :: to_json ();
$this -> json [ 'removed' ] = $this -> removed ;
if ( $this -> context )
$this -> json [ 'context' ] = $this -> context ;
2012-11-09 00:47:02 -05:00
if ( $this -> extensions )
2012-11-09 23:59:46 -05:00
$this -> json [ 'extensions' ] = implode ( ',' , $this -> extensions );
2012-03-29 02:35:54 -04:00
}
2012-07-26 17:45:33 -04:00
/**
* Render the control ' s content .
*
* @ since 3.4 . 0
*/
2012-03-29 02:35:54 -04:00
public function render_content () {
?>
< label >
2014-06-30 11:55:17 -04:00
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 11:55:17 -04:00
< ? php endif ; ?>
2012-03-29 02:35:54 -04:00
< div >
< a href = " # " class = " button-secondary upload " >< ? php _e ( 'Upload' ); ?> </a>
< a href = " # " class = " remove " >< ? php _e ( 'Remove' ); ?> </a>
</ div >
</ label >
< ? php
}
}
2012-07-26 17:45:33 -04:00
/**
* Customize Image Control Class
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2012-03-29 02:35:54 -04:00
class WP_Customize_Image_Control extends WP_Customize_Upload_Control {
public $type = 'image' ;
public $get_url ;
2012-04-25 17:03:29 -04:00
public $statuses ;
2012-11-09 23:59:46 -05:00
public $extensions = array ( 'jpg' , 'jpeg' , 'gif' , 'png' );
2012-03-29 02:35:54 -04:00
2012-04-19 22:39:55 -04:00
protected $tabs = array ();
2012-07-26 17:45:33 -04:00
/**
* Constructor .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Upload_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager
* @ param string $id
* @ param array $args
*/
2012-04-19 22:39:55 -04:00
public function __construct ( $manager , $id , $args ) {
2012-04-25 17:03:29 -04:00
$this -> statuses = array ( '' => __ ( 'No Image' ) );
2012-04-19 22:39:55 -04:00
parent :: __construct ( $manager , $id , $args );
$this -> add_tab ( 'upload-new' , __ ( 'Upload New' ), array ( $this , 'tab_upload_new' ) );
$this -> add_tab ( 'uploaded' , __ ( 'Uploaded' ), array ( $this , 'tab_uploaded' ) );
2012-08-01 02:45:54 -04:00
// Early priority to occur before $this->manager->prepare_controls();
add_action ( 'customize_controls_init' , array ( $this , 'prepare_control' ), 5 );
}
/**
* Prepares the control .
*
* If no tabs exist , removes the control from the manager .
*
2012-08-01 03:20:44 -04:00
* @ since 3.4 . 2
2012-08-01 02:45:54 -04:00
*/
public function prepare_control () {
if ( ! $this -> tabs )
$this -> manager -> remove_control ( $this -> id );
2012-04-19 22:39:55 -04:00
}
2012-07-26 17:45:33 -04:00
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Upload_Control :: to_json ()
*/
2012-04-25 17:03:29 -04:00
public function to_json () {
parent :: to_json ();
$this -> json [ 'statuses' ] = $this -> statuses ;
}
2012-07-26 17:45:33 -04:00
/**
* Render the control ' s content .
*
* @ since 3.4 . 0
*/
2012-03-29 02:35:54 -04:00
public function render_content () {
$src = $this -> value ();
if ( isset ( $this -> get_url ) )
$src = call_user_func ( $this -> get_url , $src );
?>
2012-06-06 17:45:17 -04:00
< div class = " customize-image-picker " >
2014-06-30 11:55:17 -04:00
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ;
if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 16:11:15 -04:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 11:55:17 -04:00
< ? php endif ; ?>
2012-04-19 02:29:54 -04:00
2012-04-25 17:03:29 -04:00
< div class = " customize-control-content " >
2012-11-06 09:47:25 -05:00
< div class = " dropdown preview-thumbnail " tabindex = " 0 " >
2012-04-25 17:03:29 -04:00
< div class = " dropdown-content " >
< ? php if ( empty ( $src ) ) : ?>
< img style = " display:none; " />
< ? php else : ?>
2012-05-18 16:22:57 -04:00
< img src = " <?php echo esc_url( set_url_scheme( $src ) ); ?> " />
2012-04-25 17:03:29 -04:00
< ? php endif ; ?>
< div class = " dropdown-status " ></ div >
</ div >
< div class = " dropdown-arrow " ></ div >
2012-04-19 22:39:55 -04:00
</ div >
2012-04-19 02:29:54 -04:00
</ div >
< div class = " library " >
< ul >
2012-04-19 22:39:55 -04:00
< ? php foreach ( $this -> tabs as $id => $tab ) : ?>
2012-11-06 09:47:25 -05:00
< li data - customize - tab = '<?php echo esc_attr( $id ); ?>' tabindex = '0' >
2012-04-19 22:39:55 -04:00
< ? php echo esc_html ( $tab [ 'label' ] ); ?>
2012-04-19 02:29:54 -04:00
</ li >
2012-03-29 02:35:54 -04:00
< ? php endforeach ; ?>
2012-04-19 02:29:54 -04:00
</ ul >
2012-04-19 22:39:55 -04:00
< ? php foreach ( $this -> tabs as $id => $tab ) : ?>
< div class = " library-content " data - customize - tab = '<?php echo esc_attr( $id ); ?>' >
< ? php call_user_func ( $tab [ 'callback' ] ); ?>
2012-04-19 02:29:54 -04:00
</ div >
< ? php endforeach ; ?>
2012-03-29 02:35:54 -04:00
</ div >
2012-04-19 22:39:55 -04:00
< div class = " actions " >
< a href = " # " class = " remove " >< ? php _e ( 'Remove Image' ); ?> </a>
</ div >
2012-06-06 17:45:17 -04:00
</ div >
2012-03-29 02:35:54 -04:00
< ? php
}
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* Add a tab to the control .
*
* @ since 3.4 . 0
*
* @ param string $id
* @ param string $label
* @ param mixed $callback
*/
2012-04-19 22:39:55 -04:00
public function add_tab ( $id , $label , $callback ) {
$this -> tabs [ $id ] = array (
'label' => $label ,
'callback' => $callback ,
);
}
2012-07-26 17:45:33 -04:00
/**
* Remove a tab from the control .
*
* @ since 3.4 . 0
*
* @ param string $id
*/
2012-04-19 22:39:55 -04:00
public function remove_tab ( $id ) {
unset ( $this -> tabs [ $id ] );
}
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
*/
2012-04-19 22:39:55 -04:00
public function tab_upload_new () {
2012-06-06 17:45:17 -04:00
if ( ! _device_can_upload () ) {
2014-09-09 02:29:15 -04:00
echo '<p>' . sprintf ( __ ( 'The web browser on your device cannot be used to upload files. You may be able to use the <a href="%s">native app for your device</a> instead.' ), 'https://apps.wordpress.org/' ) . '</p>' ;
2012-06-06 17:45:17 -04:00
} else {
?>
< div class = " upload-dropzone " >
< ? php _e ( 'Drop a file here or <a href="#" class="upload">select a file</a>.' ); ?>
</ div >
< div class = " upload-fallback " >
< span class = " button-secondary " >< ? php _e ( 'Select File' ); ?> </span>
</ div >
< ? php
}
2012-04-19 22:39:55 -04:00
}
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
*/
2012-04-19 22:39:55 -04:00
public function tab_uploaded () {
?>
< div class = " uploaded-target " ></ div >
< ? php
}
2012-05-25 16:26:25 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
*
* @ param string $url
* @ param string $thumbnail_url
*/
2012-05-25 16:26:25 -04:00
public function print_tab_image ( $url , $thumbnail_url = null ) {
$url = set_url_scheme ( $url );
$thumbnail_url = ( $thumbnail_url ) ? set_url_scheme ( $thumbnail_url ) : $url ;
?>
< a href = " # " class = " thumbnail " data - customize - image - value = " <?php echo esc_url( $url ); ?> " >
< img src = " <?php echo esc_url( $thumbnail_url ); ?> " />
</ a >
< ? php
}
}
2012-07-26 17:45:33 -04:00
/**
* Customize Background Image Control Class
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2012-05-25 16:26:25 -04:00
class WP_Customize_Background_Image_Control extends WP_Customize_Image_Control {
2012-07-26 17:45:33 -04:00
/**
* Constructor .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Image_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager
*/
2012-05-25 16:26:25 -04:00
public function __construct ( $manager ) {
parent :: __construct ( $manager , 'background_image' , array (
'label' => __ ( 'Background Image' ),
'section' => 'background_image' ,
'context' => 'custom-background' ,
'get_url' => 'get_background_image' ,
) );
if ( $this -> setting -> default )
$this -> add_tab ( 'default' , __ ( 'Default' ), array ( $this , 'tab_default_background' ) );
}
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
*/
2012-05-25 16:26:25 -04:00
public function tab_uploaded () {
$backgrounds = get_posts ( array (
'post_type' => 'attachment' ,
'meta_key' => '_wp_attachment_is_custom_background' ,
'meta_value' => $this -> manager -> get_stylesheet (),
'orderby' => 'none' ,
'nopaging' => true ,
) );
?> <div class="uploaded-target"></div><?php
if ( empty ( $backgrounds ) )
return ;
foreach ( ( array ) $backgrounds as $background )
$this -> print_tab_image ( esc_url_raw ( $background -> guid ) );
}
2012-07-31 22:30:02 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
* @ uses WP_Customize_Image_Control :: print_tab_image ()
*/
2012-05-25 16:26:25 -04:00
public function tab_default_background () {
$this -> print_tab_image ( $this -> setting -> default );
}
2012-04-04 13:32:03 -04:00
}
2012-04-19 22:39:55 -04:00
2014-04-11 19:25:16 -04:00
class WP_Customize_Header_Image_Control extends WP_Customize_Image_Control {
2014-03-11 00:13:16 -04:00
public $type = 'header' ;
2012-07-26 17:45:33 -04:00
2012-04-19 22:39:55 -04:00
public function __construct ( $manager ) {
parent :: __construct ( $manager , 'header_image' , array (
2012-04-25 17:03:29 -04:00
'label' => __ ( 'Header Image' ),
2012-06-09 20:32:19 -04:00
'settings' => array (
'default' => 'header_image' ,
'data' => 'header_image_data' ,
),
2012-05-25 15:52:54 -04:00
'section' => 'header_image' ,
2012-04-25 17:03:29 -04:00
'context' => 'custom-header' ,
'removed' => 'remove-header' ,
'get_url' => 'get_header_image' ,
2014-03-11 00:13:16 -04:00
) );
}
public function to_json () {
parent :: to_json ();
}
public function enqueue () {
wp_enqueue_media ();
wp_enqueue_script ( 'customize-views' );
$this -> prepare_control ();
wp_localize_script ( 'customize-views' , '_wpCustomizeHeader' , array (
'data' => array (
'width' => absint ( get_theme_support ( 'custom-header' , 'width' ) ),
'height' => absint ( get_theme_support ( 'custom-header' , 'height' ) ),
'flex-width' => absint ( get_theme_support ( 'custom-header' , 'flex-width' ) ),
'flex-height' => absint ( get_theme_support ( 'custom-header' , 'flex-height' ) ),
'currentImgSrc' => $this -> get_current_image_src (),
),
'nonces' => array (
'add' => wp_create_nonce ( 'header-add' ),
'remove' => wp_create_nonce ( 'header-remove' ),
),
'uploads' => $this -> uploaded_headers ,
'defaults' => $this -> default_headers
) );
parent :: enqueue ();
}
2012-08-01 02:45:54 -04:00
public function prepare_control () {
global $custom_image_header ;
2014-03-11 00:13:16 -04:00
if ( empty ( $custom_image_header ) ) {
return ;
}
2012-08-01 02:45:54 -04:00
// Process default headers and uploaded headers.
$custom_image_header -> process_default_headers ();
2014-03-29 06:53:15 -04:00
$this -> default_headers = $custom_image_header -> get_default_header_images ();
$this -> uploaded_headers = $custom_image_header -> get_uploaded_header_images ();
2014-03-11 00:13:16 -04:00
}
2012-08-01 02:45:54 -04:00
2014-03-11 00:13:16 -04:00
function print_header_image_template () {
?>
< script type = " text/template " id = " tmpl-header-choice " >
< # if (data.random) { #>
2014-04-06 15:28:16 -04:00
< button type = " button " class = " button display-options random " >
< span class = " dashicons dashicons-randomize dice " ></ span >
< # if ( data.type === 'uploaded' ) { #>
< ? php _e ( 'Randomize uploaded headers' ); ?>
< # } else if ( data.type === 'default' ) { #>
< ? php _e ( 'Randomize suggested headers' ); ?>
< # } #>
2014-04-04 11:49:15 -04:00
</ button >
2012-08-01 02:45:54 -04:00
2014-03-11 00:13:16 -04:00
< # } else { #>
< # if (data.type === 'uploaded') { #>
2014-04-04 11:49:15 -04:00
< div class = " dashicons dashicons-no close " ></ div >
2014-03-11 00:13:16 -04:00
< # } #>
2014-04-04 11:49:15 -04:00
< button type = " button " class = " choice thumbnail "
2014-03-11 00:13:16 -04:00
data - customize - image - value = " { { { data.header.url}}} "
data - customize - header - image - data = " { { JSON.stringify(data.header)}} " >
2014-04-04 11:49:15 -04:00
< span class = " screen-reader-text " >< ? php _e ( 'Set image' ); ?> </span>
< img src = " { { { data.header.thumbnail_url}}} " alt = " { { { data.header.alt_text || data.header.description}}} " >
</ button >
2014-03-11 00:13:16 -04:00
< # } #>
</ script >
< script type = " text/template " id = " tmpl-header-current " >
< # if (data.choice) { #>
< # if (data.random) { #>
2014-04-06 15:36:15 -04:00
< div class = " placeholder " >
2014-03-11 00:13:16 -04:00
< div class = " inner " >
2014-03-25 15:51:15 -04:00
< span >< span class = " dashicons dashicons-randomize dice " ></ span >
2014-03-11 00:13:16 -04:00
< # if ( data.type === 'uploaded' ) { #>
< ? php _e ( 'Randomizing uploaded headers' ); ?>
2014-03-24 15:16:14 -04:00
< # } else if ( data.type === 'default' ) { #>
2014-03-11 00:13:16 -04:00
< ? php _e ( 'Randomizing suggested headers' ); ?>
< # } #>
</ span >
</ div >
</ div >
2012-08-01 02:45:54 -04:00
2014-03-11 00:13:16 -04:00
< # } else { #>
2012-04-19 22:39:55 -04:00
2014-04-04 11:49:15 -04:00
< img src = " { { { data.header.thumbnail_url}}} " alt = " { { { data.header.alt_text || data.header.description}}} " tabindex = " 0 " />
2012-06-09 20:32:19 -04:00
2014-03-11 00:13:16 -04:00
< # } #>
< # } else { #>
2012-06-09 20:32:19 -04:00
2014-04-06 15:36:15 -04:00
< div class = " placeholder " >
2014-03-11 00:13:16 -04:00
< div class = " inner " >
< span >
< ? php _e ( 'No image set' ); ?>
</ span >
</ div >
</ div >
2012-06-09 20:32:19 -04:00
2014-03-11 00:13:16 -04:00
< # } #>
</ script >
2012-06-09 20:32:19 -04:00
< ? php
}
2012-07-31 22:30:02 -04:00
2014-03-11 00:13:16 -04:00
public function get_current_image_src () {
$src = $this -> value ();
if ( isset ( $this -> get_url ) ) {
$src = call_user_func ( $this -> get_url , $src );
return $src ;
}
return null ;
2012-04-19 22:39:55 -04:00
}
2014-03-11 00:13:16 -04:00
public function render_content () {
$this -> print_header_image_template ();
$visibility = $this -> get_current_image_src () ? '' : ' style="display:none" ' ;
$width = absint ( get_theme_support ( 'custom-header' , 'width' ) );
$height = absint ( get_theme_support ( 'custom-header' , 'height' ) );
?>
< div class = " customize-control-content " >
2014-04-06 15:36:15 -04:00
< p class = " customizer-section-intro " >
2014-03-11 00:13:16 -04:00
< ? php
if ( $width && $height ) {
2014-04-19 15:45:14 -04:00
printf ( __ ( 'While you can crop images to your liking after clicking <strong>Add new image</strong>, your theme recommends a header size of <strong>%s × %s</strong> pixels.' ), $width , $height );
2014-03-19 04:18:14 -04:00
} elseif ( $width ) {
2014-04-19 15:45:14 -04:00
printf ( __ ( 'While you can crop images to your liking after clicking <strong>Add new image</strong>, your theme recommends a header width of <strong>%s</strong> pixels.' ), $width );
2014-03-11 00:13:16 -04:00
} else {
2014-04-19 15:45:14 -04:00
printf ( __ ( 'While you can crop images to your liking after clicking <strong>Add new image</strong>, your theme recommends a header height of <strong>%s</strong> pixels.' ), $height );
2014-03-11 00:13:16 -04:00
}
?>
</ p >
< div class = " current " >
2014-04-06 15:36:15 -04:00
< span class = " customize-control-title " >
2014-03-11 00:13:16 -04:00
< ? php _e ( 'Current header' ); ?>
</ span >
< div class = " container " >
</ div >
</ div >
< div class = " actions " >
< ? php /* translators: Hide as in hide header image via the Customizer */ ?>
2014-04-04 11:49:15 -04:00
< button type = " button " < ? php echo $visibility ?> class="button remove"><?php _ex( 'Hide image', 'custom header' ); ?></button>
2014-03-11 00:13:16 -04:00
< ? php /* translators: New as in add new header image via the Customizer */ ?>
2014-04-04 11:49:15 -04:00
< button type = " button " class = " button new " >< ? php _ex ( 'Add new image' , 'header image' ); ?> </button>
2014-03-11 00:13:16 -04:00
< div style = " clear:both " ></ div >
</ div >
< div class = " choices " >
2014-04-06 15:36:15 -04:00
< span class = " customize-control-title header-previously-uploaded " >
2014-03-11 00:13:16 -04:00
< ? php _ex ( 'Previously uploaded' , 'custom headers' ); ?>
</ span >
< div class = " uploaded " >
< div class = " list " >
</ div >
</ div >
2014-04-06 15:36:15 -04:00
< span class = " customize-control-title header-default " >
2014-03-11 00:13:16 -04:00
< ? php _ex ( 'Suggested' , 'custom headers' ); ?>
</ span >
< div class = " default " >
< div class = " list " >
</ div >
</ div >
</ div >
</ div >
< ? php
2012-04-19 22:39:55 -04:00
}
2014-03-05 15:41:14 -05:00
}
/**
* Widget Area Customize Control Class
*
*/
class WP_Widget_Area_Customize_Control extends WP_Customize_Control {
public $type = 'sidebar_widgets' ;
public $sidebar_id ;
public function to_json () {
parent :: to_json ();
$exported_properties = array ( 'sidebar_id' );
foreach ( $exported_properties as $key ) {
$this -> json [ $key ] = $this -> $key ;
}
}
public function render_content () {
?>
< span class = " button-secondary add-new-widget " tabindex = " 0 " >
2014-04-07 05:04:14 -04:00
< ? php _e ( 'Add a Widget' ); ?>
2014-03-05 15:41:14 -05:00
</ span >
< span class = " reorder-toggle " tabindex = " 0 " >
2014-04-07 05:04:14 -04:00
< span class = " reorder " >< ? php _ex ( 'Reorder' , 'Reorder widgets in Customizer' ); ?> </span>
< span class = " reorder-done " >< ? php _ex ( 'Done' , 'Cancel reordering widgets in Customizer' ); ?> </span>
2014-03-05 15:41:14 -05:00
</ span >
< ? php
}
2014-07-09 19:58:16 -04:00
/**
2014-07-13 20:32:16 -04:00
* Whether the current sidebar is rendered on the page .
*
* @ since 4.0 . 0
* @ access public
*
* @ return bool Whether sidebar is rendered .
2014-07-09 19:58:16 -04:00
*/
2014-07-13 20:32:16 -04:00
public function active_callback () {
2014-07-09 19:58:16 -04:00
return $this -> manager -> widgets -> is_sidebar_rendered ( $this -> sidebar_id );
}
2014-03-05 15:41:14 -05:00
}
/**
* Widget Form Customize Control Class
*/
class WP_Widget_Form_Customize_Control extends WP_Customize_Control {
public $type = 'widget_form' ;
public $widget_id ;
public $widget_id_base ;
public $sidebar_id ;
public $is_new = false ;
public $width ;
public $height ;
public $is_wide = false ;
public function to_json () {
parent :: to_json ();
2014-04-07 05:04:14 -04:00
$exported_properties = array ( 'widget_id' , 'widget_id_base' , 'sidebar_id' , 'width' , 'height' , 'is_wide' );
2014-03-05 15:41:14 -05:00
foreach ( $exported_properties as $key ) {
$this -> json [ $key ] = $this -> $key ;
}
}
public function render_content () {
global $wp_registered_widgets ;
require_once ABSPATH . '/wp-admin/includes/widgets.php' ;
$widget = $wp_registered_widgets [ $this -> widget_id ];
if ( ! isset ( $widget [ 'params' ][ 0 ] ) ) {
$widget [ 'params' ][ 0 ] = array ();
}
$args = array (
'widget_id' => $widget [ 'id' ],
'widget_name' => $widget [ 'name' ],
);
$args = wp_list_widget_controls_dynamic_sidebar ( array ( 0 => $args , 1 => $widget [ 'params' ][ 0 ] ) );
2014-03-28 10:07:14 -04:00
echo $this -> manager -> widgets -> get_widget_control ( $args );
2014-03-05 15:41:14 -05:00
}
2014-07-09 19:58:16 -04:00
/**
2014-07-13 20:32:16 -04:00
* Whether the current widget is rendered on the page .
*
* @ since 4.0 . 0
* @ access public
*
* @ return bool Whether the widget is rendered .
2014-07-09 19:58:16 -04:00
*/
function active_callback () {
return $this -> manager -> widgets -> is_widget_rendered ( $this -> widget_id );
}
2014-03-05 15:41:14 -05:00
}