diff --git a/src/wp-includes/nav-menu.php b/src/wp-includes/nav-menu.php index 363c2ac4de..e01000c9cf 100644 --- a/src/wp-includes/nav-menu.php +++ b/src/wp-includes/nav-menu.php @@ -365,10 +365,6 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item $update = 0 != $menu_item_db_id; - // Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms() - if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) - $post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) ); - // New menu item. Default is draft status if ( ! $update ) { $post['ID'] = 0; @@ -378,6 +374,12 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item return $menu_item_db_id; } + // Associate the menu item with the menu term + // Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms() + if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) { + wp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' ); + } + if ( 'custom' == $args['menu-item-type'] ) { $args['menu-item-object-id'] = $menu_item_db_id; $args['menu-item-object'] = 'custom'; diff --git a/tests/phpunit/tests/post/nav-menu.php b/tests/phpunit/tests/post/nav-menu.php index 954e5385ab..35504d2b4f 100644 --- a/tests/phpunit/tests/post/nav-menu.php +++ b/tests/phpunit/tests/post/nav-menu.php @@ -88,4 +88,32 @@ class Test_Nav_Menus extends WP_UnitTestCase { $page_items = wp_get_associated_nav_menu_items( $page_id ); $this->assertEqualSets( array(), $page_items ); } + + /** + * @ticket 27113 + */ + function test_orphan_nav_menu_item() { + + // Create an orphan nav menu item + $custom_item_id = wp_update_nav_menu_item( 0, 0, array( + 'menu-item-type' => 'custom', + 'menu-item-title' => 'Wordpress.org', + 'menu-item-link' => 'http://wordpress.org', + 'menu-item-status' => 'publish' + ) ); + + // Confirm it saved properly + $custom_item = wp_setup_nav_menu_item( get_post( $custom_item_id ) ); + $this->assertEquals( 'Wordpress.org', $custom_item->title ); + + // Update the orphan with an associated nav menu + wp_update_nav_menu_item( $this->menu_id, $custom_item_id, array( + 'menu-item-title' => 'WordPress.org', + ) ); + $menu_items = wp_get_nav_menu_items( $this->menu_id ); + $custom_item = wp_filter_object_list( $menu_items, array( 'db_id' => $custom_item_id ) ); + $custom_item = array_pop( $custom_item ); + $this->assertEquals( 'WordPress.org', $custom_item->title ); + + } }