WordPress.org

Make WordPress Core

Ticket #36711: 36711.5.patch

File 36711.5.patch, 3.7 KB (added by boonebgorges, 6 years ago)
  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index 1920e84..6bd61ee 100644
    function get_page( $page, $output = OBJECT, $filter = 'raw') { 
    42314231function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) {
    42324232        global $wpdb;
    42334233
     4234        $last_changed = wp_cache_get( 'last_changed', 'posts' );
     4235        if ( false === $last_changed ) {
     4236                $last_changed = microtime();
     4237                wp_cache_set( 'last_changed', $last_changed, 'posts' );
     4238        }
     4239
     4240        $hash = md5( $page_path . serialize( $post_type ) );
     4241        $cache_key = "get_page_by_path:$hash:$last_changed";
     4242        $cached = wp_cache_get( $cache_key, 'posts' );
     4243        if ( false !== $cached ) {
     4244                return get_post( $cached );
     4245        }
     4246
    42344247        $page_path = rawurlencode(urldecode($page_path));
    42354248        $page_path = str_replace('%2F', '/', $page_path);
    42364249        $page_path = str_replace('%20', ' ', $page_path);
    function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { 
    42854298                }
    42864299        }
    42874300
     4301        // We cache misses as well as hits.
     4302        wp_cache_set( $cache_key, $foundid, 'posts' );
     4303
    42884304        if ( $foundid ) {
    42894305                return get_post( $foundid, $output );
    42904306        }
  • tests/phpunit/tests/post/getPageByPath.php

    diff --git tests/phpunit/tests/post/getPageByPath.php tests/phpunit/tests/post/getPageByPath.php
    index 7bd3610..2604d9b 100644
    class Tests_Post_GetPageByPath extends WP_UnitTestCase { 
    123123
    124124                $this->assertNull( $found );
    125125        }
     126
     127        /**
     128         * @ticket 36711
     129         */
     130        public function test_should_hit_cache() {
     131                global $wpdb;
     132
     133                $page = self::factory()->post->create( array(
     134                        'post_type' => 'page',
     135                        'post_name' => 'foo',
     136                ) );
     137
     138                // Prime cache.
     139                $found = get_page_by_path( 'foo' );
     140                $this->assertSame( $page, $found->ID );
     141
     142                $num_queries = $wpdb->num_queries;
     143
     144                $found = get_page_by_path( 'foo' );
     145                $this->assertSame( $page, $found->ID );
     146                $this->assertSame( $num_queries, $wpdb->num_queries );
     147        }
     148
     149        /**
     150         * @ticket 36711
     151         */
     152        public function test_bad_path_should_be_cached() {
     153                global $wpdb;
     154
     155                // Prime cache.
     156                $found = get_page_by_path( 'foo' );
     157                $this->assertNull( $found );
     158
     159                $num_queries = $wpdb->num_queries;
     160
     161                $found = get_page_by_path( 'foo' );
     162                $this->assertNull( $found );
     163                $this->assertSame( $num_queries, $wpdb->num_queries );
     164        }
     165
     166        /**
     167         * @ticket 36711
     168         */
     169        public function test_cache_should_not_match_post_in_different_post_type_with_same_path() {
     170                global $wpdb;
     171
     172                register_post_type( 'wptests_pt' );
     173
     174                $p1 = self::factory()->post->create( array(
     175                        'post_type' => 'page',
     176                        'post_name' => 'foo',
     177                ) );
     178
     179                $p2 = self::factory()->post->create( array(
     180                        'post_type' => 'wptests_pt',
     181                        'post_name' => 'foo',
     182                ) );
     183
     184                // Prime cache for the page.
     185                $found = get_page_by_path( 'foo' );
     186                $this->assertSame( $p1, $found->ID );
     187
     188                $num_queries = $wpdb->num_queries;
     189
     190                $found = get_page_by_path( 'foo', OBJECT, 'wptests_pt' );
     191                $this->assertSame( $p2, $found->ID );
     192                $num_queries++;
     193                $this->assertSame( $num_queries, $wpdb->num_queries );
     194        }
     195
     196        /**
     197         * @ticket 36711
     198         */
     199        public function test_cache_should_be_invalidated_when_post_name_is_edited() {
     200                global $wpdb;
     201
     202                $page = self::factory()->post->create( array(
     203                        'post_type' => 'page',
     204                        'post_name' => 'foo',
     205                ) );
     206
     207                // Prime cache.
     208                $found = get_page_by_path( 'foo' );
     209                $this->assertSame( $page, $found->ID );
     210
     211                wp_update_post( array(
     212                        'ID' => $page,
     213                        'post_name' => 'bar',
     214                ) );
     215
     216                $num_queries = $wpdb->num_queries;
     217
     218                $found = get_page_by_path( 'bar' );
     219                $this->assertSame( $page, $found->ID );
     220                $num_queries++;
     221                $this->assertSame( $num_queries, $wpdb->num_queries );
     222        }
    126223}