Make WordPress Core


Ignore:
Timestamp:
10/18/2022 03:06:48 PM (4 years ago)
Author:
spacedmonkey
Message:

Query: Remove placeholder from query cache key.

Remove escape placeholder from query cache key, as placeholders are a based on a unique id on every request. This means that it is impossible for a cache to be reused, making queries that use escape placeholders such as LIKE searches, unable to be cached.

Props dhl, spacedmonkey, peterwilsoncc, desrosj, chaion07, davidbaumwald, mukesh27.
Fixes #56802.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/query/cacheResults.php

    r54352 r54634  
    3333         */
    3434        public static $author_id;
     35
     36        /**
     37         * @var array
     38         */
     39        protected $cache_args;
     40
     41        /**
     42         * @var string
     43         */
     44        protected $new_request;
    3545
    3646        public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
    … …  
    5868        }
    5969
     70        function set_up() {
     71                parent::set_up();
     72                $this->cache_args  = null;
     73                $this->new_request = null;
     74                add_filter( 'wp_query_cache_key', array( $this, 'filter_wp_query_cache_key' ), 15, 3 );
     75        }
     76
    6077        /**
    6178         * @dataProvider data_query_cache
    … …  
    6380         */
    6481        public function test_query_cache( $args ) {
    65                 $query1 = new WP_Query();
    66                 $posts1 = $query1->query( $args );
     82                global $wpdb;
     83
     84                $query1 = new WP_Query();
     85                $posts1 = $query1->query( $args );
     86
     87                $placeholder = $wpdb->placeholder_escape();
     88                $this->assertNotEmpty( $this->new_request, 'Check new request is not empty' );
     89                $this->assertStringNotContainsString( $placeholder, $this->new_request, 'Check if request does not contain placeholder' );
     90                $this->assertStringNotContainsString( $placeholder, wp_json_encode( $this->cache_args ), 'Check if cache arrays does not contain placeholder' );
    6791
    6892                $queries_before = get_num_queries();
    … …  
    192216                                ),
    193217                        ),
     218                        'cache meta query search'                     => array(
     219                                'args' => array(
     220                                        'cache_results' => true,
     221                                        'meta_query'    => array(
     222                                                array(
     223                                                        'key'     => 'color',
     224                                                        'value'   => '00',
     225                                                        'compare' => 'LIKE',
     226                                                ),
     227                                        ),
     228                                ),
     229                        ),
     230                        'cache meta query not search'                 => array(
     231                                'args' => array(
     232                                        'cache_results' => true,
     233                                        'meta_query'    => array(
     234                                                array(
     235                                                        'key'     => 'color',
     236                                                        'value'   => 'ff',
     237                                                        'compare' => 'NOT LIKE',
     238                                                ),
     239                                        ),
     240                                ),
     241                        ),
    194242                        'cache comment_count'                         => array(
    195243                                'args' => array(
    … …  
    208256                                                ),
    209257                                        ),
     258                                ),
     259                        ),
     260                        'cache search query'                          => array(
     261                                'args' => array(
     262                                        'cache_results' => true,
     263                                        's'             => 'title',
     264                                ),
     265                        ),
     266                        'cache search query multiple terms'           => array(
     267                                'args' => array(
     268                                        'cache_results' => true,
     269                                        's'             => 'Post title',
    210270                                ),
    211271                        ),
    … …  
    828888        }
    829889
     890        public function filter_wp_query_cache_key( $cache_key, $cache_args, $new_request ) {
     891                $this->cache_args  = $cache_args;
     892                $this->new_request = $new_request;
     893
     894                return $cache_key;
     895        }
     896
    830897        /**
    831898         * @ticket 22176
Note: See TracChangeset for help on using the changeset viewer.