wp/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php
changeset 9 177826044cd9
parent 7 cf61fcea0001
child 16 a86126ab1dd4
equal deleted inserted replaced
8:c7c34916027a 9:177826044cd9
   231 			// Note that a ID of less than one indicates a nav_menu not yet inserted.
   231 			// Note that a ID of less than one indicates a nav_menu not yet inserted.
   232 			if ( $this->post_id > 0 ) {
   232 			if ( $this->post_id > 0 ) {
   233 				$post = get_post( $this->post_id );
   233 				$post = get_post( $this->post_id );
   234 				if ( $post && self::POST_TYPE === $post->post_type ) {
   234 				if ( $post && self::POST_TYPE === $post->post_type ) {
   235 					$is_title_empty = empty( $post->post_title );
   235 					$is_title_empty = empty( $post->post_title );
   236 					$value = (array) wp_setup_nav_menu_item( $post );
   236 					$value          = (array) wp_setup_nav_menu_item( $post );
   237 					if ( $is_title_empty ) {
   237 					if ( $is_title_empty ) {
   238 						$value['title'] = '';
   238 						$value['title'] = '';
   239 					}
   239 					}
   240 				}
   240 				}
   241 			}
   241 			}
   350 		if ( ! isset( $this->value['original_title'] ) ) {
   350 		if ( ! isset( $this->value['original_title'] ) ) {
   351 			$this->value['original_title'] = $this->get_original_title( (object) $this->value );
   351 			$this->value['original_title'] = $this->get_original_title( (object) $this->value );
   352 		}
   352 		}
   353 
   353 
   354 		if ( ! isset( $this->value['nav_menu_term_id'] ) && $this->post_id > 0 ) {
   354 		if ( ! isset( $this->value['nav_menu_term_id'] ) && $this->post_id > 0 ) {
   355 			$menus = wp_get_post_terms( $this->post_id, WP_Customize_Nav_Menu_Setting::TAXONOMY, array(
   355 			$menus = wp_get_post_terms(
   356 				'fields' => 'ids',
   356 				$this->post_id,
   357 			) );
   357 				WP_Customize_Nav_Menu_Setting::TAXONOMY,
       
   358 				array(
       
   359 					'fields' => 'ids',
       
   360 				)
       
   361 			);
   358 			if ( ! empty( $menus ) ) {
   362 			if ( ! empty( $menus ) ) {
   359 				$this->value['nav_menu_term_id'] = array_shift( $menus );
   363 				$this->value['nav_menu_term_id'] = array_shift( $menus );
   360 			} else {
   364 			} else {
   361 				$this->value['nav_menu_term_id'] = 0;
   365 				$this->value['nav_menu_term_id'] = 0;
   362 			}
   366 			}
   377 			$this->value['title'] = '';
   381 			$this->value['title'] = '';
   378 		}
   382 		}
   379 
   383 
   380 		if ( ! isset( $this->value['_invalid'] ) ) {
   384 		if ( ! isset( $this->value['_invalid'] ) ) {
   381 			$this->value['_invalid'] = false;
   385 			$this->value['_invalid'] = false;
   382 			$is_known_invalid = (
   386 			$is_known_invalid        = (
   383 				( ( 'post_type' === $this->value['type'] || 'post_type_archive' === $this->value['type'] ) && ! post_type_exists( $this->value['object'] ) )
   387 				( ( 'post_type' === $this->value['type'] || 'post_type_archive' === $this->value['type'] ) && ! post_type_exists( $this->value['object'] ) )
   384 				||
   388 				||
   385 				( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) )
   389 				( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) )
   386 			);
   390 			);
   387 			if ( $is_known_invalid ) {
   391 			if ( $is_known_invalid ) {
   433 	public function preview() {
   437 	public function preview() {
   434 		if ( $this->is_previewed ) {
   438 		if ( $this->is_previewed ) {
   435 			return false;
   439 			return false;
   436 		}
   440 		}
   437 
   441 
   438 		$undefined = new stdClass();
   442 		$undefined      = new stdClass();
   439 		$is_placeholder = ( $this->post_id < 0 );
   443 		$is_placeholder = ( $this->post_id < 0 );
   440 		$is_dirty = ( $undefined !== $this->post_value( $undefined ) );
   444 		$is_dirty       = ( $undefined !== $this->post_value( $undefined ) );
   441 		if ( ! $is_placeholder && ! $is_dirty ) {
   445 		if ( ! $is_placeholder && ! $is_dirty ) {
   442 			return false;
   446 			return false;
   443 		}
   447 		}
   444 
   448 
   445 		$this->is_previewed              = true;
   449 		$this->is_previewed              = true;
   464 	 *
   468 	 *
   465 	 * @since 4.3.0
   469 	 * @since 4.3.0
   466 	 *
   470 	 *
   467 	 * @see wp_get_nav_menu_items()
   471 	 * @see wp_get_nav_menu_items()
   468 	 *
   472 	 *
   469 	 * @param array  $items An array of menu item post objects.
   473 	 * @param WP_Post[] $items An array of menu item post objects.
   470 	 * @param object $menu  The menu object.
   474 	 * @param WP_Term   $menu  The menu object.
   471 	 * @param array  $args  An array of arguments used to retrieve menu item objects.
   475 	 * @param array     $args  An array of arguments used to retrieve menu item objects.
   472 	 * @return array Array of menu items,
   476 	 * @return WP_Post[] Array of menu item objects.
   473 	 */
   477 	 */
   474 	public function filter_wp_get_nav_menu_items( $items, $menu, $args ) {
   478 	public function filter_wp_get_nav_menu_items( $items, $menu, $args ) {
   475 		$this_item = $this->value();
   479 		$this_item                = $this->value();
   476 		$current_nav_menu_term_id = $this_item['nav_menu_term_id'];
   480 		$current_nav_menu_term_id = $this_item['nav_menu_term_id'];
   477 		unset( $this_item['nav_menu_term_id'] );
   481 		unset( $this_item['nav_menu_term_id'] );
   478 
   482 
   479 		$should_filter = (
   483 		$should_filter = (
   480 			$menu->term_id === $this->original_nav_menu_term_id
   484 			$menu->term_id === $this->original_nav_menu_term_id
   505 				}
   509 				}
   506 			}
   510 			}
   507 			return $filtered_items;
   511 			return $filtered_items;
   508 		}
   512 		}
   509 
   513 
   510 		$mutated = false;
   514 		$mutated       = false;
   511 		$should_update = (
   515 		$should_update = (
   512 			is_array( $this_item )
   516 			is_array( $this_item )
   513 			&&
   517 			&&
   514 			$current_nav_menu_term_id === $menu->term_id
   518 			$current_nav_menu_term_id === $menu->term_id
   515 		);
   519 		);
   534 
   538 
   535 	/**
   539 	/**
   536 	 * Re-apply the tail logic also applied on $items by wp_get_nav_menu_items().
   540 	 * Re-apply the tail logic also applied on $items by wp_get_nav_menu_items().
   537 	 *
   541 	 *
   538 	 * @since 4.3.0
   542 	 * @since 4.3.0
   539 	 * @static
       
   540 	 *
   543 	 *
   541 	 * @see wp_get_nav_menu_items()
   544 	 * @see wp_get_nav_menu_items()
   542 	 *
   545 	 *
   543 	 * @param array  $items An array of menu item post objects.
   546 	 * @param WP_Post[] $items An array of menu item post objects.
   544 	 * @param object $menu  The menu object.
   547 	 * @param WP_Term   $menu  The menu object.
   545 	 * @param array  $args  An array of arguments used to retrieve menu item objects.
   548 	 * @param array     $args  An array of arguments used to retrieve menu item objects.
   546 	 * @return array Array of menu items,
   549 	 * @return WP_Post[] Array of menu item objects.
   547 	 */
   550 	 */
   548 	public static function sort_wp_get_nav_menu_items( $items, $menu, $args ) {
   551 	public static function sort_wp_get_nav_menu_items( $items, $menu, $args ) {
   549 		// @todo We should probably re-apply some constraints imposed by $args.
   552 		// @todo We should probably re-apply some constraints imposed by $args.
   550 		unset( $args['include'] );
   553 		unset( $args['include'] );
   551 
   554 
   553 		if ( ! is_admin() ) {
   556 		if ( ! is_admin() ) {
   554 			$items = array_filter( $items, '_is_valid_nav_menu_item' );
   557 			$items = array_filter( $items, '_is_valid_nav_menu_item' );
   555 		}
   558 		}
   556 
   559 
   557 		if ( ARRAY_A === $args['output'] ) {
   560 		if ( ARRAY_A === $args['output'] ) {
   558 			$items = wp_list_sort( $items, array(
   561 			$items = wp_list_sort(
   559 				$args['output_key'] => 'ASC',
   562 				$items,
   560 			) );
   563 				array(
   561 			$i = 1;
   564 					$args['output_key'] => 'ASC',
       
   565 				)
       
   566 			);
       
   567 			$i     = 1;
   562 
   568 
   563 			foreach ( $items as $k => $item ) {
   569 			foreach ( $items as $k => $item ) {
   564 				$items[ $k ]->{$args['output_key']} = $i++;
   570 				$items[ $k ]->{$args['output_key']} = $i++;
   565 			}
   571 			}
   566 		}
   572 		}
   580 		unset( $item->nav_menu_term_id );
   586 		unset( $item->nav_menu_term_id );
   581 
   587 
   582 		$item->post_status = $item->status;
   588 		$item->post_status = $item->status;
   583 		unset( $item->status );
   589 		unset( $item->status );
   584 
   590 
   585 		$item->post_type = 'nav_menu_item';
   591 		$item->post_type  = 'nav_menu_item';
   586 		$item->menu_order = $item->position;
   592 		$item->menu_order = $item->position;
   587 		unset( $item->position );
   593 		unset( $item->position );
   588 
   594 
   589 		if ( empty( $item->original_title ) ) {
   595 		if ( empty( $item->original_title ) ) {
   590 			$item->original_title = $this->get_original_title( $item );
   596 			$item->original_title = $this->get_original_title( $item );
   594 		}
   600 		}
   595 		if ( $item->title ) {
   601 		if ( $item->title ) {
   596 			$item->post_title = $item->title;
   602 			$item->post_title = $item->title;
   597 		}
   603 		}
   598 
   604 
   599 		$item->ID = $this->post_id;
   605 		$item->ID    = $this->post_id;
   600 		$item->db_id = $this->post_id;
   606 		$item->db_id = $this->post_id;
   601 		$post = new WP_Post( (object) $item );
   607 		$post        = new WP_Post( (object) $item );
   602 
   608 
   603 		if ( empty( $post->post_author ) ) {
   609 		if ( empty( $post->post_author ) ) {
   604 			$post->post_author = get_current_user_id();
   610 			$post->post_author = get_current_user_id();
   605 		}
   611 		}
   606 
   612 
   653 		// Invalid.
   659 		// Invalid.
   654 		if ( ! is_array( $menu_item_value ) ) {
   660 		if ( ! is_array( $menu_item_value ) ) {
   655 			return null;
   661 			return null;
   656 		}
   662 		}
   657 
   663 
   658 		$default = array(
   664 		$default                     = array(
   659 			'object_id'        => 0,
   665 			'object_id'        => 0,
   660 			'object'           => '',
   666 			'object'           => '',
   661 			'menu_item_parent' => 0,
   667 			'menu_item_parent' => 0,
   662 			'position'         => 0,
   668 			'position'         => 0,
   663 			'type'             => 'custom',
   669 			'type'             => 'custom',
   671 			'status'           => 'publish',
   677 			'status'           => 'publish',
   672 			'original_title'   => '',
   678 			'original_title'   => '',
   673 			'nav_menu_term_id' => 0,
   679 			'nav_menu_term_id' => 0,
   674 			'_invalid'         => false,
   680 			'_invalid'         => false,
   675 		);
   681 		);
   676 		$menu_item_value = array_merge( $default, $menu_item_value );
   682 		$menu_item_value             = array_merge( $default, $menu_item_value );
   677 		$menu_item_value = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) );
   683 		$menu_item_value             = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) );
   678 		$menu_item_value['position'] = intval( $menu_item_value['position'] );
   684 		$menu_item_value['position'] = intval( $menu_item_value['position'] );
   679 
   685 
   680 		foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) {
   686 		foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) {
   681 			// Note we need to allow negative-integer IDs for previewed objects not inserted yet.
   687 			// Note we need to allow negative-integer IDs for previewed objects not inserted yet.
   682 			$menu_item_value[ $key ] = intval( $menu_item_value[ $key ] );
   688 			$menu_item_value[ $key ] = intval( $menu_item_value[ $key ] );
   847 				wp_slash( $menu_item_data )
   853 				wp_slash( $menu_item_data )
   848 			);
   854 			);
   849 
   855 
   850 			if ( is_wp_error( $r ) ) {
   856 			if ( is_wp_error( $r ) ) {
   851 				$this->update_status = 'error';
   857 				$this->update_status = 'error';
   852 				$this->update_error = $r;
   858 				$this->update_error  = $r;
   853 			} else {
   859 			} else {
   854 				if ( $is_placeholder ) {
   860 				if ( $is_placeholder ) {
   855 					$this->previous_post_id = $this->post_id;
   861 					$this->previous_post_id = $this->post_id;
   856 					$this->post_id = $r;
   862 					$this->post_id          = $r;
   857 					$this->update_status = 'inserted';
   863 					$this->update_status    = 'inserted';
   858 				} else {
   864 				} else {
   859 					$this->update_status = 'updated';
   865 					$this->update_status = 'updated';
   860 				}
   866 				}
   861 			}
   867 			}
   862 		}
   868 		}