WordPress.org

Make WordPress Core

Ticket #21760: 21760.6.diff

File 21760.6.diff, 5.0 KB (added by wonderboymusic, 6 years ago)
  • 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 *
     4603 * @param string $bucket
     4604 * @return int
     4605 */
     4606function wp_get_last_changed( $bucket ) {
     4607        $last_changed = wp_cache_get( 'last_changed', $bucket );
     4608        if ( ! $last_changed ) {
     4609                $last_changed = microtime();
     4610                wp_cache_set( 'last_changed', $last_changed, $bucket );
     4611        }
     4612        return $last_changed;
     4613}
     4614 No newline at end of file
  • src/wp-includes/taxonomy.php

     
    962962                return $error;
    963963        }
    964964
     965        $bucket = $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, $bucket );
    967969                $_term = $term;
    968970        } else {
    969971                if ( is_object($term) )
     
    974976                        $_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) );
    975977                        if ( ! $_term )
    976978                                return null;
    977                         wp_cache_add($term, $_term, $taxonomy);
     979                        wp_cache_add( $term, $_term, $taxonomy );
     980                        wp_cache_add( "slug:{$_term->slug}", $term, $bucket );
    978981                }
    979982        }
    980983
     
    10461049        if ( ! taxonomy_exists($taxonomy) )
    10471050                return false;
    10481051
     1052        $cache = false;
    10491053        if ( 'slug' == $field ) {
    10501054                $field = 't.slug';
    10511055                $value = sanitize_title($value);
    10521056                if ( empty($value) )
    10531057                        return false;
     1058                $bucket = $taxonomy . ':' . wp_get_last_changed( 'terms' );
     1059                $term_id = wp_cache_get( "slug:{$value}", $bucket );
     1060                if ( $term_id ) {
     1061                        $value = $term_id;
     1062                        $cache = true;
     1063                }
    10541064        } else if ( 'name' == $field ) {
    10551065                // Assume already escaped
    10561066                $value = wp_unslash($value);
     
    10591069                $value = (int) $value;
    10601070                $field = 'tt.term_taxonomy_id';
    10611071        } else {
     1072                $cache = true;
     1073        }
     1074
     1075        if ( $cache ) {
    10621076                $term = get_term( (int) $value, $taxonomy, $output, $filter);
    10631077                if ( is_wp_error( $term ) )
    10641078                        $term = false;
     
    10691083        if ( !$term )
    10701084                return false;
    10711085
    1072         wp_cache_add($term->term_id, $term, $taxonomy);
     1086        wp_cache_add( $term->term_id, $term, $taxonomy );
     1087        $bucket = $taxonomy . ':' . wp_get_last_changed( 'terms' );
     1088        wp_cache_add( "slug:{$term->slug}", $term->term_id, $bucket );
    10731089
    10741090        /** This filter is documented in wp-includes/taxonomy.php */
    10751091        $term = apply_filters( 'get_term', $term, $taxonomy );
     
    34073423                if ( empty($term_taxonomy) )
    34083424                        $term_taxonomy = $term->taxonomy;
    34093425
    3410                 wp_cache_add($term->term_id, $term, $term_taxonomy);
     3426                wp_cache_add( $term->term_id, $term, $term_taxonomy );
     3427                $bucket = $term_taxonomy . ':' . wp_get_last_changed( 'terms' );
     3428                wp_cache_add( "slug:{$term->slug}", $term->term_id, $bucket );
    34113429        }
    34123430}
    34133431
  • 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        }
    96135}
     136 No newline at end of file