2012-02-25 04:12:43 +00:00
< ? php
/**
* Customize
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2012-05-23 17:56:42 +00:00
final class WP_Customize_Manager {
2012-04-17 21:43:47 +00:00
protected $theme ;
2012-04-17 20:49:39 +00:00
protected $original_stylesheet ;
2012-02-25 04:12:43 +00:00
protected $previewing = false ;
protected $settings = array ();
protected $sections = array ();
2012-03-28 04:14:09 +00:00
protected $controls = array ();
2012-02-25 04:12:43 +00:00
2012-04-30 15:46:17 +00:00
protected $customized ;
private $_post_values ;
2012-02-25 04:12:43 +00:00
/**
* Constructor .
*
* @ since 3.4 . 0
*/
public function __construct () {
require ( ABSPATH . WPINC . '/class-wp-customize-setting.php' );
require ( ABSPATH . WPINC . '/class-wp-customize-section.php' );
2012-03-28 04:14:09 +00:00
require ( ABSPATH . WPINC . '/class-wp-customize-control.php' );
2012-02-25 04:12:43 +00:00
2012-04-25 15:44:06 +00:00
add_action ( 'setup_theme' , array ( $this , 'setup_theme' ) );
2012-03-01 00:14:51 +00:00
add_action ( 'wp_loaded' , array ( $this , 'wp_loaded' ) );
2012-02-25 04:12:43 +00:00
2012-05-24 01:48:32 +00:00
// Run wp_redirect_status late to make sure we override the status last.
add_action ( 'wp_redirect_status' , array ( $this , 'wp_redirect_status' ), 1000 );
2012-04-30 15:46:17 +00:00
add_action ( 'wp_ajax_customize_save' , array ( $this , 'save' ) );
2012-03-21 22:55:43 +00:00
add_action ( 'customize_register' , array ( $this , 'register_controls' ) );
add_action ( 'customize_controls_init' , array ( $this , 'prepare_controls' ) );
add_action ( 'customize_controls_enqueue_scripts' , array ( $this , 'enqueue_control_scripts' ) );
2012-02-25 04:12:43 +00:00
}
/**
* Update theme modifications for the current theme .
* Note : Candidate core function .
* http :// core . trac . wordpress . org / ticket / 20091
*
* @ since 3.4 . 0
*
* @ param array $mods Theme modifications .
*/
public function set_theme_mods ( $mods ) {
$current = get_theme_mods ();
$mods = wp_parse_args ( $mods , $current );
$theme = get_stylesheet ();
update_option ( " theme_mods_ $theme " , $mods );
}
/**
* Start preview and customize theme .
2012-04-17 21:43:47 +00:00
*
* Check if customize query variable exist . Init filters to filter the current theme .
2012-02-25 04:12:43 +00:00
*
* @ since 3.4 . 0
*/
2012-04-25 15:44:06 +00:00
public function setup_theme () {
2012-05-23 17:56:42 +00:00
if ( ! ( isset ( $_REQUEST [ 'customize' ] ) && 'on' == $_REQUEST [ 'customize' ] ) && ! basename ( $_SERVER [ 'PHP_SELF' ] ) == 'customize.php' )
2012-02-25 04:12:43 +00:00
return ;
2012-05-15 18:46:03 +00:00
send_origin_headers ();
2012-05-08 20:13:34 +00:00
2012-04-25 15:44:06 +00:00
$this -> start_previewing_theme ();
show_admin_bar ( false );
}
2012-02-25 04:12:43 +00:00
2012-04-25 15:44:06 +00:00
/**
* Start previewing the selected theme .
*
* Adds filters to change the current theme .
*
* @ since 3.4 . 0
*/
public function start_previewing_theme () {
if ( $this -> is_preview () || false === $this -> theme || ( $this -> theme && ! $this -> theme -> exists () ) )
return ;
2012-02-25 04:12:43 +00:00
2012-04-25 15:44:06 +00:00
// Initialize $theme and $original_stylesheet if they do not yet exist.
if ( ! isset ( $this -> theme ) ) {
2012-05-23 17:56:42 +00:00
$this -> theme = wp_get_theme ( isset ( $_REQUEST [ 'theme' ] ) ? $_REQUEST [ 'theme' ] : null );
2012-04-25 15:44:06 +00:00
if ( ! $this -> theme -> exists () ) {
$this -> theme = false ;
return ;
}
}
2012-02-25 04:12:43 +00:00
2012-04-17 20:49:39 +00:00
$this -> original_stylesheet = get_stylesheet ();
2012-04-25 15:44:06 +00:00
$this -> previewing = true ;
2012-02-25 04:12:43 +00:00
add_filter ( 'template' , array ( $this , 'get_template' ) );
add_filter ( 'stylesheet' , array ( $this , 'get_stylesheet' ) );
add_filter ( 'pre_option_current_theme' , array ( $this , 'current_theme' ) );
// @link: http://core.trac.wordpress.org/ticket/20027
add_filter ( 'pre_option_stylesheet' , array ( $this , 'get_stylesheet' ) );
add_filter ( 'pre_option_template' , array ( $this , 'get_template' ) );
// Handle custom theme roots.
2012-04-17 21:43:47 +00:00
add_filter ( 'pre_option_stylesheet_root' , array ( $this , 'get_stylesheet_root' ) );
add_filter ( 'pre_option_template_root' , array ( $this , 'get_template_root' ) );
2012-04-30 17:20:32 +00:00
do_action ( 'start_previewing_theme' , $this );
2012-04-25 15:44:06 +00:00
}
/**
* Stop previewing the selected theme .
*
* Removes filters to change the current theme .
*
* @ since 3.4 . 0
*/
public function stop_previewing_theme () {
if ( ! $this -> is_preview () )
return ;
$this -> previewing = false ;
remove_filter ( 'template' , array ( $this , 'get_template' ) );
remove_filter ( 'stylesheet' , array ( $this , 'get_stylesheet' ) );
remove_filter ( 'pre_option_current_theme' , array ( $this , 'current_theme' ) );
// @link: http://core.trac.wordpress.org/ticket/20027
remove_filter ( 'pre_option_stylesheet' , array ( $this , 'get_stylesheet' ) );
remove_filter ( 'pre_option_template' , array ( $this , 'get_template' ) );
// Handle custom theme roots.
remove_filter ( 'pre_option_stylesheet_root' , array ( $this , 'get_stylesheet_root' ) );
remove_filter ( 'pre_option_template_root' , array ( $this , 'get_template_root' ) );
2012-04-30 17:20:32 +00:00
do_action ( 'stop_previewing_theme' , $this );
2012-02-25 04:12:43 +00:00
}
2012-05-23 17:56:42 +00:00
/**
2012-05-23 21:21:29 +00:00
* Get the theme being customized .
2012-05-23 17:56:42 +00:00
*
* @ since 3.4 . 0
*
* @ return WP_Theme
*/
2012-05-23 21:21:29 +00:00
public function theme () {
return $this -> theme ;
}
/**
* Get the registered settings .
*
* @ since 3.4 . 0
*
* @ return array
*/
public function settings () {
return $this -> settings ;
}
/**
* Get the registered controls .
*
* @ since 3.4 . 0
*
* @ return array
*/
public function controls () {
return $this -> controls ;
}
/**
* Get the registered sections .
*
* @ since 3.4 . 0
*
* @ return array
*/
public function sections () {
return $this -> sections ;
2012-05-23 17:56:42 +00:00
}
2012-05-16 05:55:54 +00:00
/**
* Checks if the current theme is active .
*
* @ since 3.4 . 0
2012-05-23 17:56:42 +00:00
*
* @ return bool
2012-05-16 05:55:54 +00:00
*/
2012-05-23 17:56:42 +00:00
public function is_theme_active () {
2012-05-16 05:55:54 +00:00
return $this -> get_stylesheet () == $this -> original_stylesheet ;
}
2012-02-25 04:12:43 +00:00
/**
2012-03-01 00:14:51 +00:00
* Register styles / scripts and initialize the preview of each setting
2012-02-25 04:12:43 +00:00
*
* @ since 3.4 . 0
*/
2012-03-01 00:14:51 +00:00
public function wp_loaded () {
2012-04-30 17:20:32 +00:00
do_action ( 'customize_register' , $this );
2012-02-25 04:12:43 +00:00
2012-03-28 15:04:11 +00:00
if ( $this -> is_preview () && ! is_admin () )
$this -> customize_preview_init ();
2012-03-21 22:55:43 +00:00
}
2012-05-24 01:48:32 +00:00
/**
* Prevents AJAX requests from following redirects when previewing a theme
* by issuing a 200 response instead of a 30 x .
*
* Instead , the JS will sniff out the location header .
*
* @ since 3.4 . 0
*/
public function wp_redirect_status ( $status ) {
if ( $this -> is_preview () && ! is_admin () )
return 200 ;
return $status ;
}
2012-04-30 15:46:17 +00:00
/**
* Decode the $_POST attribute used to override the WP_Customize_Setting values .
*
* @ since 3.4 . 0
*/
public function post_value ( $setting ) {
if ( ! isset ( $this -> _post_values ) ) {
if ( isset ( $_POST [ 'customized' ] ) )
$this -> _post_values = json_decode ( stripslashes ( $_POST [ 'customized' ] ), true );
else
$this -> _post_values = false ;
}
if ( isset ( $this -> _post_values [ $setting -> id ] ) )
return $setting -> sanitize ( $this -> _post_values [ $setting -> id ] );
}
2012-03-21 22:55:43 +00:00
/**
* Print javascript settings .
*
* @ since 3.4 . 0
*/
public function customize_preview_init () {
$this -> prepare_controls ();
2012-02-25 04:12:43 +00:00
wp_enqueue_script ( 'customize-preview' );
2012-05-24 02:07:16 +00:00
add_action ( 'wp_head' , array ( $this , 'customize_preview_base' ) );
2012-02-25 04:12:43 +00:00
add_action ( 'wp_footer' , array ( $this , 'customize_preview_settings' ), 20 );
foreach ( $this -> settings as $setting ) {
$setting -> preview ();
}
2012-03-21 22:55:43 +00:00
2012-04-30 17:20:32 +00:00
do_action ( 'customize_preview_init' , $this );
2012-02-25 04:12:43 +00:00
}
2012-05-24 02:07:16 +00:00
/**
* Print base element for preview frame .
*
* @ since 3.4 . 0
*/
public function customize_preview_base () {
?> <base href="<?php echo home_url( '/' ); ?>" /><?php
}
2012-03-21 22:55:43 +00:00
2012-02-25 04:12:43 +00:00
/**
2012-05-24 02:07:16 +00:00
* Print javascript settings for preview frame .
2012-02-25 04:12:43 +00:00
*
* @ since 3.4 . 0
*/
public function customize_preview_settings () {
$settings = array (
2012-03-06 02:49:02 +00:00
'values' => array (),
2012-02-25 04:12:43 +00:00
);
2012-03-06 02:49:02 +00:00
foreach ( $this -> settings as $id => $setting ) {
2012-05-16 20:59:02 +00:00
$settings [ 'values' ][ $id ] = $setting -> js_value ();
2012-03-06 02:49:02 +00:00
}
2012-02-25 04:12:43 +00:00
?>
< script type = " text/javascript " >
2012-05-07 20:03:39 +00:00
var _wpCustomizeSettings = < ? php echo json_encode ( $settings ); ?> ;
2012-02-25 04:12:43 +00:00
</ script >
< ? php
}
/**
* Is it a theme preview ?
*
* @ since 3.4 . 0
*
* @ return bool True if it ' s a preview , false if not .
*/
public function is_preview () {
return ( bool ) $this -> previewing ;
}
/**
* Retrieve the template name of the previewed theme .
*
* @ since 3.4 . 0
*
* @ return string Template name .
*/
public function get_template () {
2012-04-17 21:43:47 +00:00
return $this -> theme -> get_template ();
2012-02-25 04:12:43 +00:00
}
/**
* Retrieve the stylesheet name of the previewed theme .
*
* @ since 3.4 . 0
*
* @ return string Stylesheet name .
*/
public function get_stylesheet () {
2012-04-17 21:43:47 +00:00
return $this -> theme -> get_stylesheet ();
2012-02-25 04:12:43 +00:00
}
/**
* Retrieve the template root of the previewed theme .
*
* @ since 3.4 . 0
*
* @ return string Theme root .
*/
public function get_template_root () {
2012-04-17 21:43:47 +00:00
return get_raw_theme_root ( $this -> get_template (), true );
2012-02-25 04:12:43 +00:00
}
/**
* Retrieve the stylesheet root of the previewed theme .
*
* @ since 3.4 . 0
*
* @ return string Theme root .
*/
public function get_stylesheet_root () {
2012-04-17 21:43:47 +00:00
return get_raw_theme_root ( $this -> get_stylesheet (), true );
2012-02-25 04:12:43 +00:00
}
/**
* Filter the current theme and return the name of the previewed theme .
*
* @ since 3.4 . 0
*
* @ return string Theme name .
*/
public function current_theme ( $current_theme ) {
2012-04-17 21:43:47 +00:00
return $this -> theme -> display ( 'Name' );
2012-02-25 04:12:43 +00:00
}
/**
* Switch the theme and trigger the save action of each setting .
*
* @ since 3.4 . 0
*/
public function save () {
2012-04-25 15:44:06 +00:00
if ( ! $this -> is_preview () )
2012-04-30 15:46:17 +00:00
die ;
2012-02-25 04:12:43 +00:00
2012-04-30 15:46:17 +00:00
check_ajax_referer ( 'customize_controls' , 'nonce' );
2012-02-25 04:12:43 +00:00
// Do we have to switch themes?
2012-04-25 15:44:06 +00:00
if ( $this -> get_stylesheet () != $this -> original_stylesheet ) {
2012-02-25 04:12:43 +00:00
if ( ! current_user_can ( 'switch_themes' ) )
2012-04-30 15:46:17 +00:00
die ;
2012-02-25 04:12:43 +00:00
2012-04-25 15:44:06 +00:00
// Temporarily stop previewing the theme to allow switch_themes()
// to operate properly.
$this -> stop_previewing_theme ();
2012-02-25 04:12:43 +00:00
switch_theme ( $this -> get_template (), $this -> get_stylesheet () );
2012-04-25 15:44:06 +00:00
$this -> start_previewing_theme ();
2012-02-25 04:12:43 +00:00
}
2012-04-30 17:20:32 +00:00
do_action ( 'customize_save' , $this );
2012-02-25 04:12:43 +00:00
foreach ( $this -> settings as $setting ) {
$setting -> save ();
}
add_action ( 'admin_notices' , array ( $this , '_save_feedback' ) );
2012-04-30 15:46:17 +00:00
die ;
2012-02-25 04:12:43 +00:00
}
/**
* Show an admin notice after settings are saved .
*
* @ since 3.4 . 0
*/
public function _save_feedback () {
?>
< div class = " updated " >< p >< ? php printf ( __ ( 'Settings saved and theme activated. <a href="%s">Visit site</a>.' ), home_url ( '/' ) ); ?> </p></div>
< ? php
}
/**
* Add a customize setting .
*
* @ since 3.4 . 0
*
2012-03-28 04:14:09 +00:00
* @ param string $id A specific ID of the setting . Can be a
2012-02-25 04:12:43 +00:00
* theme mod or option name .
* @ param array $args Setting arguments .
*/
public function add_setting ( $id , $args = array () ) {
2012-03-28 04:14:09 +00:00
if ( is_a ( $id , 'WP_Customize_Setting' ) )
$setting = $id ;
else
$setting = new WP_Customize_Setting ( $this , $id , $args );
2012-02-25 04:12:43 +00:00
$this -> settings [ $setting -> id ] = $setting ;
}
/**
* Retrieve a customize setting .
*
* @ since 3.4 . 0
*
2012-03-28 04:14:09 +00:00
* @ param string $id A specific ID of the setting .
2012-02-25 04:12:43 +00:00
* @ return object The settings object .
*/
public function get_setting ( $id ) {
if ( isset ( $this -> settings [ $id ] ) )
return $this -> settings [ $id ];
}
/**
* Remove a customize setting .
*
* @ since 3.4 . 0
*
2012-03-28 04:14:09 +00:00
* @ param string $id A specific ID of the setting .
2012-02-25 04:12:43 +00:00
*/
public function remove_setting ( $id ) {
unset ( $this -> settings [ $id ] );
}
/**
* Add a customize section .
*
* @ since 3.4 . 0
*
2012-03-28 04:14:09 +00:00
* @ param string $id A specific ID of the section .
2012-02-25 04:12:43 +00:00
* @ param array $args Section arguments .
*/
public function add_section ( $id , $args = array () ) {
2012-03-28 04:14:09 +00:00
if ( is_a ( $id , 'WP_Customize_Section' ) )
$section = $id ;
else
$section = new WP_Customize_Section ( $this , $id , $args );
2012-02-25 04:12:43 +00:00
$this -> sections [ $section -> id ] = $section ;
}
/**
* Retrieve a customize section .
*
* @ since 3.4 . 0
*
2012-03-28 04:14:09 +00:00
* @ param string $id A specific ID of the section .
2012-02-25 04:12:43 +00:00
* @ return object The section object .
*/
public function get_section ( $id ) {
if ( isset ( $this -> sections [ $id ] ) )
return $this -> sections [ $id ];
}
/**
* Remove a customize section .
*
* @ since 3.4 . 0
*
2012-03-28 04:14:09 +00:00
* @ param string $id A specific ID of the section .
2012-02-25 04:12:43 +00:00
*/
public function remove_section ( $id ) {
unset ( $this -> sections [ $id ] );
}
2012-03-28 04:14:09 +00:00
/**
* Add a customize control .
*
* @ since 3.4 . 0
*
* @ param string $id A specific ID of the control .
* @ param array $args Setting arguments .
*/
public function add_control ( $id , $args = array () ) {
if ( is_a ( $id , 'WP_Customize_Control' ) )
$control = $id ;
else
$control = new WP_Customize_Control ( $this , $id , $args );
$this -> controls [ $control -> id ] = $control ;
}
/**
* Retrieve a customize control .
*
* @ since 3.4 . 0
*
* @ param string $id A specific ID of the control .
* @ return object The settings object .
*/
public function get_control ( $id ) {
if ( isset ( $this -> controls [ $id ] ) )
return $this -> controls [ $id ];
}
/**
* Remove a customize setting .
*
* @ since 3.4 . 0
*
* @ param string $id A specific ID of the control .
*/
public function remove_control ( $id ) {
unset ( $this -> controls [ $id ] );
}
2012-02-25 04:12:43 +00:00
/**
* Helper function to compare two objects by priority .
*
* @ since 3.4 . 0
*
* @ param object $a Object A .
* @ param object $b Object B .
*/
2012-03-21 22:55:43 +00:00
protected final function _cmp_priority ( $a , $b ) {
2012-02-25 04:12:43 +00:00
$ap = $a -> priority ;
$bp = $b -> priority ;
if ( $ap == $bp )
return 0 ;
return ( $ap > $bp ) ? 1 : - 1 ;
}
/**
2012-03-21 22:55:43 +00:00
* Prepare settings and sections .
2012-02-25 04:12:43 +00:00
*
* @ since 3.4 . 0
*/
public function prepare_controls () {
2012-03-28 04:14:09 +00:00
// Prepare controls
2012-02-25 04:12:43 +00:00
// Reversing makes uasort sort by time added when conflicts occur.
2012-03-28 04:14:09 +00:00
$this -> controls = array_reverse ( $this -> controls );
$controls = array ();
2012-03-21 22:55:43 +00:00
2012-03-28 04:14:09 +00:00
foreach ( $this -> controls as $id => $control ) {
if ( ! isset ( $this -> sections [ $control -> section ] ) || ! $control -> check_capabilities () )
2012-02-25 04:12:43 +00:00
continue ;
2012-03-28 04:14:09 +00:00
$this -> sections [ $control -> section ] -> controls [] = $control ;
$controls [ $id ] = $control ;
2012-02-25 04:12:43 +00:00
}
2012-03-28 04:14:09 +00:00
$this -> controls = $controls ;
2012-03-21 22:55:43 +00:00
// Prepare sections
$this -> sections = array_reverse ( $this -> sections );
uasort ( $this -> sections , array ( $this , '_cmp_priority' ) );
$sections = array ();
2012-02-25 04:12:43 +00:00
foreach ( $this -> sections as $section ) {
2012-03-28 04:14:09 +00:00
if ( ! $section -> check_capabilities () || ! $section -> controls )
2012-03-21 22:55:43 +00:00
continue ;
2012-03-28 04:14:09 +00:00
usort ( $section -> controls , array ( $this , '_cmp_priority' ) );
2012-03-21 22:55:43 +00:00
$sections [] = $section ;
}
$this -> sections = $sections ;
}
/**
* Enqueue scripts for customize controls .
*
* @ since 3.4 . 0
*/
public function enqueue_control_scripts () {
2012-03-28 04:14:09 +00:00
foreach ( $this -> controls as $control ) {
$control -> enqueue ();
2012-02-25 04:12:43 +00:00
}
}
/**
* Register some default controls .
*
* @ since 3.4 . 0
*/
public function register_controls () {
/* Custom Header */
$this -> add_section ( 'header' , array (
'title' => __ ( 'Header' ),
'theme_supports' => 'custom-header' ,
2012-03-28 09:57:55 +00:00
'priority' => 20 ,
2012-02-25 04:12:43 +00:00
) );
$this -> add_setting ( 'header_textcolor' , array (
2012-05-23 15:36:27 +00:00
'sanitize_callback' => 'sanitize_header_textcolor' ,
2012-03-28 04:14:09 +00:00
'theme_supports' => array ( 'custom-header' , 'header-text' ),
'default' => get_theme_support ( 'custom-header' , 'default-text-color' ),
) );
$this -> add_control ( 'display_header_text' , array (
'settings' => 'header_textcolor' ,
'label' => __ ( 'Display Header Text' ),
'section' => 'header' ,
'type' => 'checkbox' ,
2012-02-25 04:12:43 +00:00
) );
2012-04-25 21:03:29 +00:00
$this -> add_control ( new WP_Customize_Color_Control ( $this , 'header_textcolor' , array (
2012-03-28 04:14:09 +00:00
'label' => __ ( 'Text Color' ),
2012-02-25 04:12:43 +00:00
'section' => 'header' ,
2012-04-25 21:03:29 +00:00
) ) );
2012-02-25 04:12:43 +00:00
// Input type: checkbox
// With custom value
$this -> add_setting ( 'header_image' , array (
2012-03-28 04:14:09 +00:00
'default' => get_theme_support ( 'custom-header' , 'default-image' ),
'theme_supports' => 'custom-header' ,
) );
2012-04-20 02:39:55 +00:00
$this -> add_control ( new WP_Customize_Header_Image_Control ( $this ) );
2012-02-25 04:12:43 +00:00
/* Custom Background */
$this -> add_section ( 'background' , array (
'title' => __ ( 'Background' ),
'theme_supports' => 'custom-background' ,
2012-03-28 09:57:55 +00:00
'priority' => 30 ,
2012-02-25 04:12:43 +00:00
) );
// Input type: Color
// With sanitize_callback
$this -> add_setting ( 'background_color' , array (
Introduce new registration methods for custom headers and custom backgrounds. Backwards compatible, but old methods will be deprecated. see #20249. see #17242.
Custom header: Use add_theme_support('custom-header', $args) instead of add_custom_image_header(). Deprecates all use of constants.
* HEADER_TEXTCOLOR is now (string) 'default-text-color'.
* NO_HEADER_TEXT is nowi ! (bool) 'header-text'.
* HEADER_IMAGE_WIDTH (and _HEIGHT) are now (int) 'width' and 'height'.
* HEADER_IMAGE is now (string) 'default-image'.
* The 3.4 arguments 'suggested-width' and 'suggested-height' are now just 'width' and 'height' (they are "suggested" when flex-width and flex-height are set).
* Callback arguments for add_custom_image_header() can now be passed to add_theme_support().
Custom background: Use add_theme_support('custom-background, $args) instead of add_custom_background(). Deprecates all use of constants.
* BACKGROUND_COLOR is now (string) 'default-color'.
* BACKGROUND_IMAGE is now (string) 'default-image'.
* Callback arguments for add_custom_background() can now be passed to add_theme_support().
Inheritance: add_theme_support() arguments for custom headers and custom backgrounds is a first-one-wins situation. This is not an unusual paradigm for theming as a child theme (which is included first) overrides a parent theme.
* Once an argument is explicitly set, it cannot be overridden. You must hook in earlier and set it first.
* Any argument that is not explicitly set before WP is loaded will inherit the default value for that argument.
* It is therefore possible for a child theme to pass minimal arguments as long as the parent theme specifies others that may be necessary.
* Allows for a child theme to alter callbacks for <head> and preview (previously, calling add_custom_image_header more than once broke things).
* The just-in-time bits ensure that arguments fall back to default values, that the values of all constants are considered (such as one defined after an old add_custom_image_header call), and that all constants are defined (so as to be backwards compatible).
get_theme_support(): Introduce new second argument, which headers and backgrounds leverage to return an argument. current_theme_supports() already supported checking the truthiness of the argument.
* For example, get_theme_support( 'custom-header', 'width' ) will return the width specified during registration.
* If you had wanted the default image, use get_theme_support( 'custom-header', 'default-image' ) instead of HEADER_IMAGE.
Deprecate remove_custom_image_header(), remove_custom_background(). Use remove_theme_support('custom-header'), 'custom-background'.
Deprecate short-lived custom-header-uploads internal support; this is now (bool) 'uploads' for add_theme_support().
New 3.4 functions renamed or removed: Rename get_current_header_data() to get_custom_header(). Remove get_header_image_width() and _height() in favor of get_custom_header()->width and height.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20212 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-19 17:12:44 +00:00
'default' => get_theme_support ( 'custom-background' , 'default-color' ),
2012-03-15 04:14:05 +00:00
'sanitize_callback' => 'sanitize_hexcolor' ,
2012-03-28 04:14:09 +00:00
'theme_supports' => 'custom-background' ,
) );
2012-04-25 21:03:29 +00:00
$this -> add_control ( new WP_Customize_Color_Control ( $this , 'background_color' , array (
2012-03-28 04:14:09 +00:00
'label' => __ ( 'Background Color' ),
'section' => 'background' ,
2012-04-25 21:03:29 +00:00
) ) );
2012-03-15 04:14:05 +00:00
$this -> add_setting ( 'background_image' , array (
2012-03-24 01:02:29 +00:00
'default' => get_theme_support ( 'custom-background' , 'default-image' ),
2012-03-28 04:14:09 +00:00
'theme_supports' => 'custom-background' ,
) );
2012-04-25 21:03:29 +00:00
$this -> add_control ( new WP_Customize_Image_Control ( $this , 'background_image' , array (
2012-03-28 04:14:09 +00:00
'label' => __ ( 'Background Image' ),
'section' => 'background' ,
2012-03-29 06:35:54 +00:00
'context' => 'custom-background' ,
) ) );
2012-03-22 08:07:44 +00:00
$this -> add_setting ( 'background_repeat' , array (
2012-03-28 04:14:09 +00:00
'default' => 'repeat' ,
'theme_supports' => 'custom-background' ,
) );
$this -> add_control ( 'background_repeat' , array (
'label' => __ ( 'Background Repeat' ),
2012-03-22 08:07:44 +00:00
'section' => 'background' ,
2012-03-28 04:14:09 +00:00
'type' => 'radio' ,
2012-03-22 08:07:44 +00:00
'choices' => array (
'no-repeat' => __ ( 'No Repeat' ),
'repeat' => __ ( 'Tile' ),
'repeat-x' => __ ( 'Tile Horizontally' ),
'repeat-y' => __ ( 'Tile Vertically' ),
),
) );
$this -> add_setting ( 'background_position_x' , array (
2012-03-28 04:14:09 +00:00
'default' => 'left' ,
'theme_supports' => 'custom-background' ,
) );
$this -> add_control ( 'background_position_x' , array (
'label' => __ ( 'Background Position' ),
2012-03-22 08:07:44 +00:00
'section' => 'background' ,
2012-03-28 04:14:09 +00:00
'type' => 'radio' ,
2012-03-22 08:07:44 +00:00
'choices' => array (
'left' => __ ( 'Left' ),
'center' => __ ( 'Center' ),
'right' => __ ( 'Right' ),
),
) );
$this -> add_setting ( 'background_attachment' , array (
2012-03-28 04:14:09 +00:00
'default' => 'fixed' ,
'theme_supports' => 'custom-background' ,
) );
$this -> add_control ( 'background_attachment' , array (
'label' => __ ( 'Background Attachment' ),
2012-03-22 08:07:44 +00:00
'section' => 'background' ,
2012-03-28 04:14:09 +00:00
'type' => 'radio' ,
2012-03-22 08:07:44 +00:00
'choices' => array (
'fixed' => __ ( 'Fixed' ),
'scroll' => __ ( 'Scroll' ),
),
2012-02-25 04:12:43 +00:00
) );
2012-05-25 18:41:22 +00:00
// If the theme is using the default background callback, we can update
// the background CSS using postMessage.
if ( get_theme_support ( 'custom-background' , 'wp-head-callback' ) === '_custom_background_cb' ) {
foreach ( array ( 'color' , 'image' , 'position_x' , 'repeat' , 'attachment' ) as $prop ) {
$this -> get_setting ( 'background_' . $prop ) -> transport = 'postMessage' ;
}
}
2012-02-25 04:12:43 +00:00
/* Nav Menus */
$locations = get_registered_nav_menus ();
$menus = wp_get_nav_menus ();
$menu_locations = get_nav_menu_locations ();
$num_locations = count ( array_keys ( $locations ) );
$this -> add_section ( 'nav' , array (
'title' => __ ( 'Navigation' ),
'theme_supports' => 'menus' ,
2012-03-28 09:57:55 +00:00
'priority' => 40 ,
2012-04-23 23:03:09 +00:00
'description' => sprintf ( _n ( 'Your theme supports %s menu. Select which menu you would like to use.' , 'Your theme supports %s menus. Select which menu appears in each location.' , $num_locations ), number_format_i18n ( $num_locations ) ) . " \n \n " . __ ( 'You can edit your menu content on the Menus screen in the Appearance section.' ),
2012-02-25 04:12:43 +00:00
) );
2012-04-23 23:03:09 +00:00
if ( $menus ) {
$choices = array ( 0 => __ ( '— Select —' ) );
2012-02-25 04:12:43 +00:00
foreach ( $menus as $menu ) {
$truncated_name = wp_html_excerpt ( $menu -> name , 40 );
2012-04-23 23:03:09 +00:00
$truncated_name = ( $truncated_name == $menu -> name ) ? $menu -> name : trim ( $truncated_name ) . '…' ;
2012-02-25 04:12:43 +00:00
$choices [ $menu -> term_id ] = $truncated_name ;
}
2012-04-23 23:03:09 +00:00
foreach ( $locations as $location => $description ) {
$menu_setting_id = " nav_menu_locations[ { $location } ] " ;
2012-03-28 04:14:09 +00:00
2012-04-23 23:03:09 +00:00
$this -> add_setting ( $menu_setting_id , array (
'sanitize_callback' => 'absint' ,
'theme_supports' => 'menus' ,
) );
2012-03-28 04:14:09 +00:00
2012-04-23 23:03:09 +00:00
$this -> add_control ( $menu_setting_id , array (
'label' => $description ,
'section' => 'nav' ,
'type' => 'select' ,
'choices' => $choices ,
) );
}
2012-02-25 04:12:43 +00:00
}
/* Static Front Page */
// #WP19627
$this -> add_section ( 'static_front_page' , array (
'title' => __ ( 'Static Front Page' ),
// 'theme_supports' => 'static-front-page',
2012-03-28 09:57:55 +00:00
'priority' => 50 ,
2012-02-25 04:12:43 +00:00
'description' => __ ( 'Your theme supports a static front page.' ),
) );
$this -> add_setting ( 'show_on_front' , array (
'default' => get_option ( 'show_on_front' ),
2012-03-22 07:17:26 +00:00
'capability' => 'manage_options' ,
2012-03-28 04:14:09 +00:00
'type' => 'option' ,
// 'theme_supports' => 'static-front-page',
) );
$this -> add_control ( 'show_on_front' , array (
'label' => __ ( 'Front page displays' ),
'section' => 'static_front_page' ,
'type' => 'radio' ,
2012-04-07 00:18:02 +00:00
'choices' => array (
'posts' => __ ( 'Your latest posts' ),
'page' => __ ( 'A static page' ),
),
2012-02-25 04:12:43 +00:00
) );
$this -> add_setting ( 'page_on_front' , array (
2012-03-28 04:14:09 +00:00
'type' => 'option' ,
'capability' => 'manage_options' ,
2012-02-25 04:12:43 +00:00
// 'theme_supports' => 'static-front-page',
2012-03-28 04:14:09 +00:00
) );
$this -> add_control ( 'page_on_front' , array (
'label' => __ ( 'Front page' ),
'section' => 'static_front_page' ,
'type' => 'dropdown-pages' ,
2012-02-25 04:12:43 +00:00
) );
$this -> add_setting ( 'page_for_posts' , array (
'type' => 'option' ,
2012-03-22 07:17:26 +00:00
'capability' => 'manage_options' ,
2012-03-28 04:14:09 +00:00
// 'theme_supports' => 'static-front-page',
) );
$this -> add_control ( 'page_for_posts' , array (
'label' => __ ( 'Posts page' ),
'section' => 'static_front_page' ,
'type' => 'dropdown-pages' ,
2012-02-25 04:12:43 +00:00
) );
/* Site Title & Tagline */
$this -> add_section ( 'strings' , array (
2012-03-28 09:57:55 +00:00
'title' => __ ( 'Site Title & Tagline' ),
'priority' => 5 ,
2012-02-25 04:12:43 +00:00
) );
$this -> add_setting ( 'blogname' , array (
2012-03-28 04:14:09 +00:00
'default' => get_option ( 'blogname' ),
'type' => 'option' ,
'capability' => 'manage_options' ,
) );
$this -> add_control ( 'blogname' , array (
'label' => __ ( 'Site Title' ),
'section' => 'strings' ,
2012-02-25 04:12:43 +00:00
) );
$this -> add_setting ( 'blogdescription' , array (
2012-03-28 04:14:09 +00:00
'default' => get_option ( 'blogdescription' ),
'type' => 'option' ,
'capability' => 'manage_options' ,
) );
$this -> add_control ( 'blogdescription' , array (
'label' => __ ( 'Tagline' ),
'section' => 'strings' ,
2012-02-25 04:12:43 +00:00
) );
}
};
2012-05-23 15:36:27 +00:00
// Callback function for sanitizing the header textcolor setting.
function sanitize_header_textcolor ( $color ) {
2012-05-25 18:54:57 +00:00
if ( $color == 'blank' )
2012-05-23 15:36:27 +00:00
return 'blank' ;
return sanitize_hexcolor ( $color );
}
2012-02-25 04:12:43 +00:00
// Callback function for sanitizing a hex color
function sanitize_hexcolor ( $color ) {
$color = preg_replace ( '/[^0-9a-fA-F]/' , '' , $color );
2012-05-25 18:54:57 +00:00
// 3 or 6 hex digits.
if ( preg_match ( '|^([A-Fa-f0-9]{3}){1,2}$|' , $color ) )
2012-02-25 04:12:43 +00:00
return $color ;
2012-05-25 18:54:57 +00:00
return null ;
2012-05-23 17:56:42 +00:00
}