204 public function preview() { |
204 public function preview() { |
205 if ( $this->is_previewed ) { |
205 if ( $this->is_previewed ) { |
206 return false; |
206 return false; |
207 } |
207 } |
208 |
208 |
209 $undefined = new stdClass(); |
209 $undefined = new stdClass(); |
210 $is_placeholder = ( $this->term_id < 0 ); |
210 $is_placeholder = ( $this->term_id < 0 ); |
211 $is_dirty = ( $undefined !== $this->post_value( $undefined ) ); |
211 $is_dirty = ( $undefined !== $this->post_value( $undefined ) ); |
212 if ( ! $is_placeholder && ! $is_dirty ) { |
212 if ( ! $is_placeholder && ! $is_dirty ) { |
213 return false; |
213 return false; |
214 } |
214 } |
215 |
215 |
216 $this->is_previewed = true; |
216 $this->is_previewed = true; |
230 * |
230 * |
231 * @since 4.3.0 |
231 * @since 4.3.0 |
232 * |
232 * |
233 * @see wp_get_nav_menus() |
233 * @see wp_get_nav_menus() |
234 * |
234 * |
235 * @param array $menus An array of menu objects. |
235 * @param WP_Term[] $menus An array of menu objects. |
236 * @param array $args An array of arguments used to retrieve menu objects. |
236 * @param array $args An array of arguments used to retrieve menu objects. |
237 * @return array |
237 * @return WP_Term[] Array of menu objects. |
238 */ |
238 */ |
239 public function filter_wp_get_nav_menus( $menus, $args ) { |
239 public function filter_wp_get_nav_menus( $menus, $args ) { |
240 if ( get_current_blog_id() !== $this->_previewed_blog_id ) { |
240 if ( get_current_blog_id() !== $this->_previewed_blog_id ) { |
241 return $menus; |
241 return $menus; |
242 } |
242 } |
243 |
243 |
244 $setting_value = $this->value(); |
244 $setting_value = $this->value(); |
245 $is_delete = ( false === $setting_value ); |
245 $is_delete = ( false === $setting_value ); |
246 $index = -1; |
246 $index = -1; |
247 |
247 |
248 // Find the existing menu item's position in the list. |
248 // Find the existing menu item's position in the list. |
249 foreach ( $menus as $i => $menu ) { |
249 foreach ( $menus as $i => $menu ) { |
250 if ( (int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id ) { |
250 if ( (int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id ) { |
251 $index = $i; |
251 $index = $i; |
258 if ( -1 !== $index ) { |
258 if ( -1 !== $index ) { |
259 array_splice( $menus, $index, 1 ); |
259 array_splice( $menus, $index, 1 ); |
260 } |
260 } |
261 } else { |
261 } else { |
262 // Handle menus being updated or inserted. |
262 // Handle menus being updated or inserted. |
263 $menu_obj = (object) array_merge( array( |
263 $menu_obj = (object) array_merge( |
264 'term_id' => $this->term_id, |
264 array( |
265 'term_taxonomy_id' => $this->term_id, |
265 'term_id' => $this->term_id, |
266 'slug' => sanitize_title( $setting_value['name'] ), |
266 'term_taxonomy_id' => $this->term_id, |
267 'count' => 0, |
267 'slug' => sanitize_title( $setting_value['name'] ), |
268 'term_group' => 0, |
268 'count' => 0, |
269 'taxonomy' => self::TAXONOMY, |
269 'term_group' => 0, |
270 'filter' => 'raw', |
270 'taxonomy' => self::TAXONOMY, |
271 ), $setting_value ); |
271 'filter' => 'raw', |
|
272 ), |
|
273 $setting_value |
|
274 ); |
272 |
275 |
273 array_splice( $menus, $index, ( -1 === $index ? 0 : 1 ), array( $menu_obj ) ); |
276 array_splice( $menus, $index, ( -1 === $index ? 0 : 1 ), array( $menu_obj ) ); |
274 } |
277 } |
275 |
278 |
276 // Make sure the menu objects get re-sorted after an update/insert. |
279 // Make sure the menu objects get re-sorted after an update/insert. |
277 if ( ! $is_delete && ! empty( $args['orderby'] ) ) { |
280 if ( ! $is_delete && ! empty( $args['orderby'] ) ) { |
278 $menus = wp_list_sort( $menus, array( |
281 $menus = wp_list_sort( |
279 $args['orderby'] => 'ASC', |
282 $menus, |
280 ) ); |
283 array( |
|
284 $args['orderby'] => 'ASC', |
|
285 ) |
|
286 ); |
281 } |
287 } |
282 // @todo add support for $args['hide_empty'] === true |
288 // @todo add support for $args['hide_empty'] === true |
283 |
289 |
284 return $menus; |
290 return $menus; |
285 } |
291 } |
351 // Handle sanitization failure by preventing short-circuiting. |
357 // Handle sanitization failure by preventing short-circuiting. |
352 if ( null === $setting_value ) { |
358 if ( null === $setting_value ) { |
353 return $menu_obj; |
359 return $menu_obj; |
354 } |
360 } |
355 |
361 |
356 $menu_obj = (object) array_merge( array( |
362 $menu_obj = (object) array_merge( |
|
363 array( |
357 'term_id' => $this->term_id, |
364 'term_id' => $this->term_id, |
358 'term_taxonomy_id' => $this->term_id, |
365 'term_taxonomy_id' => $this->term_id, |
359 'slug' => sanitize_title( $setting_value['name'] ), |
366 'slug' => sanitize_title( $setting_value['name'] ), |
360 'count' => 0, |
367 'count' => 0, |
361 'term_group' => 0, |
368 'term_group' => 0, |
362 'taxonomy' => self::TAXONOMY, |
369 'taxonomy' => self::TAXONOMY, |
363 'filter' => 'raw', |
370 'filter' => 'raw', |
364 ), $setting_value ); |
371 ), |
|
372 $setting_value |
|
373 ); |
365 |
374 |
366 return $menu_obj; |
375 return $menu_obj; |
367 } |
376 } |
368 |
377 |
369 /** |
378 /** |
377 public function filter_nav_menu_options( $nav_menu_options ) { |
386 public function filter_nav_menu_options( $nav_menu_options ) { |
378 if ( $this->_previewed_blog_id !== get_current_blog_id() ) { |
387 if ( $this->_previewed_blog_id !== get_current_blog_id() ) { |
379 return $nav_menu_options; |
388 return $nav_menu_options; |
380 } |
389 } |
381 |
390 |
382 $menu = $this->value(); |
391 $menu = $this->value(); |
383 $nav_menu_options = $this->filter_nav_menu_options_value( |
392 $nav_menu_options = $this->filter_nav_menu_options_value( |
384 $nav_menu_options, |
393 $nav_menu_options, |
385 $this->term_id, |
394 $this->term_id, |
386 false === $menu ? false : $menu['auto_add'] |
395 false === $menu ? false : $menu['auto_add'] |
387 ); |
396 ); |
416 'name' => '', |
425 'name' => '', |
417 'description' => '', |
426 'description' => '', |
418 'parent' => 0, |
427 'parent' => 0, |
419 'auto_add' => false, |
428 'auto_add' => false, |
420 ); |
429 ); |
421 $value = array_merge( $default, $value ); |
430 $value = array_merge( $default, $value ); |
422 $value = wp_array_slice_assoc( $value, array_keys( $default ) ); |
431 $value = wp_array_slice_assoc( $value, array_keys( $default ) ); |
423 |
432 |
424 $value['name'] = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php. |
433 $value['name'] = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php. |
425 $value['description'] = sanitize_text_field( $value['description'] ); |
434 $value['description'] = sanitize_text_field( $value['description'] ); |
426 $value['parent'] = max( 0, intval( $value['parent'] ) ); |
435 $value['parent'] = max( 0, intval( $value['parent'] ) ); |
427 $value['auto_add'] = ! empty( $value['auto_add'] ); |
436 $value['auto_add'] = ! empty( $value['auto_add'] ); |
492 if ( is_wp_error( $r ) ) { |
501 if ( is_wp_error( $r ) ) { |
493 $this->update_status = 'error'; |
502 $this->update_status = 'error'; |
494 $this->update_error = $r; |
503 $this->update_error = $r; |
495 } else { |
504 } else { |
496 $this->update_status = 'deleted'; |
505 $this->update_status = 'deleted'; |
497 $auto_add = false; |
506 $auto_add = false; |
498 } |
507 } |
499 } |
508 } |
500 } else { |
509 } else { |
501 // Insert or update menu. |
510 // Insert or update menu. |
502 $menu_data = wp_array_slice_assoc( $value, array( 'description', 'parent' ) ); |
511 $menu_data = wp_array_slice_assoc( $value, array( 'description', 'parent' ) ); |
503 $menu_data['menu-name'] = $value['name']; |
512 $menu_data['menu-name'] = $value['name']; |
504 |
513 |
505 $menu_id = $is_placeholder ? 0 : $this->term_id; |
514 $menu_id = $is_placeholder ? 0 : $this->term_id; |
506 $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); |
515 $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); |
507 $original_name = $menu_data['menu-name']; |
516 $original_name = $menu_data['menu-name']; |
508 $name_conflict_suffix = 1; |
517 $name_conflict_suffix = 1; |
509 while ( is_wp_error( $r ) && 'menu_exists' === $r->get_error_code() ) { |
518 while ( is_wp_error( $r ) && 'menu_exists' === $r->get_error_code() ) { |
510 $name_conflict_suffix += 1; |
519 $name_conflict_suffix += 1; |
511 /* translators: 1: original menu name, 2: duplicate count */ |
520 /* translators: 1: original menu name, 2: duplicate count */ |
512 $menu_data['menu-name'] = sprintf( __( '%1$s (%2$d)' ), $original_name, $name_conflict_suffix ); |
521 $menu_data['menu-name'] = sprintf( __( '%1$s (%2$d)' ), $original_name, $name_conflict_suffix ); |
513 $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); |
522 $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); |
514 } |
523 } |
515 |
524 |
516 if ( is_wp_error( $r ) ) { |
525 if ( is_wp_error( $r ) ) { |
517 $this->update_status = 'error'; |
526 $this->update_status = 'error'; |
518 $this->update_error = $r; |
527 $this->update_error = $r; |
563 if ( empty( $widget_instance['nav_menu'] ) || intval( $widget_instance['nav_menu'] ) !== $this->previous_term_id ) { |
572 if ( empty( $widget_instance['nav_menu'] ) || intval( $widget_instance['nav_menu'] ) !== $this->previous_term_id ) { |
564 continue; |
573 continue; |
565 } |
574 } |
566 |
575 |
567 $widget_instance['nav_menu'] = $this->term_id; |
576 $widget_instance['nav_menu'] = $this->term_id; |
568 $updated_widget_instance = $this->manager->widgets->sanitize_widget_js_instance( $widget_instance ); |
577 $updated_widget_instance = $this->manager->widgets->sanitize_widget_js_instance( $widget_instance ); |
569 $this->manager->set_post_value( $nav_menu_widget_setting->id, $updated_widget_instance ); |
578 $this->manager->set_post_value( $nav_menu_widget_setting->id, $updated_widget_instance ); |
570 $nav_menu_widget_setting->save(); |
579 $nav_menu_widget_setting->save(); |
571 |
580 |
572 $this->_widget_nav_menu_updates[ $nav_menu_widget_setting->id ] = $updated_widget_instance; |
581 $this->_widget_nav_menu_updates[ $nav_menu_widget_setting->id ] = $updated_widget_instance; |
573 } |
582 } |