Make WordPress Core

Ticket #14485: 14485.diff

File 14485.diff, 10.0 KB (added by wonderboymusic, 11 years ago)
  • src/wp-includes/taxonomy.php

     
    18761876                do_action( 'edit_term_taxonomies', $edit_tt_ids );
    18771877                $wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id) + compact( 'taxonomy' ) );
    18781878                do_action( 'edited_term_taxonomies', $edit_tt_ids );
     1879                set_taxonomy_last_changed( $taxonomy );
    18791880        }
    18801881
    18811882        $objects = $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) );
     
    19101911                $wpdb->delete( $wpdb->terms, array( 'term_id' => $term ) );
    19111912
    19121913        clean_term_cache($term, $taxonomy);
     1914        set_taxonomy_last_changed( $taxonomy );
    19131915
    19141916        do_action( 'delete_term', $term, $tt_id, $taxonomy, $deleted_term );
    19151917        do_action( "delete_$taxonomy", $term, $tt_id, $deleted_term );
     
    21622164                        do_action( 'edit_terms', $alias->term_id, $taxonomy );
    21632165                        $wpdb->update($wpdb->terms, compact('term_group'), array('term_id' => $alias->term_id) );
    21642166                        do_action( 'edited_terms', $alias->term_id, $taxonomy );
     2167                        set_taxonomy_last_changed( $taxonomy );
    21652168                }
    21662169        }
    21672170
     
    22232226        $term_id = apply_filters('term_id_filter', $term_id, $tt_id);
    22242227
    22252228        clean_term_cache($term_id, $taxonomy);
     2229        set_taxonomy_last_changed( $taxonomy );
    22262230
    22272231        do_action("created_term", $term_id, $tt_id, $taxonomy);
    22282232        do_action("created_$taxonomy", $term_id, $tt_id);
     
    23292333        }
    23302334
    23312335        wp_cache_delete( $object_id, $taxonomy . '_relationships' );
     2336        set_taxonomy_last_changed( $taxonomy );
    23322337
    23332338        do_action('set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids);
    23342339        return $tt_ids;
     
    24072412                $deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_tt_ids)", $object_id ) );
    24082413                do_action( 'deleted_term_relationships', $object_id, $tt_ids );
    24092414                wp_update_term_count( $tt_ids, $taxonomy );
     2415                set_taxonomy_last_changed( $taxonomy );
    24102416
    24112417                return (bool) $deleted;
    24122418        }
     
    25652571                        do_action( 'edit_terms', $alias->term_id, $taxonomy );
    25662572                        $wpdb->update( $wpdb->terms, compact('term_group'), array( 'term_id' => $alias->term_id ) );
    25672573                        do_action( 'edited_terms', $alias->term_id, $taxonomy );
     2574                        set_taxonomy_last_changed( $taxonomy );
    25682575                }
    25692576        }
    25702577
     
    26002607        $term_id = apply_filters('term_id_filter', $term_id, $tt_id);
    26012608
    26022609        clean_term_cache($term_id, $taxonomy);
     2610        set_taxonomy_last_changed( $taxonomy );
    26032611
    26042612        do_action("edited_term", $term_id, $tt_id, $taxonomy);
    26052613        do_action("edited_$taxonomy", $term_id, $tt_id);
     
    27382746
    27392747        $taxonomies = get_object_taxonomies( $object_type );
    27402748
    2741         foreach ( $object_ids as $id )
    2742                 foreach ( $taxonomies as $taxonomy )
     2749        foreach ( $object_ids as $id ) {
     2750                foreach ( $taxonomies as $taxonomy ) {
    27432751                        wp_cache_delete($id, "{$taxonomy}_relationships");
     2752                        set_taxonomy_last_changed( $taxonomy );
     2753                }
     2754        }
    27442755
    27452756        do_action('clean_object_term_cache', $object_ids, $object_type);
    27462757}
     
    28002811                }
    28012812
    28022813                do_action('clean_term_cache', $ids, $taxonomy);
     2814                set_taxonomy_last_changed( $taxonomy );
    28032815        }
    28042816
    28052817        wp_cache_set( 'last_changed', microtime(), 'terms' );
     
    28192831 * @return bool|array Empty array if $terms found, but not $taxonomy. False if nothing is in cache for $taxonomy and $id.
    28202832 */
    28212833function get_object_term_cache($id, $taxonomy) {
     2834        if ( ! post_taxonomy_is_fresh( $id, $taxonomy ) ) {
     2835                return false;
     2836        }
    28222837        $cache = wp_cache_get($id, "{$taxonomy}_relationships");
    28232838        return $cache;
    28242839}
     
    29332948function _get_term_hierarchy($taxonomy) {
    29342949        if ( !is_taxonomy_hierarchical($taxonomy) )
    29352950                return array();
    2936         $children = get_option("{$taxonomy}_children");
     2951        $children = false;
     2952        if ( taxonomy_hierarchy_is_fresh( $taxonomy ) ) {
     2953                $children = get_option( "{$taxonomy}_children" );
     2954        }
    29372955
    29382956        if ( is_array($children) )
    29392957                return $children;
    2940         $children = array();
    29412958        $terms = get_terms($taxonomy, array('get' => 'all', 'orderby' => 'id', 'fields' => 'id=>parent'));
    29422959        foreach ( $terms as $term_id => $parent ) {
    29432960                if ( $parent > 0 )
     
    31173134                $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
    31183135                do_action( 'edited_term_taxonomy', $term, $taxonomy );
    31193136        }
     3137        set_taxonomy_last_changed( $taxonomy->name );
    31203138}
    31213139
    31223140/**
     
    31423160                $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
    31433161                do_action( 'edited_term_taxonomy', $term, $taxonomy );
    31443162        }
     3163        set_taxonomy_last_changed( $taxonomy->name );
    31453164}
    31463165
    31473166/**
     
    34693488
    34703489        return $parent;
    34713490}
     3491
     3492/**
     3493 * Retrieve the 'last_changed' value for the passed taxonomy. Retrieves
     3494 *  from cache, if present
     3495 *
     3496 * @since 3.9.0
     3497 *
     3498 * @param string $taxonomy
     3499 * @return int
     3500 */
     3501function get_taxonomy_last_changed( $taxonomy ) {
     3502        $last_changed = wp_cache_get( 'last_changed', $taxonomy );
     3503        if ( ! $last_changed ) {
     3504                $last_changed = microtime();
     3505                wp_cache_set( 'last_changed', $last_changed, $taxonomy );
     3506        }
     3507        return $last_changed;
     3508}
     3509
     3510/**
     3511 * Reset 'last_changed' for the passed taxonomy
     3512 *
     3513 * @since 3.9.0
     3514 *
     3515 * @param string $taxonomy
     3516 * @return int
     3517 */
     3518function set_taxonomy_last_changed( $taxonomy ) {
     3519        wp_cache_delete( 'last_changed', $taxonomy );
     3520        return get_taxonomy_last_changed( $taxonomy );
     3521}
     3522
     3523/**
     3524 * Determine if a post's cache for the passed taxonomy
     3525 *  is in sync.
     3526 *
     3527 * @since 3.9.0
     3528 *
     3529 * @param int $id
     3530 * @param string $taxonomy
     3531 * @return boolean
     3532 */
     3533function post_taxonomy_is_fresh( $id, $taxonomy ) {
     3534        $last_changed = get_taxonomy_last_changed( $taxonomy );
     3535        $post_last_changed = wp_cache_get( $id, $taxonomy . '_last_changed' );
     3536        if ( ! $post_last_changed || $last_changed !== $post_last_changed ) {
     3537                wp_cache_set( $id, $last_changed, $taxonomy . '_last_changed' );
     3538                return false;
     3539        }
     3540        return true;
     3541}
     3542
     3543/**
     3544 * Determine if a hierarchy's cache for the passed taxonomy
     3545 *  is in sync.
     3546 *
     3547 * @since 3.9.0
     3548 *
     3549 * @param int $id
     3550 * @param string $taxonomy
     3551 * @return boolean
     3552 */
     3553function taxonomy_hierarchy_is_fresh( $taxonomy ) {
     3554        $last_changed = get_taxonomy_last_changed( $taxonomy );
     3555        $hierarchy_last_changed = wp_cache_get( 'hierarchy_last_changed', $taxonomy );
     3556        if ( ! $hierarchy_last_changed || $last_changed !== $hierarchy_last_changed ) {
     3557                wp_cache_set( 'hierarchy_last_changed', $last_changed, $taxonomy );
     3558                return false;
     3559        }
     3560        return true;
     3561}
     3562 No newline at end of file
  • tests/phpunit/tests/term.php

     
    568568                $this->assertEquals( 0, $count );
    569569        }
    570570
    571         /**
    572          * @ticket 22526
    573          */
     571        function test_get_taxonomy_last_changed() {
     572                $last_changed = get_taxonomy_last_changed( 'category' );
     573                $last_changed_cache = wp_cache_get( 'last_changed', 'category' );
     574                $this->assertEquals( $last_changed, $last_changed_cache );
     575                wp_cache_delete( 'last_changed', 'category' );
     576                $this->assertEquals( $last_changed, $last_changed_cache );
     577                $last_changed = get_taxonomy_last_changed( 'category' );
     578                $this->assertNotEquals( $last_changed, $last_changed_cache );
     579
     580                $last_changed2 = get_taxonomy_last_changed( 'category' );
     581                $this->factory->category->create();
     582                $last_changed3 = get_taxonomy_last_changed( 'category' );
     583                $this->assertNotEquals( $last_changed2, $last_changed3 );
     584        }
     585
     586        function test_set_taxonomy_last_changed() {
     587                $last_changed1 = set_taxonomy_last_changed( 'category' );
     588                $last_changed2 = set_taxonomy_last_changed( 'category' );
     589                $this->assertNotEquals( $last_changed1, $last_changed2 );
     590
     591                $last_changed3 = set_taxonomy_last_changed( 'category' );
     592                $last_changed4 = get_taxonomy_last_changed( 'category' );
     593                $this->assertEquals( $last_changed3, $last_changed4 );
     594        }
     595
     596        function test_post_taxonomy_is_fresh() {
     597                $post_id = $this->factory->post->create();
     598                $term_id = $this->factory->category->create( array( 'name' => 'Foo' ) );
     599                wp_set_post_categories( $post_id, $term_id );
     600
     601                $this->assertFalse( post_taxonomy_is_fresh( $post_id, 'category' ) );
     602                $this->assertTrue( post_taxonomy_is_fresh( $post_id, 'category' ) );
     603                $this->assertTrue( post_taxonomy_is_fresh( $post_id, 'category' ) );
     604
     605                wp_update_term( $term_id, 'category', array( 'name' => 'Bar' ) );
     606
     607                $this->assertFalse( post_taxonomy_is_fresh( $post_id, 'category' ) );
     608                get_the_category( $post_id );
     609                $this->assertTrue( post_taxonomy_is_fresh( $post_id, 'category' ) );
     610        }
     611
    574612        function test_category_name_change() {
    575613                $term = $this->factory->category->create_and_get( array( 'name' => 'Foo' ) );
    576614                $post_id = $this->factory->post->create();
     
    584622                $cats2 = get_the_category( $post->ID );
    585623                $this->assertNotEquals( $term->name, reset( $cats2 )->name );
    586624        }
     625
     626        function test_hierachy_invalidation() {
     627                $tax = 'burrito';
     628                register_taxonomy( $tax, 'post', array( 'hierarchical' => true ) );
     629                $this->assertTrue( get_taxonomy( $tax )->hierarchical );
     630
     631                $step = 1;
     632                $parent_id = 0;
     633                $children = 0;
     634
     635                foreach ( range( 1, 99 ) as $i ) {
     636                        switch ( $step ) {
     637                        case 1:
     638                                $parent = wp_insert_term( 'Parent' . $i, $tax );
     639                                $parent_id = $parent['term_id'];
     640                                break;
     641                        case 2:
     642                                $parent = wp_insert_term( 'Child' . $i, $tax, array( 'parent' => $parent_id ) );
     643                                $parent_id = $parent['term_id'];
     644                                $children++;
     645                                break;
     646                        case 3:
     647                                wp_insert_term( 'Grandchild' . $i, $tax, array( 'parent' => $parent_id ) );
     648                                $parent_id = 0;
     649                                $children++;
     650                                break;
     651                        }
     652
     653                        $terms = get_terms( $tax, array( 'hide_empty' => false ) );
     654                        $this->assertEquals( $i, count( $terms ) );
     655                        if ( 1 < $i ) {
     656                                $hierarchy = _get_term_hierarchy( $tax );
     657                                $this->assertNotEmpty( $hierarchy );
     658                                $this->assertEquals( $children, count( $hierarchy, COUNT_RECURSIVE ) - count( $hierarchy ) );
     659                        }
     660
     661                        if ( $i % 3 === 0 ) {
     662                                $step = 1;
     663                        } else {
     664                                $step++;
     665                        }
     666                }
     667
     668                _unregister_taxonomy( $tax );
     669        }
    587670}