Make WordPress Core

Ticket #52710: 52710.diff

File 52710.diff, 4.9 KB (added by dlh, 4 years ago)
  • src/wp-includes/class-wp-term-query.php

    diff --git src/wp-includes/class-wp-term-query.php src/wp-includes/class-wp-term-query.php
    index 465bcb7156..b3db41e514 100644
    class WP_Term_Query { 
    8888         * @since 4.6.0 Introduced 'term_taxonomy_id' parameter.
    8989         * @since 4.7.0 Introduced 'object_ids' parameter.
    9090         * @since 4.9.0 Added 'slug__in' support for 'orderby'.
     91         * @since 5.x.0 Introduced 'update_get_terms_cache' parameter.
    9192         *
    9293         * @param string|array $query {
    9394         *     Optional. Array or query string of term query parameters. Default empty.
    class WP_Term_Query { 
    174175         *                                                Default false.
    175176         *     @type string       $cache_domain           Unique cache key to be produced when this query is stored in
    176177         *                                                an object cache. Default is 'core'.
     178         *     @type bool         $update_get_terms_cache Whether to cache the query results. Default true.
    177179         *     @type bool         $update_term_meta_cache Whether to prime meta caches for matched terms. Default true.
    178180         *     @type array        $meta_query             Optional. Meta query clauses to limit retrieved terms by.
    179181         *                                                See `WP_Meta_Query`. Default empty.
    class WP_Term_Query { 
    213215                        'parent'                 => '',
    214216                        'childless'              => false,
    215217                        'cache_domain'           => 'core',
     218                        'update_get_terms_cache' => true,
    216219                        'update_term_meta_cache' => true,
    217220                        'meta_query'             => '',
    218221                        'meta_key'               => '',
    class WP_Term_Query { 
    736739                        return $this->terms;
    737740                }
    738741
    739                 // $args can be anything. Only use the args defined in defaults to compute the key.
    740                 $key          = md5( serialize( wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) ) ) . serialize( $taxonomies ) . $this->request );
    741                 $last_changed = wp_cache_get_last_changed( 'terms' );
    742                 $cache_key    = "get_terms:$key:$last_changed";
    743                 $cache        = wp_cache_get( $cache_key, 'terms' );
     742                $cache_key = false;
     743
     744                if ( ! empty( $args['update_get_terms_cache'] ) ) {
     745                        // $args can be anything. Only use the args defined in defaults to compute the key.
     746                        $key          = md5( serialize( wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) ) ) . serialize( $taxonomies ) . $this->request );
     747                        $last_changed = wp_cache_get_last_changed( 'terms' );
     748                        $cache_key    = "get_terms:$key:$last_changed";
     749                }
     750
     751                $cache = $cache_key ? wp_cache_get( $cache_key, 'terms' ) : false;
    744752                if ( false !== $cache ) {
    745753                        if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) {
    746754                                $cache = $this->populate_terms( $cache );
    class WP_Term_Query { 
    752760
    753761                if ( 'count' === $_fields ) {
    754762                        $count = $wpdb->get_var( $this->request );
    755                         wp_cache_set( $cache_key, $count, 'terms' );
     763                        if ( $cache_key ) {
     764                                wp_cache_set( $cache_key, $count, 'terms' );
     765                        }
    756766                        return $count;
    757767                }
    758768
    class WP_Term_Query { 
    769779                }
    770780
    771781                if ( empty( $terms ) ) {
    772                         wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS );
     782                        if ( $cache_key ) {
     783                                wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS );
     784                        }
    773785                        return array();
    774786                }
    775787
    class WP_Term_Query { 
    874886                        }
    875887                }
    876888
    877                 wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS );
     889                if ( $cache_key ) {
     890                        wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS );
     891                }
    878892
    879893                if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) {
    880894                        $terms = $this->populate_terms( $terms );
  • tests/phpunit/tests/term/getTerms.php

    diff --git tests/phpunit/tests/term/getTerms.php tests/phpunit/tests/term/getTerms.php
    index cb17e84238..380628693f 100644
    class Tests_Term_getTerms extends WP_UnitTestCase { 
    194194                // @todo Repeat with term insert and update.
    195195        }
    196196
     197        /**
     198         * @ticket 52710
     199         */
     200        public function test_get_terms_without_update_get_terms_cache() {
     201                global $wpdb;
     202
     203                $this->set_up_three_posts_and_tags();
     204
     205                $num_queries = $wpdb->num_queries;
     206
     207                // last_changed and num_queries should bump.
     208                $terms = get_terms(
     209                        'post_tag',
     210                        array(
     211                                'update_get_terms_cache' => false,
     212                                'update_term_meta_cache' => false,
     213                        )
     214                );
     215                $this->assertSame( 3, count( $terms ) );
     216                $this->assertEmpty( wp_cache_get( 'last_changed', 'terms' ) );
     217                $this->assertSame( $num_queries + 1, $wpdb->num_queries );
     218
     219                $num_queries = $wpdb->num_queries;
     220
     221                // last_changed and num_queries should bump again.
     222                $terms = get_terms(
     223                        'post_tag',
     224                        array(
     225                                'update_get_terms_cache' => false,
     226                                'update_term_meta_cache' => false,
     227                        )
     228                );
     229                $this->assertSame( 3, count( $terms ) );
     230                $this->assertEmpty( wp_cache_get( 'last_changed', 'terms' ) );
     231                $this->assertSame( $num_queries + 1, $wpdb->num_queries );
     232        }
     233
    197234        /**
    198235         * @ticket 23506
    199236         */