web/wp-includes/nav-menu.php
changeset 204 09a1c134465b
parent 194 32102edaa81b
equal deleted inserted replaced
203:f507feede89a 204:09a1c134465b
   276 
   276 
   277 	$menu = wp_get_nav_menu_object( $menu_id );
   277 	$menu = wp_get_nav_menu_object( $menu_id );
   278 
   278 
   279 	if ( ( ! $menu && 0 !== $menu_id ) || is_wp_error( $menu ) )
   279 	if ( ( ! $menu && 0 !== $menu_id ) || is_wp_error( $menu ) )
   280 		return $menu;
   280 		return $menu;
   281 
       
   282 	$menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
       
   283 
       
   284 	$count = count( $menu_items );
       
   285 
   281 
   286 	$defaults = array(
   282 	$defaults = array(
   287 		'menu-item-db-id' => $menu_item_db_id,
   283 		'menu-item-db-id' => $menu_item_db_id,
   288 		'menu-item-object-id' => 0,
   284 		'menu-item-object-id' => 0,
   289 		'menu-item-object' => '',
   285 		'menu-item-object' => '',
   303 	$args = wp_parse_args( $menu_item_data, $defaults );
   299 	$args = wp_parse_args( $menu_item_data, $defaults );
   304 
   300 
   305 	if ( 0 == $menu_id ) {
   301 	if ( 0 == $menu_id ) {
   306 		$args['menu-item-position'] = 1;
   302 		$args['menu-item-position'] = 1;
   307 	} elseif ( 0 == (int) $args['menu-item-position'] ) {
   303 	} elseif ( 0 == (int) $args['menu-item-position'] ) {
       
   304 		$menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
   308 		$last_item = array_pop( $menu_items );
   305 		$last_item = array_pop( $menu_items );
   309 		$args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : $count;
   306 		$args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items );
   310 	}
   307 	}
   311 
   308 
   312 	$original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0;
   309 	$original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0;
   313 
   310 
   314 	if ( 'custom' != $args['menu-item-type'] ) {
   311 	if ( 'custom' != $args['menu-item-type'] ) {
   348 		'post_parent' => $original_parent,
   345 		'post_parent' => $original_parent,
   349 		'post_title' => $args['menu-item-title'],
   346 		'post_title' => $args['menu-item-title'],
   350 		'post_type' => 'nav_menu_item',
   347 		'post_type' => 'nav_menu_item',
   351 	);
   348 	);
   352 
   349 
   353 	if ( 0 != $menu_id )
   350 	$update = 0 != $menu_item_db_id;
       
   351 
       
   352 	// Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms()
       
   353 	if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) )
   354 		$post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) );
   354 		$post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) );
   355 
   355 
   356 	// New menu item. Default is draft status
   356 	// New menu item. Default is draft status
   357 	if ( 0 == $menu_item_db_id ) {
   357 	if ( ! $update ) {
   358 		$post['ID'] = 0;
   358 		$post['ID'] = 0;
   359 		$post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft';
   359 		$post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft';
   360 		$menu_item_db_id = wp_insert_post( $post );
   360 		$menu_item_db_id = wp_insert_post( $post );
   361 
   361 		if ( ! $menu_item_db_id	|| is_wp_error( $menu_item_db_id ) )
   362 	// Update existing menu item. Default is publish status
   362 			return $menu_item_db_id;
   363 	} else {
       
   364 		$post['ID'] = $menu_item_db_id;
       
   365 		$post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish';
       
   366 		wp_update_post( $post );
       
   367 	}
   363 	}
   368 
   364 
   369 	if ( 'custom' == $args['menu-item-type'] ) {
   365 	if ( 'custom' == $args['menu-item-type'] ) {
   370 		$args['menu-item-object-id'] = $menu_item_db_id;
   366 		$args['menu-item-object-id'] = $menu_item_db_id;
   371 		$args['menu-item-object'] = 'custom';
   367 		$args['menu-item-object'] = 'custom';
   372 	}
   368 	}
   373 
   369 
   374 	if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) )
       
   375 		return $menu_item_db_id;
       
   376 
       
   377 	$menu_item_db_id = (int) $menu_item_db_id;
   370 	$menu_item_db_id = (int) $menu_item_db_id;
   378 
   371 
   379 	update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) );
   372 	update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) );
   380 	update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', (int) $args['menu-item-parent-id'] );
   373 	update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', strval( (int) $args['menu-item-parent-id'] ) );
   381 	update_post_meta( $menu_item_db_id, '_menu_item_object_id', (int) $args['menu-item-object-id'] );
   374 	update_post_meta( $menu_item_db_id, '_menu_item_object_id', strval( (int) $args['menu-item-object-id'] ) );
   382 	update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) );
   375 	update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) );
   383 	update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) );
   376 	update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) );
   384 
   377 
   385 	$args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) );
   378 	$args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) );
   386 	$args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) );
   379 	$args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) );
   387 	update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] );
   380 	update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] );
   388 	update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] );
   381 	update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] );
   389 	update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) );
   382 	update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) );
   390 
   383 
   391 	if ( 0 == $menu_id )
   384 	if ( 0 == $menu_id )
   392 		update_post_meta( $menu_item_db_id, '_menu_item_orphaned', time() );
   385 		update_post_meta( $menu_item_db_id, '_menu_item_orphaned', (string) time() );
   393 	else
   386 	elseif ( get_post_meta( $menu_item_db_id, '_menu_item_orphaned' ) )
   394 		delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' );
   387 		delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' );
       
   388 
       
   389 	// Update existing menu item. Default is publish status
       
   390 	if ( $update ) {
       
   391 		$post['ID'] = $menu_item_db_id;
       
   392 		$post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish';
       
   393 		wp_update_post( $post );
       
   394 	}
   395 
   395 
   396 	do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );
   396 	do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );
   397 
   397 
   398 	return $menu_item_db_id;
   398 	return $menu_item_db_id;
   399 }
   399 }
   481 
   481 
   482 	if ( empty( $items ) )
   482 	if ( empty( $items ) )
   483 		return $items;
   483 		return $items;
   484 
   484 
   485 	$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
   485 	$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
   486 		'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true,
   486 		'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true );
   487 		'update_post_term_cache' => false );
       
   488 	$args = wp_parse_args( $args, $defaults );
   487 	$args = wp_parse_args( $args, $defaults );
   489 	if ( count( $items ) > 1 )
   488 	if ( count( $items ) > 1 )
   490 		$args['include'] = implode( ',', $items );
   489 		$args['include'] = implode( ',', $items );
   491 	else
   490 	else
   492 		$args['include'] = $items[0];
   491 		$args['include'] = $items[0];