+ if ( ! $this->is_current_blog_previewed() ) {
+ return $original;
+ }
+
+ $undefined = new stdClass(); // Symbol hack.
+ $post_value = $this->post_value( $undefined );
+ if ( $undefined !== $post_value ) {
+ $value = $post_value;
+ } else {
+ /*
+ * Note that we don't use $original here because preview() will
+ * not add the filter in the first place if it has an initial value
+ * and there is no post value.
+ */
+ $value = $this->default;
+ }
+ return $value;
+ }
+
+ /**
+ * Callback function to filter multidimensional theme mods and options.
+ *
+ * For all multidimensional settings of a given type, the preview filter for
+ * the first setting previewed will be used to apply the values for the others.
+ *
+ * @since 4.4.0
+ * @access private
+ *
+ * @see WP_Customize_Setting::$aggregated_multidimensionals
+ * @param mixed $original Original root value.
+ * @return mixed New or old value.
+ */
+ final public function _multidimensional_preview_filter( $original ) {
+ if ( ! $this->is_current_blog_previewed() ) {
+ return $original;
+ }
+
+ $id_base = $this->id_data['base'];
+
+ // If no settings have been previewed yet (which should not be the case, since $this is), just pass through the original value.
+ if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) {
+ return $original;
+ }
+
+ foreach ( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] as $previewed_setting ) {
+ // Skip applying previewed value for any settings that have already been applied.
+ if ( ! empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] ) ) {
+ continue;
+ }
+
+ // Do the replacements of the posted/default sub value into the root value.
+ $value = $previewed_setting->post_value( $previewed_setting->default );
+ $root = self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'];
+ $root = $previewed_setting->multidimensional_replace( $root, $previewed_setting->id_data['keys'], $value );
+ self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'] = $root;
+
+ // Mark this setting having been applied so that it will be skipped when the filter is called again.
+ self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] = true;
+ }
+
+ return self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'];