WordPress.org

Make WordPress Core

Ticket #22526: 22526.diff

File 22526.diff, 7.6 KB (added by wonderboymusic, 4 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}
     
    31173132                $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
    31183133                do_action( 'edited_term_taxonomy', $term, $taxonomy );
    31193134        }
     3135        set_taxonomy_last_changed( $taxonomy->name );
    31203136}
    31213137
    31223138/**
     
    31423158                $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
    31433159                do_action( 'edited_term_taxonomy', $term, $taxonomy );
    31443160        }
     3161        set_taxonomy_last_changed( $taxonomy->name );
    31453162}
    31463163
    31473164/**
     
    34693486
    34703487        return $parent;
    34713488}
     3489
     3490/**
     3491 * Retrieve the 'last_changed' value for the passed taxonomy. Retrieves
     3492 *  from cache, if present
     3493 *
     3494 * @since 3.9.0
     3495 *
     3496 * @param string $taxonomy
     3497 * @return int
     3498 */
     3499function get_taxonomy_last_changed( $taxonomy ) {
     3500        $last_changed = wp_cache_get( 'last_changed', $taxonomy );
     3501        if ( ! $last_changed ) {
     3502                $last_changed = microtime();
     3503                wp_cache_set( 'last_changed', $last_changed, $taxonomy );
     3504        }
     3505        return $last_changed;
     3506}
     3507
     3508/**
     3509 * Reset 'last_changed' for the passed taxonomy
     3510 *
     3511 * @since 3.9.0
     3512 *
     3513 * @param string $taxonomy
     3514 * @return int
     3515 */
     3516function set_taxonomy_last_changed( $taxonomy ) {
     3517        wp_cache_delete( 'last_changed', $taxonomy );
     3518        return get_taxonomy_last_changed( $taxonomy );
     3519}
     3520
     3521/**
     3522 * Determine if a post's cache for the passed taxonomy
     3523 *  is in sync.
     3524 * @since 3.9.0
     3525 *
     3526 * @param int $id
     3527 * @param string $taxonomy
     3528 * @return boolean
     3529 */
     3530function post_taxonomy_is_fresh( $id, $taxonomy ) {
     3531        $last_changed = get_taxonomy_last_changed( $taxonomy );
     3532        $post_last_changed = wp_cache_get( $id, $taxonomy . '_last_changed' );
     3533        if ( ! $post_last_changed || $last_changed !== $post_last_changed ) {
     3534                wp_cache_set( $id, $last_changed, $taxonomy . '_last_changed' );
     3535                return false;
     3536        }
     3537        return true;
     3538}
     3539 No newline at end of file
  • tests/phpunit/tests/term.php

     
    571571        /**
    572572         * @ticket 22526
    573573         */
     574        function test_get_taxonomy_last_changed() {
     575                $last_changed = get_taxonomy_last_changed( 'category' );
     576                $last_changed_cache = wp_cache_get( 'last_changed', 'category' );
     577                $this->assertEquals( $last_changed, $last_changed_cache );
     578                wp_cache_delete( 'last_changed', 'category' );
     579                $this->assertEquals( $last_changed, $last_changed_cache );
     580                $last_changed = get_taxonomy_last_changed( 'category' );
     581                $this->assertNotEquals( $last_changed, $last_changed_cache );
     582
     583                $last_changed2 = get_taxonomy_last_changed( 'category' );
     584                $this->factory->category->create();
     585                $last_changed3 = get_taxonomy_last_changed( 'category' );
     586                $this->assertNotEquals( $last_changed2, $last_changed3 );
     587        }
     588       
     589        /**
     590         * @ticket 22526
     591         */
     592        function test_set_taxonomy_last_changed() {
     593                $last_changed1 = set_taxonomy_last_changed( 'category' );
     594                $last_changed2 = set_taxonomy_last_changed( 'category' );
     595                $this->assertNotEquals( $last_changed1, $last_changed2 );
     596
     597                $last_changed3 = set_taxonomy_last_changed( 'category' );
     598                $last_changed4 = get_taxonomy_last_changed( 'category' );
     599                $this->assertEquals( $last_changed3, $last_changed4 );
     600        }
     601
     602        /**
     603         * @ticket 22526
     604         */
     605        function test_post_taxonomy_is_fresh() {
     606                $post_id = $this->factory->post->create();
     607                $term_id = $this->factory->category->create( array( 'name' => 'Foo' ) );
     608                wp_set_post_categories( $post_id, $term_id );
     609
     610                $this->assertFalse( post_taxonomy_is_fresh( $post_id, 'category' ) );
     611                $this->assertTrue( post_taxonomy_is_fresh( $post_id, 'category' ) );
     612                $this->assertTrue( post_taxonomy_is_fresh( $post_id, 'category' ) );
     613
     614                wp_update_term( $term_id, 'category', array( 'name' => 'Bar' ) );
     615
     616                $this->assertFalse( post_taxonomy_is_fresh( $post_id, 'category' ) );
     617                get_the_category( $post_id );
     618                $this->assertTrue( post_taxonomy_is_fresh( $post_id, 'category' ) );
     619        }
     620
     621        /**
     622         * @ticket 22526
     623         */
    574624        function test_category_name_change() {
    575625                $term = $this->factory->category->create_and_get( array( 'name' => 'Foo' ) );
    576626                $post_id = $this->factory->post->create();