2012-03-28 06:14:09 +02:00
< ? php
/**
2015-02-25 08:56:25 +01:00
* WordPress Customize Control classes
2012-03-28 06:14:09 +02:00
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2015-02-25 08:56:25 +01:00
/**
* Customize Control class .
*
* @ since 3.4 . 0
*/
2012-03-28 06:14:09 +02:00
class WP_Customize_Control {
2014-11-03 22:35:23 +01: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
2015-05-29 17:43:29 +02:00
*
* @ static
2014-11-03 22:35:23 +01:00
* @ 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 23:45:33 +02:00
/**
* @ access public
* @ var WP_Customize_Manager
*/
2012-03-28 06:14:09 +02:00
public $manager ;
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var string
*/
2012-03-28 06:14:09 +02:00
public $id ;
2012-07-26 23:45:33 +02:00
/**
* All settings tied to the control .
*
* @ access public
* @ var array
*/
2012-03-28 06:14:09 +02:00
public $settings ;
2012-06-10 02:32:19 +02:00
2012-07-26 23:45:33 +02:00
/**
* The primary setting for the control ( if there is one ) .
*
* @ access public
* @ var string
*/
2012-06-10 02:32:19 +02:00
public $setting = 'default' ;
2012-03-28 06:14:09 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var int
*/
2014-03-04 21:21:14 +01:00
public $priority = 10 ;
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var string
*/
2014-03-04 21:21:14 +01:00
public $section = '' ;
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var string
*/
2014-03-04 21:21:14 +01:00
public $label = '' ;
2012-08-01 04:30:02 +02:00
2014-06-30 17:55:17 +02:00
/**
* @ access public
* @ var string
*/
public $description = '' ;
2012-07-26 23:45:33 +02:00
/**
* @ todo : Remove choices
*
* @ access public
* @ var array
*/
2014-03-04 21:21:14 +01:00
public $choices = array ();
2012-03-28 06:14:09 +02:00
2014-06-30 21:48:13 +02:00
/**
* @ access public
* @ var array
*/
public $input_attrs = array ();
2012-07-26 23:45:33 +02: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 23:51:22 +01:00
* @ deprecated It is better to just call the json () method
2012-07-26 23:45:33 +02:00
* @ access public
* @ var array
*/
2012-03-29 08:35:54 +02:00
public $json = array ();
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var string
*/
2012-03-28 06:14:09 +02:00
public $type = 'text' ;
2014-07-10 01:58:16 +02:00
/**
2014-07-14 02:32:16 +02:00
* Callback .
2014-07-10 01:58:16 +02:00
*
* @ since 4.0 . 0
* @ access public
2014-07-14 02:32:16 +02:00
*
2014-07-10 01:58:16 +02:00
* @ see WP_Customize_Control :: active ()
2014-07-14 02:32:16 +02: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-10 01:58:16 +02:00
*/
public $active_callback = '' ;
2012-03-28 06:14:09 +02:00
/**
* Constructor .
*
2014-03-04 21:21:14 +01:00
* Supplied $args override class property defaults .
*
2012-03-28 06:14:09 +02:00
* If $args [ 'settings' ] is not defined , use the $id as the setting ID .
*
* @ since 3.4 . 0
2012-07-26 23:45:33 +02:00
*
* @ param WP_Customize_Manager $manager
* @ param string $id
* @ param array $args
2012-03-28 06:14:09 +02:00
*/
2014-05-19 07:45:16 +02:00
public function __construct ( $manager , $id , $args = array () ) {
2012-03-29 08:35:54 +02:00
$keys = array_keys ( get_object_vars ( $this ) );
2012-03-28 06:14:09 +02:00
foreach ( $keys as $key ) {
2014-07-10 01:58:16 +02:00
if ( isset ( $args [ $key ] ) ) {
2012-03-28 06:14:09 +02:00
$this -> $key = $args [ $key ];
2014-07-10 01:58:16 +02:00
}
2012-03-28 06:14:09 +02:00
}
$this -> manager = $manager ;
$this -> id = $id ;
2014-07-10 01:58:16 +02:00
if ( empty ( $this -> active_callback ) ) {
$this -> active_callback = array ( $this , 'active_callback' );
}
2014-11-03 22:35:23 +01:00
self :: $instance_count += 1 ;
$this -> instance_number = self :: $instance_count ;
2012-03-28 06:14:09 +02:00
// Process settings.
2014-07-10 01:58:16 +02:00
if ( empty ( $this -> settings ) ) {
2012-03-28 06:14:09 +02:00
$this -> settings = $id ;
2014-07-10 01:58:16 +02:00
}
2012-03-28 06:14:09 +02: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 23:03:29 +02:00
public function enqueue () {}
2012-03-28 06:14:09 +02:00
2014-07-10 01:58:16 +02:00
/**
2014-10-15 19:21:19 +02:00
* Check whether control is active to current Customizer preview .
2014-07-10 01:58:16 +02:00
*
* @ since 4.0 . 0
2014-07-14 02:32:16 +02:00
* @ access public
2014-07-10 01:58:16 +02:00
*
2014-07-14 02:32:16 +02:00
* @ return bool Whether the control is active to the current preview .
2014-07-10 01:58:16 +02:00
*/
2015-01-08 07:02:24 +01:00
final public function active () {
2014-07-10 01:58:16 +02:00
$control = $this ;
$active = call_user_func ( $this -> active_callback , $this );
/**
* Filter response of WP_Customize_Control :: active () .
*
* @ since 4.0 . 0
*
2014-07-14 02:32:16 +02:00
* @ param bool $active Whether the Customizer control is active .
* @ param WP_Customize_Control $control WP_Customize_Control instance .
2014-07-10 01:58:16 +02: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-14 02:32:16 +02:00
* @ since 4.0 . 0
* @ access public
*
2015-05-22 00:05:24 +02:00
* @ return true Always true .
2014-07-10 01:58:16 +02:00
*/
public function active_callback () {
return true ;
}
2012-03-28 06:14:09 +02:00
/**
* Fetch a setting ' s value .
* Grabs the main setting by default .
*
* @ since 3.4 . 0
2012-07-26 23:45:33 +02:00
*
* @ param string $setting_key
* @ return mixed The requested setting ' s value , if the setting exists .
2012-03-28 06:14:09 +02:00
*/
2015-01-08 07:02:24 +01:00
final public function value ( $setting_key = 'default' ) {
2014-07-10 01:58:16 +02:00
if ( isset ( $this -> settings [ $setting_key ] ) ) {
2012-03-28 06:14:09 +02:00
return $this -> settings [ $setting_key ] -> value ();
2014-07-10 01:58:16 +02:00
}
2012-03-28 06:14:09 +02:00
}
2012-03-29 08:35:54 +02: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 06:14:09 +02:00
foreach ( $this -> settings as $key => $setting ) {
2012-03-29 08:35:54 +02:00
$this -> json [ 'settings' ][ $key ] = $setting -> id ;
2012-03-28 06:14:09 +02:00
}
2014-11-03 22:35:23 +01: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 18:32:18 +02:00
$this -> json [ 'description' ] = $this -> description ;
2014-11-03 22:35:23 +01: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 23:51:22 +01:00
}
/**
* Get the data to export to the client via JSON .
*
* @ since 4.1 . 0
*
2014-11-28 10:20:23 +01: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 23:51:22 +01:00
*/
public function json () {
$this -> to_json ();
return $this -> json ;
2012-03-28 06:14:09 +02: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 07:02:24 +01:00
final public function check_capabilities () {
2012-03-28 06:14:09 +02: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 23:51:22 +01:00
/**
* Get the control ' s content for insertion into the Customizer pane .
*
* @ since 4.1 . 0
*
2014-11-28 10:20:23 +01: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 23:51:22 +01:00
*/
2015-01-08 07:02:24 +01: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 23:51:22 +01:00
ob_start ();
$this -> maybe_render ();
2015-06-27 03:12:24 +02:00
return trim ( ob_get_clean () );
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 23:51:22 +01:00
}
2012-03-28 06:14:09 +02:00
/**
2012-04-04 19:32:03 +02:00
* Check capabilities and render the control .
2012-03-28 06:14:09 +02:00
*
* @ since 3.4 . 0
2012-07-26 23:45:33 +02:00
* @ uses WP_Customize_Control :: render ()
2012-03-28 06:14:09 +02:00
*/
2015-01-08 07:02:24 +01:00
final public function maybe_render () {
2012-03-28 06:14:09 +02:00
if ( ! $this -> check_capabilities () )
return ;
2014-03-06 14:51:14 +01: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 06:14:09 +02:00
do_action ( 'customize_render_control' , $this );
2014-03-06 14:51:14 +01:00
/**
* Fires just before a specific Customizer control is rendered .
*
2014-11-30 13:10:23 +01:00
* The dynamic portion of the hook name , `$this->id` , refers to
2014-03-06 14:51:14 +01:00
* the control ID .
*
* @ since 3.4 . 0
*
2014-11-30 13:10:23 +01:00
* @ param WP_Customize_Control $this { @ see WP_Customize_Control } instance .
2014-03-06 14:51:14 +01:00
*/
2012-03-28 06:14:09 +02:00
do_action ( 'customize_render_control_' . $this -> id , $this );
$this -> render ();
}
/**
2014-03-04 21:21:14 +01:00
* Renders the control wrapper and calls $this -> render_content () for the internals .
2012-03-28 06:14:09 +02:00
*
* @ since 3.4 . 0
*/
protected function render () {
2012-03-28 11:10:29 +02:00
$id = 'customize-control-' . str_replace ( '[' , '-' , str_replace ( ']' , '' , $this -> id ) );
2012-03-28 06:14:09 +02:00
$class = 'customize-control customize-control-' . $this -> type ;
2012-04-18 19:13:31 +02:00
?> <li id="<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $class ); ?>">
2012-03-28 06:14:09 +02:00
< ? php $this -> render_content (); ?>
</ li >< ? php
}
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
2014-03-04 21:21:14 +01:00
* Get the data link attribute for a setting .
2012-07-26 23:45:33 +02: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 11:45:51 +02:00
public function get_link ( $setting_key = 'default' ) {
2012-03-28 06:14:09 +02:00
if ( ! isset ( $this -> settings [ $setting_key ] ) )
2012-03-28 11:45:51 +02:00
return '' ;
2012-03-28 06:14:09 +02:00
2012-03-28 11:45:51 +02:00
return 'data-customize-setting-link="' . esc_attr ( $this -> settings [ $setting_key ] -> id ) . '"' ;
}
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
2014-03-04 21:21:14 +01:00
* Render the data link attribute for the control ' s input element .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
* @ uses WP_Customize_Control :: get_link ()
*
* @ param string $setting_key
*/
2012-03-28 11:45:51 +02:00
public function link ( $setting_key = 'default' ) {
echo $this -> get_link ( $setting_key );
2012-03-28 06:14:09 +02:00
}
2014-07-10 01:58:16 +02:00
/**
2014-06-30 21:48:13 +02:00
* Render the custom attributes for the control ' s input element .
*
* @ since 4.0 . 0
2014-07-14 02:32:16 +02:00
* @ access public
2014-06-30 21:48:13 +02:00
*/
public function input_attrs () {
foreach ( $this -> input_attrs as $attr => $value ) {
echo $attr . '="' . esc_attr ( $value ) . '" ' ;
}
}
2012-03-28 06:14:09 +02:00
/**
* Render the control ' s content .
*
2014-03-04 21:21:14 +01:00
* Allows the content to be overriden without having to rewrite the wrapper in $this -> render () .
*
2014-06-30 21:48:13 +02: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 06:14:09 +02:00
*
2014-10-24 18:32:18 +02:00
* Control content can alternately be rendered in JS . See { @ see WP_Customize_Control :: print_template ()} .
*
2012-03-28 06:14:09 +02:00
* @ since 3.4 . 0
*/
protected function render_content () {
switch ( $this -> type ) {
case 'checkbox' :
?>
< label >
2012-04-25 23:03:29 +02:00
< input type = " checkbox " value = " <?php echo esc_attr( $this->value () ); ?> " < ? php $this -> link (); checked ( $this -> value () ); ?> />
2012-05-12 02:48:20 +02:00
< ? php echo esc_html ( $this -> label ); ?>
2014-06-30 17:55:17 +02:00
< ? php if ( ! empty ( $this -> description ) ) : ?>
2014-07-03 22:11:15 +02:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 17:55:17 +02:00
< ? php endif ; ?>
2012-03-28 06:14:09 +02:00
</ label >
< ? php
break ;
case 'radio' :
if ( empty ( $this -> choices ) )
return ;
$name = '_customize-radio-' . $this -> id ;
2014-06-30 17:55:17 +02: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 22:11:15 +02:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 17:55:17 +02:00
< ? php endif ;
2012-03-28 06:14:09 +02: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 17:55:17 +02: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 22:11:15 +02:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 17:55:17 +02:00
< ? php endif ; ?>
2012-04-25 23:03:29 +02:00
< select < ? php $this -> link (); ?> >
2012-03-28 06:14:09 +02: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 21:48:13 +02: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 22:11:15 +02:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 21:48:13 +02:00
< ? php endif ; ?>
< textarea rows = " 5 " < ? php $this -> link (); ?> ><?php echo esc_textarea( $this->value() ); ?></textarea>
</ label >
< ? php
break ;
2012-03-28 06:14:09 +02:00
case 'dropdown-pages' :
2012-03-28 11:45:51 +02: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 06:14:09 +02:00
printf (
'<label class="customize-control-select"><span class="customize-control-title">%s</span> %s</label>' ,
$this -> label ,
2012-03-28 11:45:51 +02:00
$dropdown
2012-03-28 06:14:09 +02:00
);
break ;
2014-06-30 21:48:13 +02: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 22:11:15 +02:00
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
2014-06-30 21:48:13 +02: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 06:14:09 +02:00
}
}
2014-10-24 18:32:18 +02:00
/**
* Render the control ' s JS template .
*
2014-11-28 10:20:23 +01:00
* This function is only run for control types that have been registered with
* { @ see WP_Customize_Manager :: register_control_type ()} .
2014-10-24 18:32:18 +02:00
*
2014-11-28 10:20:23 +01:00
* In the future , this will also print the template for the control ' s container
* element and be override - able .
2014-10-24 18:32:18 +02:00
*
* @ since 4.1 . 0
*/
final public function print_template () {
2015-03-10 19:02:28 +01:00
?>
< script type = " text/html " id = " tmpl-customize-control-<?php echo $this->type ; ?>-content " >
< ? php $this -> content_template (); ?>
</ script >
< ? php
2014-10-24 18:32:18 +02: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 08:35:54 +02:00
}
2012-07-26 23:45:33 +02:00
/**
2015-02-25 08:56:25 +01:00
* Customize Color Control class .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Control
2012-07-26 23:45:33 +02:00
*/
2012-04-25 23:03:29 +02:00
class WP_Customize_Color_Control extends WP_Customize_Control {
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var string
*/
2012-04-25 23:03:29 +02:00
public $type = 'color' ;
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ access public
* @ var array
*/
2012-04-25 23:03:29 +02:00
public $statuses ;
2012-07-26 23:45:33 +02: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 23:03:29 +02:00
public function __construct ( $manager , $id , $args = array () ) {
$this -> statuses = array ( '' => __ ( 'Default' ) );
parent :: __construct ( $manager , $id , $args );
}
2012-07-26 23:45:33 +02:00
/**
2014-03-04 21:21:14 +01:00
* Enqueue scripts / styles for the color picker .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
*/
2012-04-25 23:03:29 +02:00
public function enqueue () {
2012-09-27 03:57:38 +02:00
wp_enqueue_script ( 'wp-color-picker' );
wp_enqueue_style ( 'wp-color-picker' );
2012-04-25 23:03:29 +02:00
}
2012-07-26 23:45:33 +02:00
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Control :: to_json ()
*/
2012-04-25 23:03:29 +02:00
public function to_json () {
parent :: to_json ();
$this -> json [ 'statuses' ] = $this -> statuses ;
2014-10-24 18:32:18 +02:00
$this -> json [ 'defaultValue' ] = $this -> setting -> default ;
2012-04-25 23:03:29 +02:00
}
2012-07-26 23:45:33 +02:00
/**
2014-10-24 18:32:18 +02:00
* Don 't render the control content from PHP, as it' s rendered via JS on load .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
*/
2014-10-24 18:32:18 +02: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 23:03:29 +02:00
?>
2014-10-24 18:32:18 +02:00
< # var defaultValue = '';
if ( data . defaultValue ) {
if ( '#' !== data . defaultValue . substring ( 0 , 1 ) ) {
defaultValue = '#' + data . defaultValue ;
2014-10-29 03:43:22 +01:00
} else {
defaultValue = data . defaultValue ;
2014-10-24 18:32:18 +02:00
}
defaultValue = ' data-default-color=' + defaultValue ; // Quotes added automatically.
} #>
2012-04-25 23:03:29 +02:00
< label >
2014-10-24 18:32:18 +02:00
< # if ( data.label ) { #>
2014-11-13 12:44:23 +01:00
< span class = " customize-control-title " > {{{ data . label }}} </ span >
2014-10-24 18:32:18 +02:00
< # } #>
< # if ( data.description ) { #>
2014-11-13 12:44:23 +01:00
< span class = " description customize-control-description " > {{{ data . description }}} </ span >
2014-10-24 18:32:18 +02:00
< # } #>
2012-04-25 23:03:29 +02:00
< div class = " customize-control-content " >
2014-10-24 18:32:18 +02:00
< input class = " color-picker-hex " type = " text " maxlength = " 7 " placeholder = " <?php esc_attr_e( 'Hex Value' ); ?> " {{ defaultValue }} />
2012-04-25 23:03:29 +02:00
</ div >
</ label >
< ? php
}
}
2012-07-26 23:45:33 +02:00
/**
2015-03-10 19:02:28 +01:00
* Customize Media Control class .
2012-07-26 23:45:33 +02:00
*
2015-03-10 19:02:28 +01:00
* @ since 4.2 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Control
2012-07-26 23:45:33 +02:00
*/
2015-03-10 19:02:28 +01:00
class WP_Customize_Media_Control extends WP_Customize_Control {
2015-04-05 01:05:26 +02:00
/**
* Control type .
*
* @ since 4.2 . 0
* @ access public
* @ var string
*/
public $type = 'media' ;
/**
* Media control mime type .
*
* @ since 4.2 . 0
* @ access public
* @ var string
*/
public $mime_type = '' ;
/**
* Button labels .
*
* @ since 4.2 . 0
* @ access public
* @ var array
*/
2014-11-12 00:52:22 +01:00
public $button_labels = array ();
/**
* Constructor .
*
* @ since 4.1 . 0
2015-03-10 19:02:28 +01:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
2014-11-12 00:52:22 +01:00
*
2014-11-28 10:20:23 +01:00
* @ param WP_Customize_Manager $manager { @ see WP_Customize_Manager } instance .
2015-05-22 00:05:24 +02:00
* @ param string $id
* @ param array $args
2014-11-12 00:52:22 +01: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 08:35:54 +02:00
2012-07-26 23:45:33 +02:00
/**
* Enqueue control related scripts / styles .
*
* @ since 3.4 . 0
2015-03-10 19:02:28 +01:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
2012-07-26 23:45:33 +02:00
*/
2012-03-29 08:35:54 +02:00
public function enqueue () {
2014-11-12 00:52:22 +01:00
wp_enqueue_media ();
2012-03-29 08:35:54 +02:00
}
2012-08-01 04:30:02 +02:00
2012-07-26 23:45:33 +02:00
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 3.4 . 0
2015-03-10 19:02:28 +01:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
*
2015-04-05 01:05:26 +02:00
* @ see WP_Customize_Control :: to_json ()
2012-07-26 23:45:33 +02:00
*/
2012-03-29 08:35:54 +02:00
public function to_json () {
parent :: to_json ();
2015-06-20 20:15:26 +02:00
$this -> json [ 'label' ] = html_entity_decode ( $this -> label , ENT_QUOTES , get_bloginfo ( 'charset' ) );
2014-11-12 00:52:22 +01:00
$this -> json [ 'mime_type' ] = $this -> mime_type ;
$this -> json [ 'button_labels' ] = $this -> button_labels ;
2015-06-23 20:20:27 +02:00
$this -> json [ 'canUpload' ] = current_user_can ( 'upload_files' );
2014-11-12 00:52:22 +01:00
2014-12-14 20:37:22 +01:00
$value = $this -> value ();
2014-11-12 00:52:22 +01:00
if ( is_object ( $this -> setting ) ) {
if ( $this -> setting -> default ) {
// Fake an attachment model - needs all fields used by template.
2015-03-10 19:02:28 +01:00
// Note that the default value must be a URL, NOT an attachment ID.
2014-11-12 00:52:22 +01: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 20:37:22 +01:00
if ( 'image' === $type ) {
$default_attachment [ 'sizes' ] = array (
'full' => array ( 'url' => $this -> setting -> default ),
);
}
2014-11-12 00:52:22 +01:00
$this -> json [ 'defaultAttachment' ] = $default_attachment ;
}
2012-03-29 08:35:54 +02:00
2014-12-14 20:37:22 +01: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 19:02:28 +01:00
$this -> json [ 'attachment' ] = wp_prepare_attachment_for_js ( $value );
2014-11-12 00:52:22 +01:00
}
}
2012-03-29 08:35:54 +02:00
}
2012-07-26 23:45:33 +02:00
/**
2014-11-12 00:52:22 +01:00
* Don ' t render any content for this control from PHP .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
2015-03-10 19:02:28 +01:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
*
* @ see WP_Customize_Media_Control :: content_template ()
2012-07-26 23:45:33 +02:00
*/
2014-11-12 00:52:22 +01:00
public function render_content () {}
/**
2015-03-10 19:02:28 +01:00
* Render a JS template for the content of the media control .
2014-11-12 00:52:22 +01:00
*
* @ since 4.1 . 0
2015-03-10 19:02:28 +01:00
* @ since 4.2 . 0 Moved from WP_Customize_Upload_Control .
2014-11-12 00:52:22 +01:00
*/
public function content_template () {
2012-03-29 08:35:54 +02:00
?>
2014-12-23 18:05:26 +01:00
< label for = " { { data.settings['default'] }}-button " >
2014-11-12 00:52:22 +01:00
< # if ( data.label ) { #>
< span class = " customize-control-title " > {{ data . label }} </ span >
< # } #>
< # if ( data.description ) { #>
2014-12-14 20:24:23 +01:00
< span class = " description customize-control-description " > {{{ data . description }}} </ span >
2014-11-12 00:52:22 +01:00
< # } #>
2012-03-29 08:35:54 +02:00
</ label >
2014-11-12 00:52:22 +01:00
2014-12-14 20:37:22 +01:00
< # if ( data.attachment && data.attachment.id ) { #>
2014-12-02 22:55:23 +01:00
< div class = " current " >
< div class = " container " >
2014-12-04 02:59:22 +01:00
< div class = " attachment-media-view attachment-media-view- { { data.attachment.type }} { { data.attachment.orientation }} " >
2014-12-02 22:55:23 +01: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-04 02:59:22 +01:00
< # } else if ( 'audio' === data.attachment.type ) { #>
2015-03-07 12:06:29 +01: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-04 02:59:22 +01: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 12:06:29 +01: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 22:55:23 +01: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-12 00:52:22 +01:00
</ div >
2014-12-02 22:55:23 +01:00
</ div >
2014-11-12 00:52:22 +01:00
</ div >
</ div >
2014-12-02 22:55:23 +01:00
< div class = " actions " >
2015-06-23 20:20:27 +02:00
< # if ( data.canUpload ) { #>
2014-12-14 20:37:22 +01:00
< button type = " button " class = " button remove-button " >< ? php echo $this -> button_labels [ 'remove' ]; ?> </button>
2014-12-23 18:05:26 +01:00
< button type = " button " class = " button upload-button " id = " { { data.settings['default'] }}-button " >< ? php echo $this -> button_labels [ 'change' ]; ?> </button>
2014-12-02 22:55:23 +01:00
< div style = " clear:both " ></ div >
2015-06-23 20:20:27 +02:00
< # } #>
2014-12-02 22:55:23 +01:00
</ div >
2014-11-12 00:52:22 +01:00
< # } else { #>
2014-12-02 22:55:23 +01: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 20:37:22 +01:00
< button type = " button " class = " button default-button " >< ? php echo $this -> button_labels [ 'default' ]; ?> </button>
2014-12-02 22:55:23 +01:00
< # } #>
2015-06-23 20:20:27 +02:00
< # if ( data.canUpload ) { #>
2014-12-23 18:05:26 +01:00
< button type = " button " class = " button upload-button " id = " { { data.settings['default'] }}-button " >< ? php echo $this -> button_labels [ 'select' ]; ?> </button>
2015-06-23 20:20:27 +02:00
< # } #>
2014-12-02 22:55:23 +01:00
< div style = " clear:both " ></ div >
</ div >
2014-11-12 00:52:22 +01:00
< # } #>
2012-03-29 08:35:54 +02:00
< ? php
}
}
2015-03-10 19:02:28 +01: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 23:45:33 +02:00
/**
2015-02-25 08:56:25 +01:00
* Customize Image Control class .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Upload_Control
2012-07-26 23:45:33 +02:00
*/
2012-03-29 08:35:54 +02:00
class WP_Customize_Image_Control extends WP_Customize_Upload_Control {
public $type = 'image' ;
2014-11-12 00:52:22 +01:00
public $mime_type = 'image' ;
2012-04-20 04:39:55 +02:00
2012-07-26 23:45:33 +02:00
/**
* Constructor .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Upload_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager
2014-12-01 00:33:23 +01:00
* @ param string $id
* @ param array $args
2012-07-26 23:45:33 +02:00
*/
2014-11-12 00:52:22 +01:00
public function __construct ( $manager , $id , $args = array () ) {
2012-04-20 04:39:55 +02:00
parent :: __construct ( $manager , $id , $args );
2014-11-12 00:52:22 +01: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 08:45:54 +02:00
}
/**
2012-08-01 09:20:44 +02:00
* @ since 3.4 . 2
2014-11-12 00:52:22 +01:00
* @ deprecated 4.1 . 0
2012-08-01 08:45:54 +02:00
*/
2014-11-12 00:52:22 +01:00
public function prepare_control () {}
2012-04-20 04:39:55 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ since 3.4 . 0
2014-11-12 00:52:22 +01:00
* @ deprecated 4.1 . 0
2012-07-26 23:45:33 +02:00
*
* @ param string $id
* @ param string $label
* @ param mixed $callback
*/
2014-11-12 00:52:22 +01:00
public function add_tab ( $id , $label , $callback ) {}
2012-04-20 04:39:55 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ since 3.4 . 0
2014-11-12 00:52:22 +01:00
* @ deprecated 4.1 . 0
2012-07-26 23:45:33 +02:00
*
* @ param string $id
*/
2014-11-12 00:52:22 +01:00
public function remove_tab ( $id ) {}
2012-05-25 22:26:25 +02:00
2012-07-26 23:45:33 +02:00
/**
* @ since 3.4 . 0
2014-11-12 00:52:22 +01:00
* @ deprecated 4.1 . 0
2012-07-26 23:45:33 +02:00
*
* @ param string $url
* @ param string $thumbnail_url
*/
2014-11-12 00:52:22 +01:00
public function print_tab_image ( $url , $thumbnail_url = null ) {}
2012-05-25 22:26:25 +02:00
}
2012-07-26 23:45:33 +02:00
/**
2015-02-25 08:56:25 +01:00
* Customize Background Image Control class .
2012-07-26 23:45:33 +02:00
*
* @ since 3.4 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Image_Control
2012-07-26 23:45:33 +02:00
*/
2012-05-25 22:26:25 +02:00
class WP_Customize_Background_Image_Control extends WP_Customize_Image_Control {
2014-12-16 00:28:23 +01:00
public $type = 'background' ;
2012-07-26 23:45:33 +02:00
/**
* Constructor .
*
* @ since 3.4 . 0
* @ uses WP_Customize_Image_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager
*/
2012-05-25 22:26:25 +02:00
public function __construct ( $manager ) {
parent :: __construct ( $manager , 'background_image' , array (
'label' => __ ( 'Background Image' ),
'section' => 'background_image' ,
) );
}
2014-12-16 00:28:23 +01: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 19:32:03 +02:00
}
2012-04-20 04:39:55 +02:00
2015-02-25 08:56:25 +01:00
/**
* Customize Header Image Control class .
*
* @ since 3.4 . 0
*
* @ see WP_Customize_Image_Control
*/
2014-04-12 01:25:16 +02:00
class WP_Customize_Header_Image_Control extends WP_Customize_Image_Control {
2014-03-11 05:13:16 +01:00
public $type = 'header' ;
2014-11-02 00:18:23 +01:00
public $uploaded_headers ;
public $default_headers ;
2012-07-26 23:45:33 +02:00
2014-12-01 00:33:23 +01:00
/**
* @ param WP_Customize_Manager $manager
*/
2012-04-20 04:39:55 +02:00
public function __construct ( $manager ) {
parent :: __construct ( $manager , 'header_image' , array (
2012-04-25 23:03:29 +02:00
'label' => __ ( 'Header Image' ),
2012-06-10 02:32:19 +02:00
'settings' => array (
'default' => 'header_image' ,
'data' => 'header_image_data' ,
),
2012-05-25 21:52:54 +02:00
'section' => 'header_image' ,
2012-04-25 23:03:29 +02:00
'removed' => 'remove-header' ,
'get_url' => 'get_header_image' ,
2014-03-11 05:13:16 +01:00
) );
}
2015-05-29 23:37:24 +02:00
/**
* @ access public
*/
2014-03-11 05:13:16 +01: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 ();
}
2015-05-22 07:06:25 +02:00
/**
*
* @ global Custom_Image_Header $custom_image_header
*/
2012-08-01 08:45:54 +02:00
public function prepare_control () {
global $custom_image_header ;
2014-03-11 05:13:16 +01:00
if ( empty ( $custom_image_header ) ) {
return ;
}
2012-08-01 08:45:54 +02:00
// Process default headers and uploaded headers.
$custom_image_header -> process_default_headers ();
2014-03-29 11:53:15 +01:00
$this -> default_headers = $custom_image_header -> get_default_header_images ();
$this -> uploaded_headers = $custom_image_header -> get_uploaded_header_images ();
2014-03-11 05:13:16 +01:00
}
2012-08-01 08:45:54 +02:00
2015-05-29 23:37:24 +02:00
/**
* @ access public
*/
2015-01-08 07:02:24 +01:00
public function print_header_image_template () {
2014-03-11 05:13:16 +01:00
?>
< script type = " text/template " id = " tmpl-header-choice " >
< # if (data.random) { #>
2015-05-22 07:06:25 +02: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' ); ?>
< # } #>
</ button >
2012-08-01 08:45:54 +02:00
2014-03-11 05:13:16 +01:00
< # } else { #>
< # if (data.type === 'uploaded') { #>
2015-05-06 12:54:27 +02:00
< button type = " button " class = " dashicons dashicons-no close " >< span class = " screen-reader-text " >< ? php _e ( 'Remove image' ); ?> </span></button>
2014-03-11 05:13:16 +01:00
< # } #>
2014-04-04 17:49:15 +02:00
< button type = " button " class = " choice thumbnail "
2014-03-11 05:13:16 +01:00
data - customize - image - value = " { { { data.header.url}}} "
data - customize - header - image - data = " { { JSON.stringify(data.header)}} " >
2014-04-04 17:49:15 +02: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 05:13:16 +01:00
< # } #>
</ script >
< script type = " text/template " id = " tmpl-header-current " >
< # if (data.choice) { #>
< # if (data.random) { #>
2014-04-06 21:36:15 +02:00
< div class = " placeholder " >
2014-03-11 05:13:16 +01:00
< div class = " inner " >
2014-03-25 20:51:15 +01:00
< span >< span class = " dashicons dashicons-randomize dice " ></ span >
2014-03-11 05:13:16 +01:00
< # if ( data.type === 'uploaded' ) { #>
< ? php _e ( 'Randomizing uploaded headers' ); ?>
2014-03-24 20:16:14 +01:00
< # } else if ( data.type === 'default' ) { #>
2014-03-11 05:13:16 +01:00
< ? php _e ( 'Randomizing suggested headers' ); ?>
< # } #>
</ span >
</ div >
</ div >
2012-08-01 08:45:54 +02:00
2014-03-11 05:13:16 +01:00
< # } else { #>
2012-04-20 04:39:55 +02:00
2014-04-04 17:49:15 +02:00
< img src = " { { { data.header.thumbnail_url}}} " alt = " { { { data.header.alt_text || data.header.description}}} " tabindex = " 0 " />
2012-06-10 02:32:19 +02:00
2014-03-11 05:13:16 +01:00
< # } #>
< # } else { #>
2012-06-10 02:32:19 +02:00
2014-04-06 21:36:15 +02:00
< div class = " placeholder " >
2014-03-11 05:13:16 +01:00
< div class = " inner " >
< span >
< ? php _e ( 'No image set' ); ?>
</ span >
</ div >
</ div >
2012-06-10 02:32:19 +02:00
2014-03-11 05:13:16 +01:00
< # } #>
</ script >
2012-06-10 02:32:19 +02:00
< ? php
}
2012-08-01 04:30:02 +02:00
2015-05-22 00:05:24 +02:00
/**
2015-05-24 07:40:25 +02:00
* @ return string | void
2015-05-22 00:05:24 +02:00
*/
2014-03-11 05:13:16 +01: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 ;
}
2012-04-20 04:39:55 +02:00
}
2015-05-29 23:37:24 +02:00
/**
* @ access public
*/
2014-03-11 05:13:16 +01: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 21:36:15 +02:00
< p class = " customizer-section-intro " >
2014-03-11 05:13:16 +01:00
< ? php
if ( $width && $height ) {
2014-04-19 21:45:14 +02: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 09:18:14 +01:00
} elseif ( $width ) {
2014-04-19 21:45:14 +02: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 05:13:16 +01:00
} else {
2014-04-19 21:45:14 +02: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 05:13:16 +01:00
}
?>
</ p >
< div class = " current " >
2014-04-06 21:36:15 +02:00
< span class = " customize-control-title " >
2014-03-11 05:13:16 +01:00
< ? php _e ( 'Current header' ); ?>
</ span >
< div class = " container " >
</ div >
</ div >
< div class = " actions " >
2015-06-23 20:20:27 +02:00
< ? php if ( current_user_can ( 'upload_files' ) ) : ?>
2014-03-11 05:13:16 +01:00
< ? php /* translators: Hide as in hide header image via the Customizer */ ?>
2014-04-04 17:49:15 +02:00
< button type = " button " < ? php echo $visibility ?> class="button remove"><?php _ex( 'Hide image', 'custom header' ); ?></button>
2014-03-11 05:13:16 +01:00
< ? php /* translators: New as in add new header image via the Customizer */ ?>
2014-04-04 17:49:15 +02:00
< button type = " button " class = " button new " >< ? php _ex ( 'Add new image' , 'header image' ); ?> </button>
2014-03-11 05:13:16 +01:00
< div style = " clear:both " ></ div >
2015-06-23 20:20:27 +02:00
< ? php endif ; ?>
2014-03-11 05:13:16 +01:00
</ div >
< div class = " choices " >
2014-04-06 21:36:15 +02:00
< span class = " customize-control-title header-previously-uploaded " >
2014-03-11 05:13:16 +01:00
< ? php _ex ( 'Previously uploaded' , 'custom headers' ); ?>
</ span >
< div class = " uploaded " >
< div class = " list " >
</ div >
</ div >
2014-04-06 21:36:15 +02:00
< span class = " customize-control-title header-default " >
2014-03-11 05:13:16 +01:00
< ? php _ex ( 'Suggested' , 'custom headers' ); ?>
</ span >
< div class = " default " >
< div class = " list " >
</ div >
</ div >
</ div >
</ div >
< ? php
2012-04-20 04:39:55 +02:00
}
2014-03-05 21:41:14 +01:00
}
2015-02-24 21:31:24 +01:00
/**
2015-02-25 08:56:25 +01:00
* Customize Theme Control class .
2015-02-24 21:31:24 +01:00
*
* @ since 4.2 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Control
2015-02-24 21:31:24 +01:00
*/
class WP_Customize_Theme_Control extends WP_Customize_Control {
2015-04-05 16:53:25 +02:00
/**
* Customize control type .
*
* @ since 4.2 . 0
* @ access public
* @ var string
*/
2015-02-24 21:31:24 +01:00
public $type = 'theme' ;
2015-04-05 16:53:25 +02:00
/**
* Theme object .
*
* @ since 4.2 . 0
* @ access public
* @ var WP_Theme
*/
2015-02-24 21:31:24 +01:00
public $theme ;
/**
* Refresh the parameters passed to the JavaScript via JSON .
*
* @ since 4.2 . 0
2015-04-05 16:53:25 +02:00
* @ access public
*
* @ see WP_Customize_Control :: to_json ()
2015-02-24 21:31:24 +01:00
*/
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
2015-04-05 16:53:25 +02:00
* @ access public
2015-02-24 21:31:24 +01:00
*/
public function render_content () {}
/**
* Render a JS template for theme display .
*
* @ since 4.2 . 0
2015-04-05 16:53:25 +02:00
* @ access public
2015-02-24 21:31:24 +01:00
*/
public function content_template () {
2015-04-08 20:59:27 +02:00
$current_url = set_url_scheme ( 'http://' . $_SERVER [ 'HTTP_HOST' ] . $_SERVER [ 'REQUEST_URI' ] );
2015-04-22 18:15:27 +02:00
$active_url = esc_url ( remove_query_arg ( 'theme' , $current_url ) );
2015-04-15 18:33:25 +02:00
$preview_url = esc_url ( add_query_arg ( 'theme' , '__THEME__' , $current_url ) ); // Token because esc_url() strips curly braces.
$preview_url = str_replace ( '__THEME__' , '{{ data.theme.id }}' , $preview_url );
2015-04-01 14:36:26 +02:00
?>
2015-04-22 18:15:27 +02:00
< # if ( data.theme.isActiveTheme ) { #>
< div class = " theme active " tabindex = " 0 " data - preview - url = " <?php echo esc_attr( $active_url ); ?> " aria - describedby = " { { data.theme.id }}-action { { data.theme.id }}-name " >
< # } else { #>
< div class = " theme " tabindex = " 0 " data - preview - url = " <?php echo esc_attr( $preview_url ); ?> " aria - describedby = " { { data.theme.id }}-action { { data.theme.id }}-name " >
< # } #>
2015-02-24 21:31:24 +01:00
< # if ( data.theme.screenshot[0] ) { #>
< div class = " theme-screenshot " >
2015-04-08 22:52:29 +02:00
< img data - src = " { { data.theme.screenshot[0] }} " alt = " " />
2015-02-24 21:31:24 +01:00
</ div >
< # } else { #>
< div class = " theme-screenshot blank " ></ div >
< # } #>
2015-04-22 18:15:27 +02:00
< # if ( data.theme.isActiveTheme ) { #>
< span class = " more-details " id = " { { data.theme.id }}-action " >< ? php _e ( 'Customize' ); ?> </span>
< # } else { #>
< span class = " more-details " id = " { { data.theme.id }}-action " >< ? php _e ( 'Live Preview' ); ?> </span>
< # } #>
2015-02-24 21:31:24 +01:00
2015-04-22 18:15:27 +02:00
< div class = " theme-author " >< ? php printf ( __ ( 'By %s' ), '{{ data.theme.author }}' ); ?> </div>
< # if ( data.theme.isActiveTheme ) { #>
< h3 class = " theme-name " id = " { { data.theme.id }}-name " >
< ? php
/* translators: %s: theme name */
printf ( __ ( '<span>Active:</span> %s' ), '{{ data.theme.name }}' );
?>
</ h3 >
< # } else { #>
< h3 class = " theme-name " id = " { { data.theme.id }}-name " > {{ data . theme . name }} </ h3 >
< div class = " theme-actions " >
< button type = " button " class = " button theme-details " >< ? php _e ( 'Theme Details' ); ?> </button>
</ div >
< # } #>
2015-02-24 21:31:24 +01:00
</ div >
< ? php
}
}
2014-03-05 21:41:14 +01:00
/**
2015-02-25 08:56:25 +01:00
* Widget Area Customize Control class .
2014-03-05 21:41:14 +01: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 23:51:22 +01:00
* @ since 3.9 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Control
2014-03-05 21:41:14 +01: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 ;
}
}
2015-05-29 23:37:24 +02:00
/**
* @ access public
*/
2014-03-05 21:41:14 +01:00
public function render_content () {
?>
< span class = " button-secondary add-new-widget " tabindex = " 0 " >
2014-04-07 11:04:14 +02:00
< ? php _e ( 'Add a Widget' ); ?>
2014-03-05 21:41:14 +01:00
</ span >
< span class = " reorder-toggle " tabindex = " 0 " >
2014-04-07 11:04:14 +02:00
< span class = " reorder " >< ? php _ex ( 'Reorder' , 'Reorder widgets in Customizer' ); ?> </span>
2015-03-26 21:56:26 +01:00
< span class = " reorder-done " >< ? php _ex ( 'Done' , 'Cancel reordering widgets in Customizer' ); ?> </span>
2014-03-05 21:41:14 +01:00
</ span >
< ? php
}
2014-07-10 01:58:16 +02:00
2014-03-05 21:41:14 +01:00
}
/**
2015-02-25 08:56:25 +01: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 23:51:22 +01:00
*
* @ since 3.9 . 0
2015-02-25 08:56:25 +01:00
*
* @ see WP_Customize_Control
2014-03-05 21:41:14 +01: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 11:04:14 +02:00
$exported_properties = array ( 'widget_id' , 'widget_id_base' , 'sidebar_id' , 'width' , 'height' , 'is_wide' );
2014-03-05 21:41:14 +01:00
foreach ( $exported_properties as $key ) {
$this -> json [ $key ] = $this -> $key ;
}
}
2015-05-22 07:06:25 +02:00
/**
*
* @ global array $wp_registered_widgets
*/
2014-03-05 21:41:14 +01:00
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 15:07:14 +01:00
echo $this -> manager -> widgets -> get_widget_control ( $args );
2014-03-05 21:41:14 +01:00
}
2014-07-10 01:58:16 +02:00
/**
2014-07-14 02:32:16 +02: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-10 01:58:16 +02:00
*/
2015-01-08 07:02:24 +01:00
public function active_callback () {
2014-07-10 01:58:16 +02:00
return $this -> manager -> widgets -> is_widget_rendered ( $this -> widget_id );
}
2014-03-05 21:41:14 +01:00
}
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
/**
* Customize Nav Menu Control Class
*
* @ since 4.3 . 0
*/
class WP_Customize_Nav_Menu_Control extends WP_Customize_Control {
/**
* Control type .
*
* @ since 4.3 . 0
*
* @ access public
* @ var string
*/
public $type = 'nav_menu' ;
/**
* The nav menu setting .
*
* @ since 4.3 . 0
*
* @ var WP_Customize_Nav_Menu_Setting
*/
public $setting ;
/**
* Don 't render the control' s content - it uses a JS template instead .
*
* @ since 4.3 . 0
*/
public function render_content () {}
/**
* JS / Underscore template for the control UI .
*
* @ since 4.3 . 0
*/
public function content_template () {
?>
2015-06-18 22:52:24 +02:00
< button type = " button " class = " button-secondary add-new-menu-item " aria - expanded = " false " aria - controls = " available-menu-items " >
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
< ? php _e ( 'Add Items' ); ?>
</ button >
< button type = " button " class = " not-a-button reorder-toggle " >
< span class = " reorder " >< ? php _ex ( 'Reorder' , 'Reorder menu items in Customizer' ); ?> </span>
< span class = " reorder-done " >< ? php _ex ( 'Done' , 'Cancel reordering menu items in Customizer' ); ?> </span>
</ button >
< span class = " add-menu-item-loading spinner " ></ span >
< span class = " menu-delete-item " >
< button type = " button " class = " not-a-button menu-delete " >
< ? php _e ( 'Delete menu' ); ?> <span class="screen-reader-text">{{ data.menu_name }}</span>
</ button >
</ span >
< ? php if ( current_theme_supports ( 'menus' ) ) : ?>
< ul class = " menu-settings " >
< li class = " customize-control " >
< span class = " customize-control-title " >< ? php _e ( 'Menu locations' ); ?> </span>
</ li >
< ? php foreach ( get_registered_nav_menus () as $location => $description ) : ?>
< li class = " customize-control customize-control-checkbox assigned-menu-location " >
< label >
< input type = " checkbox " data - menu - id = " { { data.menu_id }} " data - location - id = " <?php echo esc_attr( $location ); ?> " class = " menu-location " /> < ? php echo $description ; ?>
< span class = " theme-location-set " >< ? php printf ( _x ( '(Current: %s)' , 'Current menu location' ), '<span class="current-menu-location-name-' . esc_attr ( $location ) . '"></span>' ); ?> </span>
</ label >
</ li >
< ? php endforeach ; ?>
</ ul >
< ? php endif ; ?>
< p >
< label >
< input type = " checkbox " class = " auto_add " >
< ? php _e ( 'Automatically add new top-level pages to this menu.' ) ?>
</ label >
</ p >
< ? php
}
/**
* Return params for this control .
*
* @ since 4.3 . 0
*
* @ return array
*/
2015-06-19 23:54:25 +02:00
public function json () {
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
$exported = parent :: json ();
$exported [ 'menu_id' ] = $this -> setting -> term_id ;
return $exported ;
}
}
/**
* Customize control to represent the name field for a given menu .
*
* @ since 4.3 . 0
*/
class WP_Customize_Nav_Menu_Item_Control extends WP_Customize_Control {
/**
* Control type .
*
* @ since 4.3 . 0
*
* @ access public
* @ var string
*/
public $type = 'nav_menu_item' ;
/**
* The nav menu item setting .
*
* @ since 4.3 . 0
*
* @ var WP_Customize_Nav_Menu_Item_Setting
*/
public $setting ;
/**
* Constructor .
*
* @ since 4.3 . 0
*
* @ uses WP_Customize_Control :: __construct ()
*
* @ param WP_Customize_Manager $manager An instance of the WP_Customize_Manager class .
* @ param string $id The control ID .
* @ param array $args Optional . Overrides class property defaults .
*/
public function __construct ( $manager , $id , $args = array () ) {
parent :: __construct ( $manager , $id , $args );
}
/**
* Don 't render the control' s content - it ' s rendered with a JS template .
*
* @ since 4.3 . 0
*/
public function render_content () {}
/**
* JS / Underscore template for the control UI .
*
* @ since 4.3 . 0
*/
public function content_template () {
?>
2015-06-20 20:47:27 +02:00
< div class = " menu-item-bar " >
< div class = " menu-item-handle " >
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
< span class = " item-type " > {{ data . item_type_label }} </ span >
< span class = " item-title " >
< span class = " spinner " ></ span >
2015-06-21 00:33:26 +02:00
< span class = " menu-item-title<# if ( ! data.title ) { #> no-title<# } #> " > {{ data . title || wp . customize . Menus . data . l10n . untitled }} </ span >
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
</ span >
< span class = " item-controls " >
< button type = " button " class = " not-a-button item-edit " >< span class = " screen-reader-text " >< ? php _e ( 'Edit Menu Item' ); ?> </span></button>
< button type = " button " class = " not-a-button item-delete submitdelete deletion " >< span class = " screen-reader-text " >< ? php _e ( 'Remove Menu Item' ); ?> </span></button>
</ span >
2015-06-20 20:47:27 +02:00
</ div >
</ div >
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
< div class = " menu-item-settings " id = " menu-item-settings- { { data.menu_item_id }} " >
< # if ( 'custom' === data.item_type ) { #>
< p class = " field-url description description-thin " >
< label for = " edit-menu-item-url- { { data.menu_item_id }} " >
< ? php _e ( 'URL' ); ?> <br />
< input class = " widefat code edit-menu-item-url " type = " text " id = " edit-menu-item-url- { { data.menu_item_id }} " name = " menu-item-url " />
</ label >
</ p >
< # } #>
< p class = " description description-thin " >
< label for = " edit-menu-item-title- { { data.menu_item_id }} " >
< ? php _e ( 'Navigation Label' ); ?> <br />
< input type = " text " id = " edit-menu-item-title- { { data.menu_item_id }} " class = " widefat edit-menu-item-title " name = " menu-item-title " />
</ label >
</ p >
< p class = " field-link-target description description-thin " >
< label for = " edit-menu-item-target- { { data.menu_item_id }} " >
< input type = " checkbox " id = " edit-menu-item-target- { { data.menu_item_id }} " class = " edit-menu-item-target " value = " _blank " name = " menu-item-target " />
< ? php _e ( 'Open link in a new tab' ); ?>
</ label >
</ p >
< p class = " field-attr-title description description-thin " >
< label for = " edit-menu-item-attr-title- { { data.menu_item_id }} " >
< ? php _e ( 'Title Attribute' ); ?> <br />
< input type = " text " id = " edit-menu-item-attr-title- { { data.menu_item_id }} " class = " widefat edit-menu-item-attr-title " name = " menu-item-attr-title " />
</ label >
</ p >
< p class = " field-css-classes description description-thin " >
< label for = " edit-menu-item-classes- { { data.menu_item_id }} " >
< ? php _e ( 'CSS Classes' ); ?> <br />
< input type = " text " id = " edit-menu-item-classes- { { data.menu_item_id }} " class = " widefat code edit-menu-item-classes " name = " menu-item-classes " />
</ label >
</ p >
< p class = " field-xfn description description-thin " >
< label for = " edit-menu-item-xfn- { { data.menu_item_id }} " >
< ? php _e ( 'Link Relationship (XFN)' ); ?> <br />
< input type = " text " id = " edit-menu-item-xfn- { { data.menu_item_id }} " class = " widefat code edit-menu-item-xfn " name = " menu-item-xfn " />
</ label >
</ p >
< p class = " field-description description description-thin " >
< label for = " edit-menu-item-description- { { data.menu_item_id }} " >
< ? php _e ( 'Description' ); ?> <br />
< textarea id = " edit-menu-item-description- { { data.menu_item_id }} " class = " widefat edit-menu-item-description " rows = " 3 " cols = " 20 " name = " menu-item-description " > {{ data . description }} </ textarea >
< span class = " description " >< ? php _e ( 'The description will be displayed in the menu if the current theme supports it.' ); ?> </span>
</ label >
</ p >
< div class = " menu-item-actions description-thin submitbox " >
< # if ( 'custom' != data.item_type && '' != data.original_title ) { #>
< p class = " link-to-original " >
2015-06-20 21:55:25 +02:00
< ? php printf ( __ ( 'Original: %s' ), '<a class="original-link" href="{{ data.url }}">{{ data.original_title }}</a>' ); ?>
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
</ p >
< # } #>
< button type = " button " class = " not-a-button item-delete submitdelete deletion " >< ? php _e ( 'Remove' ); ?> </button>
< span class = " spinner " ></ span >
</ div >
< input type = " hidden " name = " menu-item-db-id[ { { data.menu_item_id }}] " class = " menu-item-data-db-id " value = " { { data.menu_item_id }} " />
< input type = " hidden " name = " menu-item-parent-id[ { { data.menu_item_id }}] " class = " menu-item-data-parent-id " value = " { { data.parent }} " />
</ div ><!-- . menu - item - settings -->
< ul class = " menu-item-transport " ></ ul >
< ? php
}
/**
* Return params for this control .
*
* @ since 4.3 . 0
*
* @ return array
*/
2015-06-19 23:55:24 +02:00
public function json () {
Add menu management to the Customizer.
This brings in the Menu Customizer plugin: https://wordpress.org/plugins/menu-customizer/.
props celloexpressions, westonruter, valendesigns, voldemortensen, ocean90, adamsilverstein, kucrut, jorbin, designsimply, afercia, davidakennedy, obenland.
see #32576.
Built from https://develop.svn.wordpress.org/trunk@32806
git-svn-id: http://core.svn.wordpress.org/trunk@32777 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-06-17 00:08:26 +02:00
$exported = parent :: json ();
$exported [ 'menu_item_id' ] = $this -> setting -> post_id ;
return $exported ;
}
}
/**
* Customize Menu Location Control Class
*
* This custom control is only needed for JS .
*
* @ since 4.3 . 0
*/
class WP_Customize_Nav_Menu_Location_Control extends WP_Customize_Control {
/**
* Control type .
*
* @ since 4.3 . 0
*
* @ access public
* @ var string
*/
public $type = 'nav_menu_location' ;
/**
* Location ID .
*
* @ since 4.3 . 0
*
* @ access public
* @ var string
*/
public $location_id = '' ;
/**
* Refresh the parameters passed to JavaScript via JSON .
*
* @ since 4.3 . 0
*
* @ uses WP_Customize_Control :: to_json ()
*/
public function to_json () {
parent :: to_json ();
$this -> json [ 'locationId' ] = $this -> location_id ;
}
/**
* Render content just like a normal select control .
*
* @ since 4.3 . 0
*/
public function render_content () {
if ( empty ( $this -> choices ) ) {
return ;
}
?>
< label >
< ? php if ( ! empty ( $this -> label ) ) : ?>
< span class = " customize-control-title " >< ? php echo esc_html ( $this -> label ); ?> </span>
< ? php endif ; ?>
< ? php if ( ! empty ( $this -> description ) ) : ?>
< span class = " description customize-control-description " >< ? php echo $this -> description ; ?> </span>
< ? php endif ; ?>
< select < ? php $this -> link (); ?> >
< ? php
foreach ( $this -> choices as $value => $label ) :
echo '<option value="' . esc_attr ( $value ) . '"' . selected ( $this -> value (), $value , false ) . '>' . $label . '</option>' ;
endforeach ;
?>
</ select >
</ label >
< ? php
}
}
/**
* Customize control to represent the name field for a given menu .
*
* @ since 4.3 . 0
*/
class WP_Customize_Nav_Menu_Name_Control extends WP_Customize_Control {
/**
* Type of control , used by JS .
*
* @ since 4.3 . 0
*
* @ var string
*/
public $type = 'nav_menu_name' ;
/**
* No - op since we ' re using JS template .
*
* @ since 4.3 . 0
*/
protected function render_content () {}
/**
* Render the Underscore template for this control .
*
* @ since 4.3 . 0
*/
protected function content_template () {
?>
< label >
< input type = " text " class = " menu-name-field live-update-section-title " />
</ label >
< ? php
}
}
/**
* Customize control class for new menus .
*
* @ since 4.3 . 0
*/
class WP_New_Menu_Customize_Control extends WP_Customize_Control {
/**
* Control type .
*
* @ since 4.3 . 0
*
* @ access public
* @ var string
*/
public $type = 'new_menu' ;
/**
* Render the control ' s content .
*
* @ since 4.3 . 0
*/
public function render_content () {
?>
< button type = " button " class = " button button-primary " id = " create-new-menu-submit " >< ? php _e ( 'Create Menu' ); ?> </button>
< span class = " spinner " ></ span >
< ? php
}
}