diff --git src/wp-admin/js/customize-widgets.js src/wp-admin/js/customize-widgets.js
index f2782b9..47505dd 100644
|
|
|
722 | 722 | }, 250 ); |
723 | 723 | |
724 | 724 | // Trigger widget form update when hitting Enter within an input |
725 | | this.container.find( '.widget-content' ).on( 'keydown', 'input', function( e ) { |
| 725 | $widgetContent.on( 'keydown', 'input', function( e ) { |
726 | 726 | if ( 13 === e.which ) { // Enter |
727 | 727 | e.preventDefault(); |
728 | 728 | self.updateWidget( { ignoreActiveElement: true } ); |
diff --git src/wp-includes/class-wp-customize-widgets.php src/wp-includes/class-wp-customize-widgets.php
index 049cedd..42f88d0 100644
|
|
final class WP_Customize_Widgets { |
148 | 148 | |
149 | 149 | // Input from customizer preview. |
150 | 150 | if ( isset( $_POST['customized'] ) ) { |
151 | | $customized = json_decode( $this->get_post_value( 'customized' ), true ); |
| 151 | $this->_customized = json_decode( $this->get_post_value( 'customized' ), true ); |
152 | 152 | } else { // Input from ajax widget update request. |
153 | | $customized = array(); |
154 | | $id_base = $this->get_post_value( 'id_base' ); |
155 | | $widget_number = (int) $this->get_post_value( 'widget_number' ); |
156 | | $option_name = 'widget_' . $id_base; |
157 | | $customized[$option_name] = array(); |
158 | | if ( false !== $widget_number ) { |
| 153 | $this->_customized = array(); |
| 154 | $id_base = $this->get_post_value( 'id_base' ); |
| 155 | $widget_number = $this->get_post_value( 'widget_number', false ); |
| 156 | $option_name = 'widget_' . $id_base; |
| 157 | $this->_customized[ $option_name ] = array(); |
| 158 | if ( preg_match( '/^[0-9]+$/', $widget_number ) ) { |
159 | 159 | $option_name .= '[' . $widget_number . ']'; |
160 | | $customized[$option_name][$widget_number] = array(); |
| 160 | $this->_customized[ $option_name ][ $widget_number ] = array(); |
161 | 161 | } |
162 | 162 | } |
163 | 163 | |
… |
… |
final class WP_Customize_Widgets { |
171 | 171 | add_filter( $hook, $function ); |
172 | 172 | $this->_prepreview_added_filters[] = compact( 'hook', 'function' ); |
173 | 173 | |
174 | | foreach ( $customized as $setting_id => $value ) { |
175 | | if ( preg_match( '/^(widget_.+?)(\[(\d+)\])?$/', $setting_id, $matches ) ) { |
176 | | |
177 | | /* |
178 | | * @todo Replace the next two lines with the following once WordPress supports PHP 5.3. |
179 | | * |
180 | | * $self = $this; // not needed in PHP 5.4 |
181 | | * |
182 | | * $function = function ( $value ) use ( $self, $setting_id ) { |
183 | | * return $self->manager->widgets->prepreview_added_widget_instance( $value, $setting_id ); |
184 | | * }; |
185 | | */ |
186 | | $body = sprintf( 'global $wp_customize; return $wp_customize->widgets->prepreview_added_widget_instance( $value, %s );', var_export( $setting_id, true ) ); |
187 | | $function = create_function( '$value', $body ); |
188 | | |
| 174 | $function = array( $this, 'prepreview_added_widget_instance' ); |
| 175 | foreach ( $this->_customized as $setting_id => $value ) { |
| 176 | if ( preg_match( '/^(widget_.+?)(?:\[(\d+)\])?$/', $setting_id, $matches ) ) { |
189 | 177 | $option = $matches[1]; |
190 | 178 | |
191 | 179 | $hook = sprintf( 'option_%s', $option ); |
192 | | add_filter( $hook, $function ); |
193 | | $this->_prepreview_added_filters[] = compact( 'hook', 'function' ); |
| 180 | if ( ! has_filter( $hook, $function ) ) { |
| 181 | add_filter( $hook, $function ); |
| 182 | $this->_prepreview_added_filters[] = compact( 'hook', 'function' ); |
| 183 | } |
194 | 184 | |
195 | 185 | $hook = sprintf( 'default_option_%s', $option ); |
196 | | add_filter( $hook, $function ); |
197 | | $this->_prepreview_added_filters[] = compact( 'hook', 'function' ); |
| 186 | if ( ! has_filter( $hook, $function ) ) { |
| 187 | add_filter( $hook, $function ); |
| 188 | $this->_prepreview_added_filters[] = compact( 'hook', 'function' ); |
| 189 | } |
198 | 190 | |
199 | 191 | /* |
200 | 192 | * Make sure the option is registered so that the update_option() |
… |
… |
final class WP_Customize_Widgets { |
204 | 196 | add_option( $option, array() ); |
205 | 197 | } |
206 | 198 | } |
207 | | |
208 | | $this->_customized = $customized; |
209 | 199 | } |
210 | 200 | |
211 | 201 | /** |
… |
… |
final class WP_Customize_Widgets { |
225 | 215 | foreach ( $this->_customized as $setting_id => $value ) { |
226 | 216 | if ( preg_match( '/^sidebars_widgets\[(.+?)\]$/', $setting_id, $matches ) ) { |
227 | 217 | $sidebar_id = $matches[1]; |
228 | | $sidebars_widgets[$sidebar_id] = $value; |
| 218 | $sidebars_widgets[ $sidebar_id ] = $value; |
229 | 219 | } |
230 | 220 | } |
231 | 221 | return $sidebars_widgets; |
… |
… |
final class WP_Customize_Widgets { |
242 | 232 | * @since 3.9.0 |
243 | 233 | * @access public |
244 | 234 | * |
245 | | * @param array $instance Widget instance. |
246 | | * @param string $setting_id Widget setting ID. |
247 | | * @return array Parsed widget instance. |
| 235 | * @param array|bool|mixed $value Widget instance(s), false if open was empty. |
| 236 | * @return array|mixed Widget instance(s) with additions. |
248 | 237 | */ |
249 | | public function prepreview_added_widget_instance( $instance, $setting_id ) { |
250 | | if ( isset( $this->_customized[$setting_id] ) ) { |
| 238 | public function prepreview_added_widget_instance( $value = false ) { |
| 239 | if ( ! preg_match( '/^(?:default_)?option_(widget_(.+))/', current_filter(), $matches ) ) { |
| 240 | return $value; |
| 241 | } |
| 242 | $id_base = $matches[2]; |
| 243 | |
| 244 | foreach ( $this->_customized as $setting_id => $setting ) { |
251 | 245 | $parsed_setting_id = $this->parse_widget_setting_id( $setting_id ); |
252 | | $widget_number = $parsed_setting_id['number']; |
| 246 | if ( is_wp_error( $parsed_setting_id ) || $id_base !== $parsed_setting_id['id_base'] ) { |
| 247 | continue; |
| 248 | } |
| 249 | $widget_number = $parsed_setting_id['number']; |
253 | 250 | |
254 | | // Single widget. |
255 | 251 | if ( is_null( $widget_number ) ) { |
256 | | if ( false === $instance && empty( $value ) ) { |
257 | | $instance = array(); |
| 252 | // Single widget. |
| 253 | if ( false === $value ) { |
| 254 | $value = array(); |
258 | 255 | } |
259 | | } else if ( false === $instance || ! isset( $instance[$widget_number] ) ) { // Multi widget |
260 | | if ( empty( $instance ) ) { |
261 | | $instance = array( '_multiwidget' => 1 ); |
| 256 | } else { |
| 257 | // Multi widget. |
| 258 | if ( empty( $value ) ) { |
| 259 | $value = array( '_multiwidget' => 1 ); |
262 | 260 | } |
263 | | if ( ! isset( $instance[$widget_number] ) ) { |
264 | | $instance[$widget_number] = array(); |
| 261 | if ( ! isset( $value[ $widget_number ] ) ) { |
| 262 | $value[ $widget_number ] = array(); |
265 | 263 | } |
266 | 264 | } |
267 | 265 | } |
268 | | return $instance; |
| 266 | |
| 267 | return $value; |
269 | 268 | } |
270 | 269 | |
271 | 270 | /** |