WordPress.org

Make WordPress Core

Ticket #36711: 36711.3.patch

File 36711.3.patch, 2.4 KB (added by spacedmonkey, 6 years ago)

New patch with unit tests

  • src/wp-includes/post.php

     
    42484248
    42494249        $post_types = esc_sql( $post_types );
    42504250        $post_type_in_string = "'" . implode( "','", $post_types ) . "'";
     4251
     4252        $key          = $in_string . ":" . $post_type_in_string;
     4253        $last_changed = wp_cache_get( 'last_changed', 'posts' );
     4254        if ( ! $last_changed ) {
     4255                $last_changed = microtime();
     4256                wp_cache_set( 'last_changed', $last_changed, 'posts' );
     4257        }
     4258        $cache_key = "get_page_by_path:$key:$last_changed";
     4259        if ( $cache = wp_cache_get( $cache_key, 'posts' ) ) {
     4260           return get_post( $cache, $output );
     4261        }
     4262
    42514263        $sql = "
    42524264                SELECT ID, post_name, post_parent, post_type
    42534265                FROM $wpdb->posts
     
    42844296                        }
    42854297                }
    42864298        }
     4299   
     4300        wp_cache_set( $cache_key, $foundid, 'posts' );
    42874301
    42884302        if ( $foundid ) {
    42894303                return get_post( $foundid, $output );
  • tests/phpunit/tests/post.php

     
    565565                $this->assertEquals( $other_att, get_page_by_path( 'some-other-page' ) );
    566566        }
    567567
     568
     569        /**
     570         * @ticket 36711
     571         */
     572        function test_get_page_by_path_cache() {
     573                global $wpdb;
     574
     575                $page       = self::factory()->post->create_and_get( array( 'post_title' => 'some-page', 'post_type' => 'page' ) );
     576                $wpdb->update( $wpdb->posts, array( 'post_name' => 'some-page' ), array( 'ID' => $page->ID ) );
     577                clean_post_cache( $page->ID );
     578
     579                $page = get_post( $page->ID );
     580
     581                $this->assertEquals( 'some-page', $page->post_name );
     582                $this->assertEquals( $page, get_page_by_path( 'some-page' ) );
     583
     584                $wpdb->update( $wpdb->posts, array( 'post_name' => 'another-url' ), array( 'ID' => $page->ID ) );
     585                clean_post_cache( $page->ID );
     586
     587                $page = get_post( $page->ID );
     588                // Test changing url
     589                $this->assertEquals( 'another-url', $page->post_name );
     590                $this->assertEquals( $page, get_page_by_path( 'another-url' ) );
     591
     592                $num_queries = $wpdb->num_queries;
     593                $this->assertEquals( $page, get_page_by_path( 'another-url' ) );
     594                // Test caching
     595                $this->assertEquals( $num_queries, $wpdb->num_queries );
     596
     597        }
     598
    568599        function test_wp_publish_post() {
    569600                $draft_id = self::factory()->post->create( array( 'post_status' => 'draft' ) );
    570601