WordPress.org

Make WordPress Core

Ticket #21760: 21760.8.diff

File 21760.8.diff, 6.9 KB (added by tollmanz, 6 years ago)

s/$bucket/$group and hash name keys

  • src/wp-includes/functions.php

     
    35023502 * Determine if the scheme of the given URL is https.
    35033503 *
    35043504 * @since 4.0.0
    3505  * 
     3505 *
    35063506 * @param  string  $url The URL
    35073507 * @return boolean      True if the given URL uses https, false if not (or if the URL is not valid).
    35083508 */
     
    45974597
    45984598        return (bool) $var;
    45994599}
     4600
     4601/**
     4602 * Helper function to retrieve an incrementer identified by $group
     4603 *
     4604 * @since 4.0.0
     4605 *
     4606 * @param string $group The cache group for the incrementer.
     4607 * @return int The timestamp representing 'last_changed'.
     4608 */
     4609function wp_get_last_changed( $group ) {
     4610        $last_changed = wp_cache_get( 'last_changed', $group );
     4611        if ( ! $last_changed ) {
     4612                $last_changed = microtime();
     4613                wp_cache_set( 'last_changed', $last_changed, $group );
     4614        }
     4615        return $last_changed;
     4616}
     4617 No newline at end of file
  • src/wp-includes/taxonomy.php

     
    962962                return $error;
    963963        }
    964964
     965        $group = $taxonomy . ':' . wp_get_last_changed( 'terms' );
    965966        if ( is_object($term) && empty($term->filter) ) {
    966                 wp_cache_add($term->term_id, $term, $taxonomy);
     967                wp_cache_add( $term->term_id, $term, $taxonomy );
     968                wp_cache_add( "slug:{$term->slug}", $term->term_id, $group );
     969                wp_cache_add( "name:" . md5( $term->name ), $term->term_id, $group );
    967970                $_term = $term;
    968971        } else {
    969972                if ( is_object($term) )
     
    974977                        $_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND t.term_id = %d LIMIT 1", $taxonomy, $term) );
    975978                        if ( ! $_term )
    976979                                return null;
    977                         wp_cache_add($term, $_term, $taxonomy);
     980                        wp_cache_add( $term, $_term, $taxonomy );
     981                        wp_cache_add( "slug:{$_term->slug}", $term, $group );
     982                        wp_cache_add( "name:" . md5( $_term->name ), $term, $group );
    978983                }
    979984        }
    980985
     
    10461051        if ( ! taxonomy_exists($taxonomy) )
    10471052                return false;
    10481053
     1054        $cache = false;
     1055        $group = $taxonomy . ':' . wp_get_last_changed( 'terms' );
    10491056        if ( 'slug' == $field ) {
    10501057                $field = 't.slug';
    10511058                $value = sanitize_title($value);
    10521059                if ( empty($value) )
    10531060                        return false;
     1061
     1062                $term_id = wp_cache_get( "slug:{$value}", $group );
     1063                if ( $term_id ) {
     1064                        $value = $term_id;
     1065                        $cache = true;
     1066                }
    10541067        } else if ( 'name' == $field ) {
    10551068                // Assume already escaped
    10561069                $value = wp_unslash($value);
    10571070                $field = 't.name';
     1071                $term_id = wp_cache_get( "name:" . md5( $value ), $group );
     1072                if ( $term_id ) {
     1073                        $value = $term_id;
     1074                        $cache = true;
     1075                }
    10581076        } else if ( 'term_taxonomy_id' == $field ) {
    10591077                $value = (int) $value;
    10601078                $field = 'tt.term_taxonomy_id';
    10611079        } else {
     1080                $cache = true;
     1081        }
     1082
     1083        if ( $cache ) {
    10621084                $term = get_term( (int) $value, $taxonomy, $output, $filter);
    10631085                if ( is_wp_error( $term ) )
    10641086                        $term = false;
     
    10691091        if ( !$term )
    10701092                return false;
    10711093
    1072         wp_cache_add($term->term_id, $term, $taxonomy);
     1094        wp_cache_add( $term->term_id, $term, $taxonomy );
     1095        wp_cache_add( "slug:{$term->slug}", $term->term_id, $group );
     1096        wp_cache_add( "name:" . md5( $term->name ), $term->term_id, $group );
    10731097
    10741098        /** This filter is documented in wp-includes/taxonomy.php */
    10751099        $term = apply_filters( 'get_term', $term, $taxonomy );
     
    34073431                if ( empty($term_taxonomy) )
    34083432                        $term_taxonomy = $term->taxonomy;
    34093433
    3410                 wp_cache_add($term->term_id, $term, $term_taxonomy);
     3434                wp_cache_add( $term->term_id, $term, $term_taxonomy );
     3435                $group = $term_taxonomy . ':' . wp_get_last_changed( 'terms' );
     3436                wp_cache_add( "slug:{$term->slug}", $term->term_id, $group );
     3437                wp_cache_add( "name:" . md5( $term->name ), $term->term_id, $group );
    34113438        }
    34123439}
    34133440
  • tests/phpunit/tests/term/cache.php

     
    9393
    9494                _unregister_taxonomy( $tax );
    9595        }
     96
     97        /**
     98         * @ticket 21760
     99         */
     100        function test_get_term_by_slug_cache() {
     101                global $wpdb;
     102                $term_id = $this->factory->term->create( array( 'slug' => 'burrito', 'taxonomy' => 'post_tag' ) );
     103
     104                $queries = $wpdb->num_queries;
     105                get_term_by( 'slug', 'burrito', 'post_tag' );
     106                $initial = $queries + 1;
     107                $this->assertEquals( $initial, $wpdb->num_queries );
     108                $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     109                $this->assertEquals( $initial, $wpdb->num_queries );
     110
     111                $this->assertEquals( get_term( $term_id, 'post_tag' ), $term );
     112                $this->assertEquals( $initial, $wpdb->num_queries );
     113        }
     114
     115        /**
     116         * @ticket 21760
     117         */
     118        function test_get_term_by_slug_cache_update() {
     119                global $wpdb;
     120                $term_id = $this->factory->term->create( array( 'slug' => 'burrito', 'taxonomy' => 'post_tag' ) );
     121
     122                $queries = $wpdb->num_queries;
     123                get_term_by( 'slug', 'burrito', 'post_tag' );
     124                $initial = $queries + 1;
     125                $this->assertEquals( $initial, $wpdb->num_queries );
     126                $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     127                $this->assertEquals( $initial, $wpdb->num_queries );
     128
     129                wp_update_term( $term_id, 'post_tag', array( 'name' => 'Taco' ) );
     130                $this->assertNotEquals( $term, get_term( $term_id, 'post_tag' ) );
     131                $after_queries = $wpdb->num_queries;
     132                get_term_by( 'slug', 'burrito', 'post_tag' );
     133                $this->assertEquals( $after_queries, $wpdb->num_queries );
     134        }
     135
     136        /**
     137         * @ticket 21760
     138         */
     139        function test_get_term_by_name_cache() {
     140                global $wpdb;
     141                $term_id = $this->factory->term->create( array( 'name' => 'burrito', 'taxonomy' => 'post_tag' ) );
     142
     143                $queries = $wpdb->num_queries;
     144                get_term_by( 'name', 'burrito', 'post_tag' );
     145                $initial = $queries + 1;
     146                $this->assertEquals( $initial, $wpdb->num_queries );
     147                $term = get_term_by( 'name', 'burrito', 'post_tag' );
     148                $this->assertEquals( $initial, $wpdb->num_queries );
     149
     150                $this->assertEquals( get_term( $term_id, 'post_tag' ), $term );
     151                $this->assertEquals( $initial, $wpdb->num_queries );
     152        }
     153
     154        /**
     155         * @ticket 21760
     156         */
     157        function test_get_term_by_name_cache_update() {
     158                global $wpdb;
     159                $term_id = $this->factory->term->create( array( 'name' => 'burrito', 'taxonomy' => 'post_tag' ) );
     160
     161                $queries = $wpdb->num_queries;
     162                get_term_by( 'name', 'burrito', 'post_tag' );
     163                $initial = $queries + 1;
     164                $this->assertEquals( $initial, $wpdb->num_queries );
     165                $term = get_term_by( 'name', 'burrito', 'post_tag' );
     166                $this->assertEquals( $initial, $wpdb->num_queries );
     167
     168                wp_update_term( $term_id, 'post_tag', array( 'slug' => 'Taco' ) );
     169                $this->assertNotEquals( $term, get_term( $term_id, 'post_tag' ) );
     170                $after_queries = $wpdb->num_queries;
     171                get_term_by( 'name', 'burrito', 'post_tag' );
     172                $this->assertEquals( $after_queries, $wpdb->num_queries );
     173        }
    96174}
     175 No newline at end of file