Make WordPress Core


Ignore:
Timestamp:
10/16/2014 04:44:13 AM (12 years ago)
Author:
wonderboymusic
Message:

Cache get_term_by() calls:

  • Add a helper function, wp_get_last_changed(), to retrieve a last-modified timestamp by cache group
  • When caching a term, also make cache entries for slug and name via slug:{$term_id} and name:{$term_id} keys in the $taxonomy:$last_changed bucket that reference the term_id
  • In clean_term_cache() and update_term_cache(), respect $_wp_suspend_cache_invalidation
  • Original term cache entries maintain BC

Adds unit tests.

Props wonderboymusic, tollmanz, boonebgorges.
Fixes #21760.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/term/cache.php

    r27163 r29915  
    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( $term, wp_cache_get( $term_id, 'post_tag' ) );
     112
     113                $this->assertEquals( get_term( $term_id, 'post_tag' ), $term );
     114                $this->assertEquals( $initial, $wpdb->num_queries );
     115        }
     116
     117        /**
     118         * @ticket 21760
     119         */
     120        function test_get_term_by_slug_cache_update() {
     121                global $wpdb;
     122                $term_id = $this->factory->term->create( array( 'slug' => 'burrito', 'taxonomy' => 'post_tag' ) );
     123
     124                $queries = $wpdb->num_queries;
     125                get_term_by( 'slug', 'burrito', 'post_tag' );
     126                $initial = $queries + 1;
     127                $this->assertEquals( $initial, $wpdb->num_queries );
     128                $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     129                $this->assertEquals( $initial, $wpdb->num_queries );
     130
     131                $this->assertEquals( $term, wp_cache_get( $term_id, 'post_tag' ) );
     132
     133                wp_update_term( $term_id, 'post_tag', array( 'name' => 'Taco' ) );
     134                $this->assertNotEquals( $term, get_term( $term_id, 'post_tag' ) );
     135                $after_queries = $wpdb->num_queries;
     136                get_term_by( 'slug', 'burrito', 'post_tag' );
     137                $this->assertEquals( $after_queries, $wpdb->num_queries );
     138        }
     139
     140        /**
     141         * @ticket 21760
     142         */
     143        function test_get_term_by_name_cache() {
     144                global $wpdb;
     145                $term_id = $this->factory->term->create( array( 'name' => 'burrito', 'taxonomy' => 'post_tag' ) );
     146
     147                $queries = $wpdb->num_queries;
     148                get_term_by( 'name', 'burrito', 'post_tag' );
     149                $initial = $queries + 1;
     150                $this->assertEquals( $initial, $wpdb->num_queries );
     151                $term = get_term_by( 'name', 'burrito', 'post_tag' );
     152                $this->assertEquals( $initial, $wpdb->num_queries );
     153
     154                $this->assertEquals( get_term( $term_id, 'post_tag' ), $term );
     155                $this->assertEquals( $initial, $wpdb->num_queries );
     156        }
     157
     158        /**
     159         * @ticket 21760
     160         */
     161        function test_get_term_by_name_cache_update() {
     162                global $wpdb;
     163                $term_id = $this->factory->term->create( array( 'name' => 'burrito', 'taxonomy' => 'post_tag' ) );
     164
     165                $queries = $wpdb->num_queries;
     166                get_term_by( 'name', 'burrito', 'post_tag' );
     167                $initial = $queries + 1;
     168                $this->assertEquals( $initial, $wpdb->num_queries );
     169                $term = get_term_by( 'name', 'burrito', 'post_tag' );
     170                $this->assertEquals( $initial, $wpdb->num_queries );
     171
     172                wp_update_term( $term_id, 'post_tag', array( 'slug' => 'Taco' ) );
     173                $this->assertNotEquals( $term, get_term( $term_id, 'post_tag' ) );
     174                $after_queries = $wpdb->num_queries;
     175                get_term_by( 'name', 'burrito', 'post_tag' );
     176                $this->assertEquals( $after_queries, $wpdb->num_queries );
     177        }
     178
     179        /**
     180         * @ticket 21760
     181         */
     182        function test_invalidating_term_caches_should_fail_when_invalidation_is_suspended() {
     183                $slug = 'taco';
     184                $name = 'Taco';
     185                $taxonomy = 'post_tag';
     186                $cache_key_slug = 'slug:' . $slug;
     187                $cache_key_name = 'name:' . md5( $name );
     188
     189                $term_id = $this->factory->term->create( array( 'slug' => $slug, 'name' => $name, 'taxonomy' => $taxonomy ) );
     190
     191                $last_changed = wp_get_last_changed( 'terms' );
     192                $group = $taxonomy . ':' . $last_changed;
     193
     194                $term = get_term_by( 'slug', $slug, $taxonomy );
     195
     196                // Verify the term is cached by ID, slug and name
     197                $this->assertEquals( $term, wp_cache_get( $term_id, $taxonomy ) );
     198                $this->assertEquals( $term_id, wp_cache_get( $cache_key_slug, $group ) );
     199                $this->assertEquals( $term_id, wp_cache_get( $cache_key_name, $group ) );
     200
     201                wp_suspend_cache_invalidation();
     202                clean_term_cache( $term_id, $taxonomy );
     203
     204                // Verify that the cached value still matches the correct value
     205                $this->assertEquals( $term, wp_cache_get( $term_id, $taxonomy ) );
     206                $this->assertEquals( $term_id, wp_cache_get( $cache_key_slug, $group ) );
     207                $this->assertEquals( $term_id, wp_cache_get( $cache_key_name, $group ) );
     208
     209                // Verify that last changed has not been updated as part of an invalidation routine
     210                $this->assertEquals( $last_changed, wp_get_last_changed( 'terms' ) );
     211        }
    96212}
Note: See TracChangeset for help on using the changeset viewer.