return $this;
}
+ protected $_original_value;
+
/**
* Handle previewing the setting.
*
* @since 3.4.0
*/
public function preview() {
+ if ( ! isset( $this->_original_value ) ) {
+ $this->_original_value = $this->value();
+ }
+
switch( $this->type ) {
case 'theme_mod' :
add_filter( 'theme_mod_' . $this->id_data[ 'base' ], array( $this, '_preview_filter' ) );
default :
/**
- * Fires when the WP_Customize_Setting::preview() method is called for settings
+ * Fires when the {@see WP_Customize_Setting::preview()} method is called for settings
* not handled as theme_mods or options.
*
- * The dynamic portion of the hook name, $this->id, refers to the setting ID.
+ * The dynamic portion of the hook name, `$this->id`, refers to the setting ID.
*
* @since 3.4.0
*
- * @param WP_Customize_Setting $this WP_Customize_Setting instance.
+ * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.
+ */
+ do_action( "customize_preview_{$this->id}", $this );
+
+ /**
+ * Fires when the {@see WP_Customize_Setting::preview()} method is called for settings
+ * not handled as theme_mods or options.
+ *
+ * The dynamic portion of the hook name, `$this->type`, refers to the setting type.
+ *
+ * @since 4.1.0
+ *
+ * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.
*/
- do_action( 'customize_preview_' . $this->id, $this );
+ do_action( "customize_preview_{$this->type}", $this );
}
}
* @return mixed New or old value.
*/
public function _preview_filter( $original ) {
- return $this->multidimensional_replace( $original, $this->id_data[ 'keys' ], $this->post_value() );
+ $undefined = new stdClass(); // symbol hack
+ $post_value = $this->manager->post_value( $this, $undefined );
+ if ( $undefined === $post_value ) {
+ $value = $this->_original_value;
+ } else {
+ $value = $post_value;
+ }
+
+ return $this->multidimensional_replace( $original, $this->id_data['keys'], $value );
}
/**
*
* @since 3.4.0
*
- * @return bool False if cap check fails or value isn't set.
+ * @return false|null False if cap check fails or value isn't set.
*/
public final function save() {
$value = $this->post_value();
/**
* Fires when the WP_Customize_Setting::save() method is called.
*
- * The dynamic portion of the hook name, $this->id_data['base'] refers to
+ * The dynamic portion of the hook name, `$this->id_data['base']` refers to
* the base slug of the setting name.
*
* @since 3.4.0
*
- * @param WP_Customize_Setting $this WP_Customize_Setting instance.
+ * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.
*/
do_action( 'customize_save_' . $this->id_data[ 'base' ], $this );
default :
/**
- * Fires when the WP_Customize_Setting::update() method is called for settings
+ * Fires when the {@see WP_Customize_Setting::update()} method is called for settings
* not handled as theme_mods or options.
*
- * The dynamic portion of the hook name, $this->type, refers to the type of setting.
+ * The dynamic portion of the hook name, `$this->type`, refers to the type of setting.
*
* @since 3.4.0
*
* @since 3.4.0
*
* @param mixed $value The value to update.
- * @return mixed The result of saving the value.
+ * @return bool|null The result of saving the value.
*/
protected function _update_option( $value ) {
// Handle non-array option.
/**
* Filter a Customize setting value not handled as a theme_mod or option.
*
- * The dynamic portion of the hook name, $this->id_date['base'], refers to
+ * The dynamic portion of the hook name, `$this->id_date['base']`, refers to
* the base slug of the setting name.
*
* For settings handled as theme_mods or options, see those corresponding
/**
* Filter a Customize setting value for use in JavaScript.
*
- * The dynamic portion of the hook name, $this->id, refers to the setting ID.
+ * The dynamic portion of the hook name, `$this->id`, refers to the setting ID.
*
* @since 3.4.0
*
* @param mixed $value The setting value.
- * @param WP_Customize_Setting $this WP_Customize_Setting instance.
+ * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.
*/
$value = apply_filters( "customize_sanitize_js_{$this->id}", $this->value(), $this );
$node = &$node[ $key ];
}
- if ( $create && ! isset( $node[ $last ] ) )
- $node[ $last ] = array();
+ if ( $create ) {
+ if ( ! is_array( $node ) ) {
+ // account for an array overriding a string or object value
+ $node = array();
+ }
+ if ( ! isset( $node[ $last ] ) ) {
+ $node[ $last ] = array();
+ }
+ }
if ( ! isset( $node[ $last ] ) )
return;
*
* @param $root
* @param $keys
- * @param $default A default value which is used as a fallback. Default is null.
+ * @param mixed $default A default value which is used as a fallback. Default is null.
* @return mixed The requested value or the default value.
*/
final protected function multidimensional_get( $root, $keys, $default = null ) {
/**
* @since 3.4.0
- * @uses remove_theme_mod()
*
* @param $value
*/