Make WordPress Core


Ignore:
Timestamp:
09/29/2016 10:35:32 PM (7 years ago)
Author:
ocean90
Message:

Taxonomy: Use WP_Term_Query in get_term_by().

WP_Term_Query already supports querying terms by 'slug', 'name', and 'term_taxonomy_id'. Its additional arguments allow us to generate nearly the same SQL queries as before.
This change has one yuge benefit: the term queries are now cached.

Add tests to increase coverage of get_term_by().

Props spacedmonkey, boonebgorges, johnjamesjacoby, pento, ocean90.
Fixes #21760.

File:
1 edited

Legend:

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

    r36323 r38677  
    220220        }
    221221    }
     222
     223    /**
     224     * @ticket 21760
     225     */
     226    function test_get_term_by_slug_cache() {
     227        global $wpdb;
     228
     229        $term_id = $this->factory->term->create( array( 'slug' => 'burrito', 'name' => 'Taco', 'taxonomy' => 'post_tag' ) );
     230
     231        clean_term_cache( $term_id, 'post_tag' );
     232        $num_queries = $wpdb->num_queries;
     233
     234        $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     235        $num_queries++;
     236        $this->assertEquals( 'Taco', $term->name );
     237        $this->assertEquals( $num_queries, $wpdb->num_queries );
     238
     239        // This should now hit cache.
     240        $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     241        $this->assertEquals( 'Taco', $term->name );
     242        $this->assertEquals( $num_queries, $wpdb->num_queries );
     243
     244        $this->assertEquals( get_term( $term_id, 'post_tag' ), $term );
     245        $this->assertEquals( $num_queries, $wpdb->num_queries );
     246    }
     247
     248    /**
     249     * @ticket 21760
     250     */
     251    function test_get_term_by_slug_cache_update() {
     252        global $wpdb;
     253
     254        $term_id = $this->factory->term->create( array( 'slug' => 'burrito', 'name' => 'Taco', 'taxonomy' => 'post_tag' ) );
     255
     256        clean_term_cache( $term_id, 'post_tag' );
     257        $num_queries = $wpdb->num_queries;
     258
     259        $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     260        $num_queries++;
     261        $this->assertEquals( 'Taco', $term->name );
     262        $this->assertEquals( $num_queries, $wpdb->num_queries );
     263
     264        // This should now hit cache.
     265        $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     266        $this->assertEquals( 'Taco', $term->name );
     267        $this->assertEquals( $num_queries, $wpdb->num_queries );
     268
     269        // Update the tag which invalidates the cache.
     270        wp_update_term( $term_id, 'post_tag', array( 'name' => 'No Taco' ) );
     271        $num_queries = $wpdb->num_queries;
     272
     273        // This should not hit cache.
     274        $term = get_term_by( 'slug', 'burrito', 'post_tag' );
     275        $num_queries++;
     276        $this->assertEquals( 'No Taco', $term->name );
     277        $this->assertEquals( $num_queries, $wpdb->num_queries );
     278    }
     279
     280    /**
     281     * @ticket 21760
     282     */
     283    function test_get_term_by_name_cache() {
     284        global $wpdb;
     285
     286        $term_id = $this->factory->term->create( array( 'name' => 'Burrito', 'slug' => 'noburrito', 'taxonomy' => 'post_tag' ) );
     287
     288        clean_term_cache( $term_id, 'post_tag' );
     289        $num_queries = $wpdb->num_queries;
     290
     291        get_term_by( 'name', 'Burrito', 'post_tag' );
     292        $num_queries++;
     293        $this->assertEquals( $num_queries, $wpdb->num_queries );
     294
     295        // This should now hit cache.
     296        $term = get_term_by( 'name', 'Burrito', 'post_tag' );
     297        $this->assertEquals( $num_queries, $wpdb->num_queries );
     298
     299        $this->assertEquals( get_term( $term_id, 'post_tag' ), $term );
     300        $this->assertEquals( $num_queries, $wpdb->num_queries );
     301    }
     302
     303    /**
     304     * @ticket 21760
     305     */
     306    function test_get_term_by_name_cache_update() {
     307        global $wpdb;
     308
     309        $term_id = $this->factory->term->create( array( 'name' => 'Burrito', 'slug' => 'noburrito', 'taxonomy' => 'post_tag' ) );
     310
     311        clean_term_cache( $term_id, 'post_tag' );
     312        $num_queries = $wpdb->num_queries;
     313
     314        get_term_by( 'name', 'Burrito', 'post_tag' );
     315        $num_queries++;
     316        $this->assertEquals( $num_queries, $wpdb->num_queries );
     317
     318        // This should now hit cache.
     319        get_term_by( 'name', 'Burrito', 'post_tag' );
     320        $this->assertEquals( $num_queries, $wpdb->num_queries );
     321
     322        // Update the tag which invalidates the cache.
     323        wp_update_term( $term_id, 'post_tag', array( 'slug' => 'taco' ) );
     324        $num_queries = $wpdb->num_queries;
     325
     326        // This should not hit cache.
     327        get_term_by( 'name', 'burrito', 'post_tag' );
     328        $num_queries++;
     329        $this->assertEquals( $num_queries, $wpdb->num_queries );
     330    }
     331
     332    /**
     333     * @ticket 21760
     334     */
     335    function test_invalidating_term_caches_should_fail_when_invalidation_is_suspended() {
     336        global $wpdb;
     337
     338        $term_id = $this->factory->term->create( array( 'name' => 'Burrito', 'taxonomy' => 'post_tag' ) );
     339
     340        clean_term_cache( $term_id, 'post_tag' );
     341        $num_queries = $wpdb->num_queries;
     342        $last_changed = wp_cache_get( 'last_changed', 'terms' );
     343
     344        $term1 = get_term_by( 'name', 'Burrito', 'post_tag' );
     345        $num_queries++;
     346
     347        // Verify the term is cached.
     348        $term2 = get_term_by( 'name', 'Burrito', 'post_tag' );
     349        $this->assertEquals( $num_queries, $wpdb->num_queries );
     350        $this->assertEquals( $term1, $term2 );
     351
     352        $suspend = wp_suspend_cache_invalidation();
     353
     354        // Update the tag.
     355        wp_update_term( $term_id, 'post_tag', array( 'name' => 'Taco' ) );
     356        $num_queries = $wpdb->num_queries;
     357
     358        // Verify that the cached term still matches the initial cached term.
     359        $term3 = get_term_by( 'name', 'Burrito', 'post_tag' );
     360        $this->assertEquals( $num_queries, $wpdb->num_queries );
     361        $this->assertEquals( $term1, $term3 );
     362
     363        // Verify that last changed has not been updated as part of an invalidation routine.
     364        $this->assertSame( $last_changed, wp_cache_get( 'last_changed', 'terms' ) );
     365
     366        // Clean up.
     367        wp_suspend_cache_invalidation( $suspend );
     368    }
     369
     370    /**
     371     * @ticket 21760
     372     */
     373    public function test_get_term_by_does_not_prime_term_meta_cache() {
     374        global $wpdb;
     375
     376        $term_id = $this->factory->term->create( array( 'name' => 'Burrito', 'taxonomy' => 'post_tag' ) );
     377        add_term_meta( $term_id, 'foo', 'bar' );
     378
     379        clean_term_cache( $term_id, 'post_tag' );
     380        $num_queries = $wpdb->num_queries;
     381
     382        $term = get_term_by( 'name', 'Burrito', 'post_tag' );
     383        $num_queries++;
     384        $this->assertTrue( $term instanceof WP_Term );
     385        $this->assertSame( $term_id, $term->term_id );
     386        $this->assertEquals( $num_queries, $wpdb->num_queries );
     387
     388        $term_meta = get_term_meta( $term_id, 'foo', true );
     389        $num_queries++;
     390        $this->assertSame( $term_meta, 'bar' );
     391        $this->assertEquals( $num_queries, $wpdb->num_queries );
     392    }
    222393}
Note: See TracChangeset for help on using the changeset viewer.