Make WordPress Core


Ignore:
Timestamp:
01/18/2023 09:56:55 AM (3 years ago)
Author:
spacedmonkey
Message:

Taxonomy: Remove placeholder from WP_Term_Query cache key.

Remove escape placeholder from query cache key, as placeholders are on a based on a unique id on every request. This meant that it is impossible for a cache to be reused, making queries that use escape placeholders such as searches, meta queries or using the description__like / name__like parameters were unable to be cached.

Follow on from [54634].

Props spacedmonkey, peterwilsoncc.
Fixes #57298.

File:
1 edited

Legend:

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

    r53942 r55083  
    868868        $this->assertContains( $t1, $q->terms );
    869869    }
     870
     871    /**
     872     * Ensure cache keys are generated without WPDB placeholders.
     873     *
     874     * @ticket 57298
     875     *
     876     * @covers       WP_Term_Query::generate_cache_key
     877     * @dataProvider data_query_cache
     878     */
     879    public function test_generate_cache_key_placeholder( $args ) {
     880        global $wpdb;
     881        $query1 = new WP_Term_Query();
     882        $query1->query( $args );
     883
     884        $query_vars = $query1->query_vars;
     885        $request    = $query1->request;
     886
     887        $reflection = new ReflectionMethod( $query1, 'generate_cache_key' );
     888        $reflection->setAccessible( true );
     889
     890        $cache_key_1 = $reflection->invoke( $query1, $query_vars, $request );
     891
     892        $request_without_placeholder = $wpdb->remove_placeholder_escape( $request );
     893
     894        $cache_key_2 = $reflection->invoke( $query1, $query_vars, $request_without_placeholder );
     895
     896        $this->assertSame( $cache_key_1, $cache_key_2, 'Cache key differs when using wpdb placeholder.' );
     897    }
     898
     899    /**
     900     * Data provider.
     901     *
     902     * @return array[] Test parameters.
     903     */
     904    public function data_query_cache() {
     905        return array(
     906            'empty query'                => array(
     907                'args' => array(),
     908            ),
     909            'search query'               => array(
     910                'args' => array(
     911                    'search' => 'title',
     912                ),
     913            ),
     914            'search name query'          => array(
     915                'args' => array(
     916                    'name__like' => 'title',
     917                ),
     918            ),
     919            'search description query'   => array(
     920                'args' => array(
     921                    'description__like' => 'title',
     922                ),
     923            ),
     924            'meta query'                 => array(
     925                'args' => array(
     926                    'meta_query' => array(
     927                        array(
     928                            'key' => 'color',
     929                        ),
     930                    ),
     931                ),
     932            ),
     933            'meta query search'          => array(
     934                'args' => array(
     935                    'meta_query' => array(
     936                        array(
     937                            'key'     => 'color',
     938                            'value'   => '00',
     939                            'compare' => 'LIKE',
     940                        ),
     941                    ),
     942                ),
     943            ),
     944            'nested meta query search'   => array(
     945                'args' => array(
     946                    'meta_query' => array(
     947                        'relation' => 'AND',
     948                        array(
     949                            'key'     => 'color',
     950                            'value'   => '00',
     951                            'compare' => 'LIKE',
     952                        ),
     953                        array(
     954                            'relation' => 'OR',
     955                            array(
     956                                'key'     => 'color',
     957                                'value'   => '00',
     958                                'compare' => 'LIKE',
     959                            ),
     960                            array(
     961                                'relation' => 'AND',
     962                                array(
     963                                    'key'     => 'wp_test_suite',
     964                                    'value'   => '56802',
     965                                    'compare' => 'LIKE',
     966                                ),
     967                                array(
     968                                    'key'     => 'wp_test_suite_too',
     969                                    'value'   => '56802',
     970                                    'compare' => 'LIKE',
     971                                ),
     972                            ),
     973                        ),
     974                    ),
     975                ),
     976            ),
     977            'meta query not like search' => array(
     978                'args' => array(
     979                    'meta_query' => array(
     980                        array(
     981                            'key'     => 'color',
     982                            'value'   => 'ff',
     983                            'compare' => 'NOT LIKE',
     984                        ),
     985                    ),
     986                ),
     987            ),
     988        );
     989    }
    870990}
Note: See TracChangeset for help on using the changeset viewer.