* @return string
*/
function get_stylesheet_directory_uri() {
- $stylesheet = get_stylesheet();
+ $stylesheet = str_replace( '%2F', '/', rawurlencode( get_stylesheet() ) );
$theme_root_uri = get_theme_root_uri( $stylesheet );
$stylesheet_dir_uri = "$theme_root_uri/$stylesheet";
* @return string Template directory URI.
*/
function get_template_directory_uri() {
- $template = get_template();
+ $template = str_replace( '%2F', '/', rawurlencode( get_template() ) );
$theme_root_uri = get_theme_root_uri( $template );
$template_dir_uri = "$theme_root_uri/$template";
* @param string $stylesheet Stylesheet name
*/
function switch_theme( $stylesheet ) {
- global $wp_theme_directories, $sidebars_widgets;
+ global $wp_theme_directories, $wp_customize, $sidebars_widgets;
- if ( is_array( $sidebars_widgets ) )
- set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $sidebars_widgets ) );
+ $_sidebars_widgets = null;
+ if ( 'wp_ajax_customize_save' === current_action() ) {
+ $_sidebars_widgets = $wp_customize->post_value( $wp_customize->get_setting( 'old_sidebars_widgets_data' ) );
+ } elseif ( is_array( $sidebars_widgets ) ) {
+ $_sidebars_widgets = $sidebars_widgets;
+ }
+
+ if ( is_array( $_sidebars_widgets ) ) {
+ set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $_sidebars_widgets ) );
+ }
$old_theme = wp_get_theme();
$new_theme = wp_get_theme( $stylesheet );
update_option( 'current_theme', $new_name );
+ // Migrate from the old mods_{name} option to theme_mods_{slug}.
if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) {
$default_theme_mods = (array) get_option( 'mods_' . $new_name );
add_option( "theme_mods_$stylesheet", $default_theme_mods );
+ } else {
+ /*
+ * Since retrieve_widgets() is called when initializing the customizer theme,
+ * we need to to remove the theme mods to avoid overwriting changes made via
+ * the widget customizer when accessing wp-admin/widgets.php.
+ */
+ if ( 'wp_ajax_customize_save' === current_action() ) {
+ remove_theme_mod( 'sidebars_widgets' );
+ }
}
update_option( 'theme_switched', $old_theme->get_stylesheet() );
*/
function set_theme_mod( $name, $value ) {
$mods = get_theme_mods();
+ $old_value = isset( $mods[ $name ] ) ? $mods[ $name ] : false;
- $mods[ $name ] = $value;
+ /**
+ * Filter the theme mod value on save.
+ *
+ * The dynamic portion of the hook name, $name, refers to the key name of
+ * the modification array. For example, 'header_textcolor', 'header_image',
+ * and so on depending on the theme options.
+ *
+ * @since 3.9.0
+ *
+ * @param string $value The new value of the theme mod.
+ * @param string $old_value The current value of the theme mod.
+ */
+ $mods[ $name ] = apply_filters( "pre_set_theme_mod_$name", $value, $old_value );
$theme = get_option( 'stylesheet' );
update_option( "theme_mods_$theme", $mods );
return array();
foreach ( (array) $headers as $header ) {
- $url = esc_url_raw( $header->guid );
+ $url = esc_url_raw( wp_get_attachment_url( $header->ID ) );
$header_data = wp_get_attachment_metadata( $header->ID );
$header_index = basename($url);
$header_images[$header_index] = array();
* @since 3.0.0
*
* @param string|array $header The header string id (key of array) to remove, or an array thereof.
- * @return True on success, false on failure.
+ * @return bool|void A single header returns true on success, false on failure.
+ * There is currently no return value for multiple headers.
*/
function unregister_default_headers( $header ) {
global $_wp_default_headers;
// $color is the saved custom color.
// A default has to be specified in style.css. It will not be printed here.
- $color = get_theme_mod( 'background_color' );
+ $color = get_background_color();
+
+ if ( $color === get_theme_support( 'custom-background', 'default-color' ) ) {
+ $color = false;
+ }
if ( ! $background && ! $color )
return;
* The init hook may be too late for some features.
*
* @since 2.9.0
- * @param string $feature the feature being added
+ *
+ * @param string $feature The feature being added.
+ * @return void|bool False on failure, void otherwise.
*/
function add_theme_support( $feature ) {
global $_wp_theme_features;
case 'html5' :
// You can't just pass 'html5', you need to pass an array of types.
if ( empty( $args[0] ) ) {
+ // Build an array of types for back-compat.
$args = array( 0 => array( 'comment-list', 'comment-form', 'search-form' ) );
} elseif ( ! is_array( $args[0] ) ) {
_doing_it_wrong( "add_theme_support( 'html5' )", 'You need to pass an array of types.', '3.6.1' );
/**
* Gets the theme support arguments passed when registering that support
*
- * @since 3.1
+ * @since 3.1.0
+ *
* @param string $feature the feature to check
* @return array The array of extra arguments
*/
* Checks a theme's support for a given feature before loading the functions which implement it.
*
* @since 2.9.0
- * @param string $feature the feature being checked
- * @param string $include the file containing the functions that implement the feature
+ *
+ * @param string $feature The feature being checked.
+ * @param string $include Path to the file.
+ * @return bool True if the current theme supports the supplied feature, false otherwise.
*/
-function require_if_theme_supports( $feature, $include) {
- if ( current_theme_supports( $feature ) )
+function require_if_theme_supports( $feature, $include ) {
+ if ( current_theme_supports( $feature ) ) {
require ( $include );
+ return true;
+ }
+ return false;
}
/**
if ( $stylesheet = get_option( 'theme_switched' ) ) {
$old_theme = wp_get_theme( $stylesheet );
+ // Prevent retrieve_widgets() from running since Customizer already called it up front
+ if ( get_option( 'theme_switched_via_customizer' ) ) {
+ remove_action( 'after_switch_theme', '_wp_sidebars_changed' );
+ update_option( 'theme_switched_via_customizer', false );
+ }
+
if ( $old_theme->exists() ) {
/**
* Fires on the first WP load after a theme switch if the old theme still exists.
}());
</script>
<?php
-}
\ No newline at end of file
+}