2012-03-28 00:14:09 -04:00
< ? php
/**
2015-02-25 02:56:25 -05:00
* WordPress Customize Control classes
2012-03-28 00:14:09 -04:00
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2015-02-25 02:56:25 -05:00
/**
* Customize Control class .
*
* @ since 3.4 . 0
*/
2012-03-28 00:14:09 -04:00
class WP_Customize_Control {
2014-11-03 16:35:23 -05:00
/**
* Incremented with each new class instantiation , then stored in $instance_number .
*
* Used when sorting two instances whose priorities are equal .
*
* @ since 4.1 . 0
* @ access protected
* @ var int
*/
protected static $instance_count = 0 ;
/**
* Order in which this instance was created in relation to other instances .
*
* @ since 4.1 . 0
* @ access public
* @ var int
*/
public $instance_number ;
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
/**
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
* @ deprecated It is better to just call the json () method
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' );
}
2014-11-03 16:35:23 -05:00
self :: $instance_count += 1 ;
$this -> instance_number = self :: $instance_count ;
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
*/
2015-01-08 01:02:24 -05:00
final public function active () {
2014-07-09 19:58:16 -04:00
$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
*/
2015-01-08 01:02:24 -05:00
final public 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
}
2014-11-03 16:35:23 -05:00
$this -> json [ 'type' ] = $this -> type ;
$this -> json [ 'priority' ] = $this -> priority ;
$this -> json [ 'active' ] = $this -> active ();
$this -> json [ 'section' ] = $this -> section ;
$this -> json [ 'content' ] = $this -> get_content ();
$this -> json [ 'label' ] = $this -> label ;
2014-10-24 12:32:18 -04:00
$this -> json [ 'description' ] = $this -> description ;
2014-11-03 16:35:23 -05:00
$this -> json [ 'instanceNumber' ] = $this -> instance_number ;
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
}
/**
* Get the data to export to the client via JSON .
*
* @ since 4.1 . 0
*
2014-11-28 04:20:23 -05:00
* @ return array Array of parameters passed to the JavaScript .
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
*/
public function json () {
$this -> to_json ();
return $this -> json ;
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 .
*/
2015-01-08 01:02:24 -05:00
final public function check_capabilities () {
2012-03-28 00:14:09 -04:00
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 ;
}
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
/**
* Get the control ' s content for insertion into the Customizer pane .
*
* @ since 4.1 . 0
*
2014-11-28 04:20:23 -05:00
* @ return string Contents of the control .
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
*/
2015-01-08 01:02:24 -05:00
final public function get_content () {
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
ob_start ();
$this -> maybe_render ();
$template = trim ( ob_get_contents () );
ob_end_clean ();
return $template ;
}
2012-03-28 00:14:09 -04:00
/**
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
*/
2015-01-08 01:02:24 -05:00
final public function maybe_render () {
2012-03-28 00:14:09 -04:00
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 .
*
2014-11-30 07:10:23 -05:00
* The dynamic portion of the hook name , `$this->id` , refers to
2014-03-06 08:51:14 -05:00
* the control ID .
*
* @ since 3.4 . 0
*
2014-11-30 07:10:23 -05:00
* @ param WP_Customize_Control $this { @ see WP_Customize_Control } instance .
2014-03-06 08:51:14 -05:00
*/
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
*
2014-10-24 12:32:18 -04:00
* Control content can alternately be rendered in JS . See { @ see WP_Customize_Control :: print_template ()} .
*
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
}
}
2014-10-24 12:32:18 -04:00
/**
* Render the control ' s JS template .
*
2014-11-28 04:20:23 -05:00
* This function is only run for control types that have been registered with
* { @ see WP_Customize_Manager :: register_control_type ()} .
2014-10-24 12:32:18 -04:00
*
2014-11-28 04:20:23 -05:00
* In the future , this will also print the template for the control ' s container
* element and be override - able .
2014-10-24 12:32:18 -04:00
*
* @ since 4.1 . 0
*/
final public function print_template () {
2015-03-10 14:02:28 -04:00
?>
< script type = " text/html " id = " tmpl-customize-control-<?php echo $this->type ; ?>-content " >
< ? php $this -> content_template (); ?>
</ script >
< ? php
2014-10-24 12:32:18 -04:00
}
/**
* An Underscore ( JS ) template for this control ' s content ( but not its container ) .
*
* Class variables for this control class are available in the `data` JS object ;
* export custom variables by overriding { @ see WP_Customize_Control :: to_json ()} .
*
* @ see WP_Customize_Control :: print_template ()
*
* @ since 4.1 . 0
*/
protected function content_template () {}
2012-03-29 02:35:54 -04:00
}
2012-07-26 17:45:33 -04:00
/**
2015-02-25 02:56:25 -05:00
* Customize Color Control class .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Control
2012-07-26 17:45:33 -04:00
*/
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 ;
2014-10-24 12:32:18 -04:00
$this -> json [ 'defaultValue' ] = $this -> setting -> default ;
2012-04-25 17:03:29 -04:00
}
2012-07-26 17:45:33 -04:00
/**
2014-10-24 12:32:18 -04:00
* Don 't render the control content from PHP, as it' s rendered via JS on load .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
*/
2014-10-24 12:32:18 -04:00
public function render_content () {}
/**
* Render a JS template for the content of the color picker control .
*
* @ since 4.1 . 0
*/
public function content_template () {
2012-04-25 17:03:29 -04:00
?>
2014-10-24 12:32:18 -04:00
< # var defaultValue = '';
if ( data . defaultValue ) {
if ( '#' !== data . defaultValue . substring ( 0 , 1 ) ) {
defaultValue = '#' + data . defaultValue ;
2014-10-28 22:43:22 -04:00
} else {
defaultValue = data . defaultValue ;
2014-10-24 12:32:18 -04:00
}
defaultValue = ' data-default-color=' + defaultValue ; // Quotes added automatically.
} #>
2012-04-25 17:03:29 -04:00
< label >
2014-10-24 12:32:18 -04:00
< # if ( data.label ) { #>
2014-11-13 06:44:23 -05:00
< span class = " customize-control-title " > {{{ data . label }}} </ span >
2014-10-24 12:32:18 -04:00
< # } #>
< # if ( data.description ) { #>
2014-11-13 06:44:23 -05:00
< span class = " description customize-control-description " > {{{ data . description }}} </ span >
2014-10-24 12:32:18 -04:00
< # } #>
2012-04-25 17:03:29 -04:00
< div class = " customize-control-content " >
2014-10-24 12:32:18 -04:00
< input class = " color-picker-hex " type = " text " maxlength = " 7 " placeholder = " <?php esc_attr_e( 'Hex Value' ); ?> " {{ defaultValue }} />
2012-04-25 17:03:29 -04:00
</ div >
</ label >
< ? php
}
}
2012-07-26 17:45:33 -04:00
/**
2015-03-10 14:02:28 -04:00
* Customize Media Control class .
2012-07-26 17:45:33 -04:00
*
2015-03-10 14:02:28 -04:00
* @ since 4.2 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Control
2012-07-26 17:45:33 -04:00
*/
2015-03-10 14:02:28 -04:00
class WP_Customize_Media_Control extends WP_Customize_Control {
public $type = 'media' ;
2014-11-11 18:52:22 -05:00
public $mime_type = '' ;
public $button_labels = array ();
/**
* Constructor .
*
* @ since 4.1 . 0
2015-03-10 14:02:28 -04:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
2014-11-11 18:52:22 -05:00
*
2014-11-28 04:20:23 -05:00
* @ param WP_Customize_Manager $manager { @ see WP_Customize_Manager } instance .
2014-11-11 18:52:22 -05:00
*/
public function __construct ( $manager , $id , $args = array () ) {
parent :: __construct ( $manager , $id , $args );
$this -> button_labels = array (
'select' => __ ( 'Select File' ),
'change' => __ ( 'Change File' ),
'default' => __ ( 'Default' ),
'remove' => __ ( 'Remove' ),
'placeholder' => __ ( 'No file selected' ),
'frame_title' => __ ( 'Select File' ),
'frame_button' => __ ( 'Choose File' ),
);
}
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
2015-03-10 14:02:28 -04:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
2012-07-26 17:45:33 -04:00
*/
2012-03-29 02:35:54 -04:00
public function enqueue () {
2014-11-11 18:52:22 -05:00
wp_enqueue_media ();
2012-03-29 02:35:54 -04:00
}
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
2015-03-10 14:02:28 -04:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
*
2012-07-26 17:45:33 -04:00
* @ uses WP_Customize_Control :: to_json ()
*/
2012-03-29 02:35:54 -04:00
public function to_json () {
parent :: to_json ();
2014-11-11 18:52:22 -05:00
$this -> json [ 'mime_type' ] = $this -> mime_type ;
$this -> json [ 'button_labels' ] = $this -> button_labels ;
2014-12-14 14:37:22 -05:00
$value = $this -> value ();
2014-11-11 18:52:22 -05:00
if ( is_object ( $this -> setting ) ) {
if ( $this -> setting -> default ) {
// Fake an attachment model - needs all fields used by template.
2015-03-10 14:02:28 -04:00
// Note that the default value must be a URL, NOT an attachment ID.
2014-11-11 18:52:22 -05:00
$type = in_array ( substr ( $this -> setting -> default , - 3 ), array ( 'jpg' , 'png' , 'gif' , 'bmp' ) ) ? 'image' : 'document' ;
$default_attachment = array (
'id' => 1 ,
'url' => $this -> setting -> default ,
'type' => $type ,
'icon' => wp_mime_type_icon ( $type ),
'title' => basename ( $this -> setting -> default ),
);
2014-12-14 14:37:22 -05:00
if ( 'image' === $type ) {
$default_attachment [ 'sizes' ] = array (
'full' => array ( 'url' => $this -> setting -> default ),
);
}
2014-11-11 18:52:22 -05:00
$this -> json [ 'defaultAttachment' ] = $default_attachment ;
}
2012-03-29 02:35:54 -04:00
2014-12-14 14:37:22 -05:00
if ( $value && $this -> setting -> default && $value === $this -> setting -> default ) {
// Set the default as the attachment.
$this -> json [ 'attachment' ] = $this -> json [ 'defaultAttachment' ];
} elseif ( $value ) {
2015-03-10 14:02:28 -04:00
$this -> json [ 'attachment' ] = wp_prepare_attachment_for_js ( $value );
2014-11-11 18:52:22 -05:00
}
}
2012-03-29 02:35:54 -04:00
}
2012-07-26 17:45:33 -04:00
/**
2014-11-11 18:52:22 -05:00
* Don ' t render any content for this control from PHP .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
2015-03-10 14:02:28 -04:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
*
* @ see WP_Customize_Media_Control :: content_template ()
2012-07-26 17:45:33 -04:00
*/
2014-11-11 18:52:22 -05:00
public function render_content () {}
/**
2015-03-10 14:02:28 -04:00
* Render a JS template for the content of the media control .
2014-11-11 18:52:22 -05:00
*
* @ since 4.1 . 0
2015-03-10 14:02:28 -04:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
2014-11-11 18:52:22 -05:00
*/
public function content_template () {
2012-03-29 02:35:54 -04:00
?>
2014-12-23 12:05:26 -05:00
< label for = " { { data.settings['default'] }}-button " >
2014-11-11 18:52:22 -05:00
< # if ( data.label ) { #>
< span class = " customize-control-title " > {{ data . label }} </ span >
< # } #>
< # if ( data.description ) { #>
2014-12-14 14:24:23 -05:00
< span class = " description customize-control-description " > {{{ data . description }}} </ span >
2014-11-11 18:52:22 -05:00
< # } #>
2012-03-29 02:35:54 -04:00
</ label >
2014-11-11 18:52:22 -05:00
2014-12-14 14:37:22 -05:00
< # if ( data.attachment && data.attachment.id ) { #>
2014-12-02 16:55:23 -05:00
< div class = " current " >
< div class = " container " >
2014-12-03 20:59:22 -05:00
< div class = " attachment-media-view attachment-media-view- { { data.attachment.type }} { { data.attachment.orientation }} " >
2014-12-02 16:55:23 -05:00
< div class = " thumbnail thumbnail- { { data.attachment.type }} " >
< # if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #>
< img class = " attachment-thumb " src = " { { data.attachment.sizes.medium.url }} " draggable = " false " />
< # } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #>
< img class = " attachment-thumb " src = " { { data.attachment.sizes.full.url }} " draggable = " false " />
2014-12-03 20:59:22 -05:00
< # } else if ( 'audio' === data.attachment.type ) { #>
2015-03-07 06:06:29 -05:00
< # if ( data.attachment.image && data.attachment.image.src && data.attachment.image.src !== data.attachment.icon ) { #>
< img src = " { { data.attachment.image.src }} " class = " thumbnail " draggable = " false " />
< # } else { #>
< img src = " { { data.attachment.icon }} " class = " attachment-thumb type-icon " draggable = " false " />
< # } #>
2014-12-03 20:59:22 -05:00
< p class = " attachment-meta attachment-meta-title " >& #8220;{{ data.attachment.title }}”</p>
< # if ( data.attachment.album || data.attachment.meta.album ) { #>
< p class = " attachment-meta " >< em > {{ data . attachment . album || data . attachment . meta . album }} </ em ></ p >
< # } #>
< # if ( data.attachment.artist || data.attachment.meta.artist ) { #>
< p class = " attachment-meta " > {{ data . attachment . artist || data . attachment . meta . artist }} </ p >
< # } #>
2015-03-07 06:06:29 -05:00
< audio style = " visibility: hidden " controls class = " wp-audio-shortcode " width = " 100% " preload = " none " >
< source type = " { { data.attachment.mime }} " src = " { { data.attachment.url }} " />
</ audio >
< # } else if ( 'video' === data.attachment.type ) { #>
< div class = " wp-media-wrapper wp-video " >
< video controls = " controls " class = " wp-video-shortcode " preload = " metadata "
< # if ( data.attachment.image && data.attachment.image.src !== data.attachment.icon ) { #>poster="{{ data.attachment.image.src }}"<# } #>>
< source type = " { { data.attachment.mime }} " src = " { { data.attachment.url }} " />
</ video >
</ div >
2014-12-02 16:55:23 -05:00
< # } else { #>
< img class = " attachment-thumb type-icon " src = " { { data.attachment.icon }} " class = " icon " draggable = " false " />
< p class = " attachment-title " > {{ data . attachment . title }} </ p >
< # } #>
2014-11-11 18:52:22 -05:00
</ div >
2014-12-02 16:55:23 -05:00
</ div >
2014-11-11 18:52:22 -05:00
</ div >
</ div >
2014-12-02 16:55:23 -05:00
< div class = " actions " >
2014-12-14 14:37:22 -05:00
< button type = " button " class = " button remove-button " >< ? php echo $this -> button_labels [ 'remove' ]; ?> </button>
2014-12-23 12:05:26 -05:00
< button type = " button " class = " button upload-button " id = " { { data.settings['default'] }}-button " >< ? php echo $this -> button_labels [ 'change' ]; ?> </button>
2014-12-02 16:55:23 -05:00
< div style = " clear:both " ></ div >
</ div >
2014-11-11 18:52:22 -05:00
< # } else { #>
2014-12-02 16:55:23 -05:00
< div class = " current " >
< div class = " container " >
< div class = " placeholder " >
< div class = " inner " >
< span >
< ? php echo $this -> button_labels [ 'placeholder' ]; ?>
</ span >
</ div >
</ div >
</ div >
</ div >
< div class = " actions " >
< # if ( data.defaultAttachment ) { #>
2014-12-14 14:37:22 -05:00
< button type = " button " class = " button default-button " >< ? php echo $this -> button_labels [ 'default' ]; ?> </button>
2014-12-02 16:55:23 -05:00
< # } #>
2014-12-23 12:05:26 -05:00
< button type = " button " class = " button upload-button " id = " { { data.settings['default'] }}-button " >< ? php echo $this -> button_labels [ 'select' ]; ?> </button>
2014-12-02 16:55:23 -05:00
< div style = " clear:both " ></ div >
</ div >
2014-11-11 18:52:22 -05:00
< # } #>
2012-03-29 02:35:54 -04:00
< ? php
}
}
2015-03-10 14:02:28 -04:00
/**
* Customize Upload Control Class .
*
* @ since 3.4 . 0
*
* @ see WP_Customize_Media_Control
*/
class WP_Customize_Upload_Control extends WP_Customize_Media_Control {
public $type = 'upload' ;
public $mime_type = '' ;
public $button_labels = array ();
public $removed = '' ; // unused
public $context ; // unused
public $extensions = array (); // unused
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
*
* @ uses WP_Customize_Media_Control :: to_json ()
*/
public function to_json () {
parent :: to_json ();
$value = $this -> value ();
if ( $value ) {
// Get the attachment model for the existing file.
$attachment_id = attachment_url_to_postid ( $value );
if ( $attachment_id ) {
$this -> json [ 'attachment' ] = wp_prepare_attachment_for_js ( $attachment_id );
}
}
}
}
2012-07-26 17:45:33 -04:00
/**
2015-02-25 02:56:25 -05:00
* Customize Image Control class .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Upload_Control
2012-07-26 17:45:33 -04:00
*/
2012-03-29 02:35:54 -04:00
class WP_Customize_Image_Control extends WP_Customize_Upload_Control {
public $type = 'image' ;
2014-11-11 18:52:22 -05:00
public $mime_type = 'image' ;
2012-04-19 22:39:55 -04:00
2012-07-26 17:45:33 -04:00
/**
* Constructor .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Upload_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager
2014-11-30 18:33:23 -05:00
* @ param string $id
* @ param array $args
2012-07-26 17:45:33 -04:00
*/
2014-11-11 18:52:22 -05:00
public function __construct ( $manager , $id , $args = array () ) {
2012-04-19 22:39:55 -04:00
parent :: __construct ( $manager , $id , $args );
2014-11-11 18:52:22 -05:00
$this -> button_labels = array (
'select' => __ ( 'Select Image' ),
'change' => __ ( 'Change Image' ),
'remove' => __ ( 'Remove' ),
'default' => __ ( 'Default' ),
'placeholder' => __ ( 'No image selected' ),
'frame_title' => __ ( 'Select Image' ),
'frame_button' => __ ( 'Choose Image' ),
);
2012-08-01 02:45:54 -04:00
}
/**
2012-08-01 03:20:44 -04:00
* @ since 3.4 . 2
2014-11-11 18:52:22 -05:00
* @ deprecated 4.1 . 0
2012-08-01 02:45:54 -04:00
*/
2014-11-11 18:52:22 -05:00
public function prepare_control () {}
2012-04-19 22:39:55 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
2014-11-11 18:52:22 -05:00
* @ deprecated 4.1 . 0
2012-07-26 17:45:33 -04:00
*
* @ param string $id
* @ param string $label
* @ param mixed $callback
*/
2014-11-11 18:52:22 -05:00
public function add_tab ( $id , $label , $callback ) {}
2012-04-19 22:39:55 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
2014-11-11 18:52:22 -05:00
* @ deprecated 4.1 . 0
2012-07-26 17:45:33 -04:00
*
* @ param string $id
*/
2014-11-11 18:52:22 -05:00
public function remove_tab ( $id ) {}
2012-05-25 16:26:25 -04:00
2012-07-26 17:45:33 -04:00
/**
* @ since 3.4 . 0
2014-11-11 18:52:22 -05:00
* @ deprecated 4.1 . 0
2012-07-26 17:45:33 -04:00
*
* @ param string $url
* @ param string $thumbnail_url
*/
2014-11-11 18:52:22 -05:00
public function print_tab_image ( $url , $thumbnail_url = null ) {}
2012-05-25 16:26:25 -04:00
}
2012-07-26 17:45:33 -04:00
/**
2015-02-25 02:56:25 -05:00
* Customize Background Image Control class .
2012-07-26 17:45:33 -04:00
*
* @ since 3.4 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Image_Control
2012-07-26 17:45:33 -04:00
*/
2012-05-25 16:26:25 -04:00
class WP_Customize_Background_Image_Control extends WP_Customize_Image_Control {
2014-12-15 18:28:23 -05:00
public $type = 'background' ;
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' ,
) );
}
2014-12-15 18:28:23 -05:00
/**
* Enqueue control related scripts / styles .
*
* @ since 4.1 . 0
*/
public function enqueue () {
parent :: enqueue ();
wp_localize_script ( 'customize-controls' , '_wpCustomizeBackground' , array (
'nonces' => array (
'add' => wp_create_nonce ( 'background-add' ),
),
) );
}
2012-04-04 13:32:03 -04:00
}
2012-04-19 22:39:55 -04:00
2015-02-25 02:56:25 -05:00
/**
* Customize Header Image Control class .
*
* @ since 3.4 . 0
*
* @ see WP_Customize_Image_Control
*/
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' ;
2014-11-01 19:18:23 -04:00
public $uploaded_headers ;
public $default_headers ;
2012-07-26 17:45:33 -04:00
2014-11-30 18:33:23 -05:00
/**
* @ param WP_Customize_Manager $manager
*/
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
'removed' => 'remove-header' ,
'get_url' => 'get_header_image' ,
2014-03-11 00:13:16 -04:00
) );
}
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
2015-01-08 01:02:24 -05:00
public function print_header_image_template () {
2014-03-11 00:13:16 -04:00
?>
< 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
}
2015-02-24 15:31:24 -05:00
/**
2015-02-25 02:56:25 -05:00
* Customize Theme Control class .
2015-02-24 15:31:24 -05:00
*
* @ since 4.2 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Control
2015-02-24 15:31:24 -05:00
*/
class WP_Customize_Theme_Control extends WP_Customize_Control {
public $type = 'theme' ;
public $theme ;
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 4.2 . 0
* @ uses WP_Customize_Control :: to_json ()
*/
public function to_json () {
parent :: to_json ();
$this -> json [ 'theme' ] = $this -> theme ;
}
/**
* Don 't render the control content from PHP, as it' s rendered via JS on load .
*
* @ since 4.2 . 0
*/
public function render_content () {}
/**
* Render a JS template for theme display .
*
* @ since 4.2 . 0
*/
public function content_template () {
2015-04-01 08:36:26 -04:00
$preview_url = site_url ( add_query_arg ( 'theme' , '{{ data.theme.id }}' ) );
?>
< div class = " theme<# if ( data.theme.active ) { #> active<# } #> " < # if ( ! data.theme.active ) { #> tabindex="0"<# } #> data-preview-url="<?php echo esc_attr( $preview_url ); ?>" aria-describedby="{{ data.theme.id }}-action {{ data.theme.id }}-name">
2015-02-24 15:31:24 -05:00
< # if ( data.theme.screenshot[0] ) { #>
< div class = " theme-screenshot " >
< img src = " { { data.theme.screenshot[0] }} " alt = " " />
</ div >
< # } else { #>
< div class = " theme-screenshot blank " ></ div >
< # } #>
2015-04-01 08:36:26 -04:00
< span class = " more-details " id = " { { data.theme.id }}-action " >< ? php _e ( 'Live Preview' ); ?> </span>
2015-02-24 15:31:24 -05:00
< div class = " theme-author " >< ? php printf ( __ ( 'By %s' ), '{{ data.theme.author }}' ); ?> </div>
< # if ( data.theme.active ) { #>
2015-03-26 16:56:26 -04:00
< h3 class = " theme-name " id = " { { data.theme.id }}-name " >
< ? php
/* translators: %s: theme name */
printf ( __ ( '<span>Previewing:</span> %s' ), '{{ data.theme.name }}' );
?>
</ h3 >
2015-02-24 15:31:24 -05:00
< # } else { #>
< h3 class = " theme-name " id = " { { data.theme.id }}-name " > {{ data . theme . name }} </ h3 >
< # } #>
< # if ( ! data.theme.active ) { #>
< div class = " theme-actions " >
2015-04-01 08:36:26 -04:00
< button type = " button " class = " button theme-details " >< ? php _e ( 'Theme Details' ); ?> </button>
2015-02-24 15:31:24 -05:00
</ div >
< # } #>
</ div >
< ? php
}
}
2014-03-05 15:41:14 -05:00
/**
2015-02-25 02:56:25 -05:00
* Widget Area Customize Control class .
2014-03-05 15:41:14 -05:00
*
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
* @ since 3.9 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Control
2014-03-05 15:41:14 -05:00
*/
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>
2015-03-26 16:56:26 -04:00
< 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-03-05 15:41:14 -05:00
}
/**
2015-02-25 02:56:25 -05:00
* Widget Form Customize Control class .
Improve/introduce Customizer JavaScript models for Controls, Sections, and Panels.
* Introduce models for panels and sections.
* Introduce API to expand and focus a control, section or panel.
* Allow deep-linking to panels, sections, and controls inside of the Customizer.
* Clean up `accordion.js`, removing all Customizer-specific logic.
* Add initial unit tests for `wp.customize.Class` in `customize-base.js`.
https://make.wordpress.org/core/2014/10/27/toward-a-complete-javascript-api-for-the-customizer/ provides an overview of how to use the JavaScript API.
props westonruter, celloexpressions, ryankienstra.
see #28032, #28579, #28580, #28650, #28709, #29758.
fixes #29529.
Built from https://develop.svn.wordpress.org/trunk@30102
git-svn-id: http://core.svn.wordpress.org/trunk@30102 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-29 18:51:22 -04:00
*
* @ since 3.9 . 0
2015-02-25 02:56:25 -05:00
*
* @ see WP_Customize_Control
2014-03-05 15:41:14 -05:00
*/
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
*/
2015-01-08 01:02:24 -05:00
public function active_callback () {
2014-07-09 19:58:16 -04:00
return $this -> manager -> widgets -> is_widget_rendered ( $this -> widget_id );
}
2014-03-05 15:41:14 -05:00
}