WordPress.org

Make WordPress Core

Ticket #34803: 34803-2.diff

File 34803-2.diff, 3.7 KB (added by shooper, 5 years ago)

Updated patch that clears child cache & includes test coverage

  • src/wp-includes/post.php

     
    24102410                }
    24112411        }
    24122412
     2413        if ( $post->post_type == 'nav_menu_item') {
     2414
     2415                // Get this menu item's parent
     2416                $parent_menu_id = (int)get_post_meta ( $post->ID, '_menu_item_menu_item_parent', true );
     2417
     2418                // Move all children of this nav menu to the parent
     2419                $children_query = $wpdb->prepare("UPDATE $wpdb->postmeta SET meta_value = %d WHERE meta_key = '_menu_item_menu_item_parent' AND meta_value= %s", $parent_menu_id, $post->ID);
     2420                $wpdb->query ( $children_query );
     2421        }
     2422
    24132423        // Do raw query. wp_get_post_revisions() is filtered.
    24142424        $revision_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'", $postid ) );
    24152425        // Use wp_delete_post (via wp_delete_post_revision) again. Ensures any meta/misplaced data gets cleaned up.
     
    24612471                        clean_post_cache( $child );
    24622472        }
    24632473
     2474        if ( $post->post_type == 'nav_menu_item' && $parent_menu_id) {
     2475                $children_query = $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_menu_item_menu_item_parent' AND meta_value=%s", $parent_menu_id);
     2476                $children = $wpdb->get_col ( $children_query );
     2477
     2478                foreach ( $children as $child )
     2479                        clean_post_cache( $child );
     2480
     2481        }
     2482
    24642483        wp_clear_scheduled_hook('publish_future_post', array( $postid ) );
    24652484
    24662485        /**
  • tests/phpunit/tests/post/nav-menu.php

     
    180180
    181181                $this->assertEquals( $nav_menus_names, $expected_nav_menus_names );
    182182        }
     183
     184        /**
     185         * @ticket 34803
     186         */
     187        function test_delete_child_menu_with_grandchildren_present() {
     188
     189                // Create a new menu
     190                $menuId = wp_create_nav_menu( rand_str() );
     191                $menu = wp_get_nav_menu_object($menuId);
     192                $this->assertSame($menuId, $menu->term_id);
     193
     194                // Add grandparent nav menu item
     195                // and confirm it saved properly
     196                $grandparent = wp_update_nav_menu_item( $menuId, 0, array(
     197                        'menu-item-type'      => 'custom',
     198                        'menu-item-title'     => 'Grandparent',
     199                        'menu-item-link'      => 'http://wordpress.org',
     200                        'menu-item-status'    => 'publish'
     201                ) );
     202                $custom_item = wp_setup_nav_menu_item( get_post( $grandparent ) );
     203                $this->assertEquals( 'Grandparent', $custom_item->title );
     204
     205                // Add parent nav menu item
     206                // and confirm it saved properly
     207                $parent = wp_update_nav_menu_item( $menuId, 0, array(
     208                        'menu-item-type'      => 'custom',
     209                        'menu-item-title'     => 'Parent',
     210                        'menu-item-link'      => 'http://wordpress.org',
     211                        'menu-item-status'    => 'publish',
     212                        'menu-item-parent-id' => $grandparent
     213                ) );
     214                $custom_item = wp_setup_nav_menu_item( get_post( $parent ) );
     215                $this->assertEquals( 'Parent', $custom_item->title );
     216
     217                // Add child nav menu item
     218                // and confirm it saved properly
     219                $child = wp_update_nav_menu_item( $menuId, 0, array(
     220                        'menu-item-type'      => 'custom',
     221                        'menu-item-title'     => 'Child',
     222                        'menu-item-link'      => 'http://wordpress.org',
     223                        'menu-item-status'    => 'publish',
     224                        'menu-item-parent-id' => $parent
     225                ) );
     226                $custom_item = wp_setup_nav_menu_item( get_post( $child ) );
     227                $this->assertEquals( 'Child', $custom_item->title );
     228
     229                // Delete the Parent menu item
     230                wp_delete_post( $parent, true );
     231                $deletedPost = get_post( $parent );
     232                $this->assertNull( $deletedPost );
     233
     234                // Verify that the child is now associated directly with the grandparent
     235                $newParentMenuItemId = get_post_meta( $child, '_menu_item_menu_item_parent', true );
     236                $this->assertEquals( $grandparent, (int)$newParentMenuItemId );
     237
     238        }
     239
    183240}