2012-02-25 05:12:43 +01:00
< ? php
/**
2014-03-04 21:21:14 +01:00
* Theme Customize Screen .
2012-02-25 05:12:43 +01:00
*
* @ package WordPress
* @ subpackage Customize
* @ since 3.4 . 0
*/
2012-06-26 20:48:18 +02:00
define ( 'IFRAME_REQUEST' , true );
2014-03-04 21:21:14 +01:00
/** Load WordPress Administration Bootstrap */
2013-09-25 02:18:11 +02:00
require_once ( dirname ( __FILE__ ) . '/admin.php' );
2014-03-04 21:21:14 +01:00
2014-07-14 21:01:16 +02:00
if ( ! current_user_can ( 'customize' ) ) {
2012-05-23 23:00:02 +02:00
wp_die ( __ ( 'Cheatin’ uh?' ) );
2014-07-08 19:15:14 +02:00
}
2012-02-25 05:12:43 +01:00
2012-06-08 20:45:12 +02:00
wp_reset_vars ( array ( 'url' , 'return' ) );
2014-07-08 19:15:14 +02:00
$url = wp_unslash ( $url );
2012-06-08 20:45:12 +02:00
$url = wp_validate_redirect ( $url , home_url ( '/' ) );
2014-07-08 19:15:14 +02:00
if ( $return ) {
$return = wp_unslash ( $return );
$return = wp_validate_redirect ( $return );
}
if ( ! $return ) {
2014-07-14 21:01:16 +02:00
if ( $url ) {
$return = $url ;
} elseif ( current_user_can ( 'edit_theme_options' ) || current_user_can ( 'switch_themes' ) ) {
$return = admin_url ( 'themes.php' );
} else {
$return = admin_url ();
}
2014-07-08 19:15:14 +02:00
}
2012-06-08 20:45:12 +02:00
2012-05-23 19:56:42 +02:00
global $wp_scripts , $wp_customize ;
2012-02-25 05:12:43 +01:00
$registered = $wp_scripts -> registered ;
$wp_scripts = new WP_Scripts ;
$wp_scripts -> registered = $registered ;
add_action ( 'customize_controls_print_scripts' , 'print_head_scripts' , 20 );
add_action ( 'customize_controls_print_footer_scripts' , '_wp_footer_scripts' );
add_action ( 'customize_controls_print_styles' , 'print_admin_styles' , 20 );
2013-10-25 00:53:23 +02:00
/**
* Fires when Customizer controls are initialized , before scripts are enqueued .
*
* @ since 3.4 . 0
*/
2012-02-25 05:12:43 +01:00
do_action ( 'customize_controls_init' );
wp_enqueue_script ( 'customize-controls' );
wp_enqueue_style ( 'customize-controls' );
2013-10-25 00:53:23 +02:00
/**
2013-10-25 00:57:50 +02:00
* Enqueue Customizer control scripts .
2013-10-25 00:53:23 +02:00
*
* @ since 3.4 . 0
*/
2012-02-25 05:12:43 +01:00
do_action ( 'customize_controls_enqueue_scripts' );
// Let's roll.
@ header ( 'Content-Type: ' . get_option ( 'html_type' ) . '; charset=' . get_option ( 'blog_charset' ));
wp_user_settings ();
_wp_admin_html_begin ();
2013-11-11 18:39:09 +01:00
$body_class = 'wp-core-ui wp-customizer js' ;
2012-06-06 23:45:17 +02:00
if ( wp_is_mobile () ) :
$body_class .= ' mobile' ;
2014-05-18 23:36:15 +02:00
?> <meta name="viewport" id="viewport-meta" content="width=device-width, initial-scale=0.8, minimum-scale=0.5, maximum-scale=1.2" /><?php
2012-06-06 23:45:17 +02:00
endif ;
$is_ios = wp_is_mobile () && preg_match ( '/iPad|iPod|iPhone/' , $_SERVER [ 'HTTP_USER_AGENT' ] );
if ( $is_ios )
$body_class .= ' ios' ;
2012-11-08 23:01:06 +01:00
if ( is_rtl () )
$body_class .= ' rtl' ;
$body_class .= ' locale-' . sanitize_html_class ( strtolower ( str_replace ( '_' , '-' , get_locale () ) ) );
2012-05-23 19:56:42 +02:00
$admin_title = sprintf ( __ ( '%1$s — WordPress' ), strip_tags ( sprintf ( __ ( 'Customize %s' ), $wp_customize -> theme () -> display ( 'Name' ) ) ) );
2013-11-11 16:47:09 +01:00
?> <title><?php echo $admin_title; ?></title>
2012-02-25 05:12:43 +01:00
2013-11-11 16:47:09 +01:00
< script type = " text/javascript " >
var ajaxurl = '<?php echo admin_url( ' admin - ajax . php ', ' relative ' ); ?>' ;
</ script >
< ? php
2013-10-25 00:53:23 +02:00
/**
2014-03-25 09:05:15 +01:00
* Fires when Customizer control styles are printed .
2013-10-25 00:53:23 +02:00
*
* @ since 3.4 . 0
*/
2012-02-25 05:12:43 +01:00
do_action ( 'customize_controls_print_styles' );
2013-10-25 00:53:23 +02:00
/**
2014-03-25 09:05:15 +01:00
* Fires when Customizer control scripts are printed .
2013-10-25 00:53:23 +02:00
*
* @ since 3.4 . 0
*/
2012-02-25 05:12:43 +01:00
do_action ( 'customize_controls_print_scripts' );
?>
</ head >
2012-06-06 23:45:17 +02:00
< body class = " <?php echo esc_attr( $body_class ); ?> " >
< div class = " wp-full-overlay expanded " >
2012-04-30 17:46:17 +02:00
< form id = " customize-controls " class = " wrap wp-full-overlay-sidebar " >
2012-11-17 16:11:29 +01:00
2012-05-15 03:03:31 +02:00
< div id = " customize-header-actions " class = " wp-full-overlay-header " >
2012-05-24 05:29:51 +02:00
< ? php
2012-05-24 16:44:13 +02:00
$save_text = $wp_customize -> is_theme_active () ? __ ( 'Save & Publish' ) : __ ( 'Save & Activate' );
2012-11-06 15:47:25 +01:00
submit_button ( $save_text , 'primary save' , 'save' , false );
2012-05-24 05:29:51 +02:00
?>
2012-09-26 21:57:44 +02:00
< span class = " spinner " ></ span >
2014-07-14 21:01:16 +02:00
< a class = " customize-controls-close " href = " <?php echo esc_url( $return ); ?> " >
2014-07-08 20:19:14 +02:00
< span class = " screen-reader-text " >< ? php _e ( 'Cancel' ); ?> </span>
2012-04-16 16:02:28 +02:00
</ a >
2014-08-26 01:05:15 +02:00
< span class = " control-panel-back " tabindex = " -1 " >< span class = " screen-reader-text " >< ? php _e ( 'Back' ); ?> </span></span>
2012-04-16 16:02:28 +02:00
</ div >
2012-11-17 16:11:29 +01:00
2012-05-26 22:47:55 +02:00
< ? php
$screenshot = $wp_customize -> theme () -> get_screenshot ();
2014-07-08 21:53:15 +02:00
$cannot_expand = ! ( $wp_customize -> is_theme_active () || $screenshot || $wp_customize -> theme () -> get ( 'Description' ) );
2012-05-26 22:47:55 +02:00
?>
2014-10-15 19:21:19 +02:00
< div id = " widgets-right " ><!-- For Widget Customizer , many widgets try to look for instances under div #widgets-right, so we have to add that ID to a container div in the Customizer for compat -->
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
< div class = " wp-full-overlay-sidebar-content " tabindex = " -1 " >
2013-07-18 19:42:53 +02:00
< div id = " customize-info " class = " accordion-section <?php if ( $cannot_expand ) echo ' cannot-expand'; ?> " >
2014-10-15 19:21:19 +02:00
< div class = " accordion-section-title " aria - label = " <?php esc_attr_e( 'Customizer Options' ); ?> " tabindex = " 0 " >
2012-05-30 18:57:44 +02:00
< span class = " preview-notice " >< ? php
2014-07-08 21:53:15 +02:00
if ( ! $wp_customize -> is_theme_active () ) {
/* translators: %s is the theme name in the Customize/Live Preview pane */
echo sprintf ( __ ( 'You are previewing %s' ), '<strong class="theme-name">' . $wp_customize -> theme () -> display ( 'Name' ) . '</strong>' );
} else {
2014-07-13 17:12:15 +02:00
/* translators: %s is the site/panel title in the Customize pane */
2014-07-08 21:53:15 +02:00
echo sprintf ( __ ( 'You are customizing %s' ), '<strong class="theme-name site-title">' . get_bloginfo ( 'name' ) . '</strong>' );
}
2012-05-30 18:57:44 +02:00
?> </span>
2012-05-15 03:03:31 +02:00
</ div >
2012-05-26 22:47:55 +02:00
< ? php if ( ! $cannot_expand ) : ?>
2013-02-14 23:58:04 +01:00
< div class = " accordion-section-content " >
2014-07-08 21:53:15 +02:00
< ? php if ( ! $wp_customize -> is_theme_active () ) :
if ( $screenshot ) : ?>
< img class = " theme-screenshot " src = " <?php echo esc_url( $screenshot ); ?> " />
< ? php endif ; ?>
< ? php if ( $wp_customize -> theme () -> get ( 'Description' ) ) : ?>
< div class = " theme-description " >< ? php echo $wp_customize -> theme () -> display ( 'Description' ); ?> </div>
< ? php endif ;
else :
echo __ ( 'The Customizer allows you to preview changes to your site before publishing them. You can also navigate to different pages on your site to preview them.' );
endif ; ?>
2012-05-15 03:03:31 +02:00
</ div >
2012-05-26 22:47:55 +02:00
< ? php endif ; ?>
2012-03-04 03:06:11 +01:00
</ div >
2012-02-25 05:12:43 +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
< div id = " customize-theme-controls " >
< ul >< ? php // Panels and sections are managed here via JavaScript ?></ul>
</ div >
2012-05-15 03:03:31 +02:00
</ div >
2014-04-02 19:04:14 +02:00
</ div >
2012-02-25 05:12:43 +01:00
2012-05-15 03:03:31 +02:00
< div id = " customize-footer-actions " class = " wp-full-overlay-footer " >
2012-04-16 16:02:28 +02:00
< a href = " # " class = " collapse-sidebar button-secondary " title = " <?php esc_attr_e('Collapse Sidebar'); ?> " >
< span class = " collapse-sidebar-arrow " ></ span >
2012-06-05 22:57:02 +02:00
< span class = " collapse-sidebar-label " >< ? php _e ( 'Collapse' ); ?> </span>
2012-04-16 16:02:28 +02:00
</ a >
2012-02-25 05:12:43 +01:00
</ div >
</ form >
2012-04-30 17:46:17 +02:00
< div id = " customize-preview " class = " wp-full-overlay-main " ></ div >
2012-02-25 05:12:43 +01:00
< ? php
2014-10-24 18:32:18 +02:00
// Render control templates.
$wp_customize -> render_control_templates ();
2013-10-25 00:53:23 +02:00
/**
2013-10-25 00:57:50 +02:00
* Print Customizer control scripts in the footer .
2013-10-25 00:53:23 +02:00
*
* @ since 3.4 . 0
*/
2012-02-25 05:12:43 +01:00
do_action ( 'customize_controls_print_footer_scripts' );
2014-07-17 11:14:16 +02:00
/*
* If the frontend and the admin are served from the same domain , load the
2014-10-15 19:21:19 +02:00
* preview over ssl if the Customizer is being loaded over ssl . This avoids
2014-07-17 11:14:16 +02:00
* insecure content warnings . This is not attempted if the admin and frontend
* are on different domains to avoid the case where the frontend doesn ' t have
* ssl certs . Domain mapping plugins can allow other urls in these conditions
* using the customize_allowed_urls filter .
*/
2012-05-24 21:17:49 +02:00
$allowed_urls = array ( home_url ( '/' ) );
2012-05-18 22:09:53 +02:00
$admin_origin = parse_url ( admin_url () );
2012-05-24 21:17:49 +02:00
$home_origin = parse_url ( home_url () );
2012-05-24 23:13:21 +02:00
$cross_domain = ( strtolower ( $admin_origin [ 'host' ] ) != strtolower ( $home_origin [ 'host' ] ) );
2012-05-24 21:17:49 +02:00
2012-05-24 23:13:21 +02:00
if ( is_ssl () && ! $cross_domain )
2012-05-24 21:17:49 +02:00
$allowed_urls [] = home_url ( '/' , 'https' );
2012-05-18 22:09:53 +02:00
2013-10-25 00:57:50 +02:00
/**
* Filter the list of URLs allowed to be clicked and followed in the Customizer preview .
*
* @ since 3.4 . 0
*
* @ param array $allowed_urls An array of allowed URLs .
*/
2012-05-24 21:17:49 +02:00
$allowed_urls = array_unique ( apply_filters ( 'customize_allowed_urls' , $allowed_urls ) );
2012-05-18 22:09:53 +02:00
2012-05-24 23:13:21 +02:00
$fallback_url = add_query_arg ( array (
'preview' => 1 ,
'template' => $wp_customize -> get_template (),
'stylesheet' => $wp_customize -> get_stylesheet (),
'preview_iframe' => true ,
'TB_iframe' => 'true'
), home_url ( '/' ) );
2012-06-08 21:22:11 +02:00
$login_url = add_query_arg ( array (
'interim-login' => 1 ,
'customize-login' => 1
), wp_login_url () );
2014-10-15 19:21:19 +02:00
// Prepare Customizer settings to pass to Javascript.
2012-02-25 05:12:43 +01:00
$settings = array (
2012-05-16 07:55:54 +02:00
'theme' => array (
2012-05-23 19:56:42 +02:00
'stylesheet' => $wp_customize -> get_stylesheet (),
'active' => $wp_customize -> is_theme_active (),
2012-05-16 07:55:54 +02:00
),
'url' => array (
2014-03-17 23:16:15 +01:00
'preview' => esc_url_raw ( $url ? $url : home_url ( '/' ) ),
'parent' => esc_url_raw ( admin_url () ),
'activated' => esc_url_raw ( admin_url ( 'themes.php?activated=true&previewed' ) ),
'ajax' => esc_url_raw ( admin_url ( 'admin-ajax.php' , 'relative' ) ),
'allowed' => array_map ( 'esc_url_raw' , $allowed_urls ),
2012-05-24 23:13:21 +02:00
'isCrossDomain' => $cross_domain ,
2014-03-17 23:16:15 +01:00
'fallback' => esc_url_raw ( $fallback_url ),
'home' => esc_url_raw ( home_url ( '/' ) ),
'login' => esc_url_raw ( $login_url ),
2012-05-16 07:55:54 +02:00
),
2012-06-06 23:45:17 +02:00
'browser' => array (
'mobile' => wp_is_mobile (),
'ios' => $is_ios ,
),
2012-03-28 06:14:09 +02:00
'settings' => array (),
2012-03-06 23:48:07 +01:00
'controls' => array (),
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
'panels' => array (),
'sections' => array (),
2012-06-26 20:48:18 +02:00
'nonce' => array (
2014-03-17 23:16:15 +01:00
'save' => wp_create_nonce ( 'save-customize_' . $wp_customize -> get_stylesheet () ),
'preview' => wp_create_nonce ( 'preview-customize_' . $wp_customize -> get_stylesheet () )
),
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
'autofocus' => array (),
2012-02-25 05:12:43 +01:00
);
2014-03-04 21:21:14 +01:00
// Prepare Customize Setting objects to pass to Javascript.
2012-05-23 19:56:42 +02:00
foreach ( $wp_customize -> settings () as $id => $setting ) {
2012-03-28 06:14:09 +02:00
$settings [ 'settings' ][ $id ] = array (
2012-05-16 22:59:02 +02:00
'value' => $setting -> js_value (),
2012-04-25 18:04:51 +02:00
'transport' => $setting -> transport ,
2012-03-06 23:48:07 +01:00
);
2012-03-28 06:14:09 +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
// Prepare Customize Control objects to pass to JavaScript.
2012-05-23 19:56:42 +02:00
foreach ( $wp_customize -> controls () as $id => $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
$settings [ 'controls' ][ $id ] = $control -> json ();
}
// Prepare Customize Section objects to pass to JavaScript.
foreach ( $wp_customize -> sections () as $id => $section ) {
$settings [ 'sections' ][ $id ] = $section -> json ();
}
// Prepare Customize Panel objects to pass to JavaScript.
foreach ( $wp_customize -> panels () as $id => $panel ) {
$settings [ 'panels' ][ $id ] = $panel -> json ();
foreach ( $panel -> sections as $section_id => $section ) {
$settings [ 'sections' ][ $section_id ] = $section -> json ();
}
}
// Pass to frontend the Customizer construct being deeplinked
2014-11-01 23:17:22 +01:00
if ( isset ( $_GET [ 'autofocus' ] ) ) {
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
$autofocus = wp_unslash ( $_GET [ 'autofocus' ] );
2014-11-01 23:17:22 +01:00
if ( is_array ( $autofocus ) ) {
foreach ( $autofocus as $type => $id ) {
if ( isset ( $settings [ $type . 's' ][ $id ] ) ) {
$settings [ 'autofocus' ][ $type ] = $id ;
}
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-02-25 05:12:43 +01:00
}
?>
< script type = " text/javascript " >
2014-10-28 19:35:19 +01:00
var _wpCustomizeSettings = < ? php echo wp_json_encode ( $settings ); ?> ;
2012-02-25 05:12:43 +01:00
</ script >
2012-06-06 23:45:17 +02:00
</ div >
2012-02-25 05:12:43 +01:00
</ body >
</ html >