wp/wp-includes/customize/class-wp-customize-nav-menu-setting.php
changeset 9 177826044cd9
parent 7 cf61fcea0001
child 16 a86126ab1dd4
equal deleted inserted replaced
8:c7c34916027a 9:177826044cd9
   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 			}
   631 
   640 
   632 		$data['widget_nav_menu_updates'] = array_merge(
   641 		$data['widget_nav_menu_updates'] = array_merge(
   633 			$data['widget_nav_menu_updates'],
   642 			$data['widget_nav_menu_updates'],
   634 			$this->_widget_nav_menu_updates
   643 			$this->_widget_nav_menu_updates
   635 		);
   644 		);
   636 		$this->_widget_nav_menu_updates = array();
   645 		$this->_widget_nav_menu_updates  = array();
   637 
   646 
   638 		return $data;
   647 		return $data;
   639 	}
   648 	}
   640 }
   649 }