Make WordPress Core

Ticket #27120: 27120.3.diff

File 27120.3.diff, 2.8 KB (added by soulseekah, 7 years ago)

Implementation + tests

  • src/wp-includes/nav-menu.php

    diff --git src/wp-includes/nav-menu.php src/wp-includes/nav-menu.php
    index 6ce589b..eeba2dc 100644
    function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item 
    564564                wp_update_post( $post );
    565565        }
    566566
     567        // Invalidate wp_get_nav_menu_items object cache
     568        $cache_key = sprintf( 'menu_items:%s:%s', $menu_id, md5( serialize( $args ) ) );
     569        wp_cache_delete( $cache_key, 'menu' );
     570
    567571        /**
    568572         * Fires after a navigation menu item has been updated.
    569573         *
    function wp_get_nav_menu_items( $menu, $args = array() ) { 
    684688        $args['include'] = $items;
    685689
    686690        if ( ! empty( $items ) ) {
    687                 $items = get_posts( $args );
     691                $cache_key = sprintf( 'menu_items:%s:%s', $menu->ID, md5( serialize( $args ) ) );
     692                if ( false === ( $item_ids = wp_cache_get( $cache_key, 'menu' ) ) ) {
     693                        $item_ids = array();
     694                        foreach ( get_posts( $args ) as $post ) {
     695                                $item_ids []= $post->ID;
     696                        }
     697                        wp_cache_set( $cache_key, $item_ids, 'menu' );
     698                }
     699
     700                $items = array_map( 'get_post', $item_ids );
    688701        } else {
    689702                $items = array();
    690703        }
  • tests/phpunit/tests/post/nav-menu.php

    diff --git tests/phpunit/tests/post/nav-menu.php tests/phpunit/tests/post/nav-menu.php
    index d99b1a9..be13e72 100644
    class Test_Nav_Menus extends WP_UnitTestCase { 
    505505        }
    506506
    507507        /**
     508         * @ticket 27120
     509         */
     510        function test_nav_menu_cache() {
     511                $post_id = self::factory()->post->create();
     512
     513                wp_update_nav_menu_item(
     514                        $this->menu_id, 0, array(
     515                                'menu-item-type'      => 'post_type',
     516                                'menu-item-object'    => 'post',
     517                                'menu-item-object-id' => $post_id,
     518                                'menu-item-status'    => 'publish',
     519                        )
     520                );
     521
     522                global $wpdb;
     523
     524                $num_queries = $wpdb->num_queries;
     525
     526                /** First call */
     527                $menu = wp_nav_menu(
     528                        array(
     529                                'echo' => false,
     530                                'menu' => $this->menu_id,
     531                        )
     532                );
     533
     534                $this->assertNotEquals( $num_queries, $wpdb->num_queries );
     535
     536                $num_queries = $wpdb->num_queries;
     537
     538                /** Cached call */
     539                $menu = wp_nav_menu(
     540                        array(
     541                                'echo' => false,
     542                                'menu' => $this->menu_id,
     543                        )
     544                );
     545
     546                $this->assertEquals( $num_queries, $wpdb->num_queries );
     547
     548                $post_id = self::factory()->post->create();
     549
     550                $new_item_id = wp_update_nav_menu_item(
     551                        $this->menu_id, 0, array(
     552                                'menu-item-type'      => 'post_type',
     553                                'menu-item-object'    => 'post',
     554                                'menu-item-object-id' => $post_id,
     555                                'menu-item-status'    => 'publish',
     556                        )
     557                );
     558
     559                /** Invalidated */
     560                $menu = wp_nav_menu(
     561                        array(
     562                                'echo' => false,
     563                                'menu' => $this->menu_id,
     564                        )
     565                );
     566
     567                $this->assertContains( "menu-item-$new_item_id", $menu );
     568        }
     569
     570        /**
    508571         * Run tests required to confrim Walker_Nav_Menu receives an $args object.
    509572         */
    510573        function _confirm_nav_menu_item_args_object( $args ) {