Make WordPress Core

Ticket #53450: 53450_v3.diff

File 53450_v3.diff, 6.8 KB (added by janthiel, 3 years ago)

Added more complex Test cases

  • src/wp-includes/class-wp-meta-query.php

    diff --git a/src/wp-includes/class-wp-meta-query.php b/src/wp-includes/class-wp-meta-query.php
    index 5a1b0c41479..b0977aa6f67 100644
    a b class WP_Meta_Query { 
    102102         * @since 5.1.0 Introduced $compare_key clause parameter, which enables LIKE key matches.
    103103         * @since 5.3.0 Increased the number of operators available to $compare_key. Introduced $type_key,
    104104         *              which enables the $key to be cast to a new data type for comparisons.
     105         * @since 5.9.0 Adds LIKE based STARTSWITH and ENDSWITH operators for value compares
    105106         *
    106107         * @param array $meta_query {
    107108         *     Array of meta query clauses. When first-order clauses or sub-clauses use strings as
    class WP_Meta_Query { 
    123124         *         @type string $value       Meta value to filter by.
    124125         *         @type string $compare     MySQL operator used for comparing the $value. Accepts '=',
    125126         *                                   '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE',
     127         *                                   'STARTSWITH', 'NOT STARTSWITH', 'ENDSWITH', 'NOT ENDSWITH',
    126128         *                                   'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'REGEXP',
    127129         *                                   'NOT REGEXP', 'RLIKE', 'EXISTS' or 'NOT EXISTS'.
    128130         *                                   Default is 'IN' when `$value` is an array, '=' otherwise.
    public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) 
    509511                        '=',
    510512                        '!=',
    511513                        'LIKE',
     514                        'STARTSWITH',
     515                        'ENDSWITH',
    512516                        'NOT LIKE',
     517                        'NOT STARTSWITH',
     518                        'NOT ENDSWITH',
    513519                        'IN',
    514520                        'NOT IN',
    515521                        'EXISTS',
    public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) 
    713719                                        $where      = $wpdb->prepare( '%s', $meta_value );
    714720                                        break;
    715721
     722                                case 'STARTSWITH':
     723                                case 'NOT STARTSWITH':
     724                                        $meta_compare = 'STARTSWITH' === $meta_compare ? 'LIKE' : 'NOT LIKE';
     725                                        $meta_value   = $wpdb->esc_like( $meta_value ) . '%';
     726                                        $where        = $wpdb->prepare( '%s', $meta_value );
     727                                        break;
     728
     729                                case 'ENDSWITH':
     730                                case 'NOT ENDSWITH':
     731                                        $meta_compare = 'ENDSWITH' === $meta_compare ? 'LIKE' : 'NOT LIKE';
     732                                        $meta_value   = '%' . $wpdb->esc_like( $meta_value );
     733                                        $where        = $wpdb->prepare( '%s', $meta_value );
     734                                        break;
     735
    716736                                // EXISTS with a value is interpreted as '='.
    717737                                case 'EXISTS':
    718738                                        $meta_compare = '=';
  • tests/phpunit/tests/query/metaQuery.php

    diff --git a/tests/phpunit/tests/query/metaQuery.php b/tests/phpunit/tests/query/metaQuery.php
    index 5acec55d3f9..03ad7766373 100644
    a b public function test_meta_query_single_query_compare_not_like() { 
    271271                $this->assertSameSets( $expected, $query->posts );
    272272        }
    273273
     274        public function test_meta_query_single_query_compare_startswith() {
     275                $p1 = self::factory()->post->create();
     276                $p2 = self::factory()->post->create();
     277                $p3 = self::factory()->post->create();
     278                $p4 = self::factory()->post->create();
     279                $p5 = self::factory()->post->create();
     280                $p6 = self::factory()->post->create();
     281
     282                add_post_meta( $p1, 'foo', 'barSTARTSWITH' );
     283                add_post_meta( $p2, 'foo', 'ENDSWITHbar' );
     284                add_post_meta( $p3, 'foo', 'CONTAINSbarCONTAINS' );
     285                add_post_meta( $p4, 'foo', 'nomatch' );
     286                add_post_meta( $p5, 'foo', 'barbar' );
     287
     288                $query = new WP_Query(
     289                        array(
     290                                'update_post_meta_cache' => false,
     291                                'update_post_term_cache' => false,
     292                                'fields'                 => 'ids',
     293                                'meta_query'             => array(
     294                                        array(
     295                                                'key'     => 'foo',
     296                                                'value'   => 'bar',
     297                                                'compare' => 'STARTSWITH',
     298                                        ),
     299                                ),
     300                        )
     301                );
     302
     303                $expected = array( $p1, $p5 );
     304                $this->assertSameSets( $expected, $query->posts );
     305        }
     306
     307        public function test_meta_query_single_query_compare_not_startswith() {
     308                $p1 = self::factory()->post->create();
     309                $p2 = self::factory()->post->create();
     310                $p3 = self::factory()->post->create();
     311                $p4 = self::factory()->post->create();
     312                $p5 = self::factory()->post->create();
     313                $p6 = self::factory()->post->create();
     314
     315                add_post_meta( $p1, 'foo', 'barSTARTSWITH' );
     316                add_post_meta( $p2, 'foo', 'ENDSWITHbar' );
     317                add_post_meta( $p3, 'foo', 'CONTAINSbarCONTAINS' );
     318                add_post_meta( $p4, 'foo', 'nomatch' );
     319                add_post_meta( $p5, 'foo', 'barbar' );
     320
     321                $query = new WP_Query(
     322                        array(
     323                                'update_post_meta_cache' => false,
     324                                'update_post_term_cache' => false,
     325                                'fields'                 => 'ids',
     326                                'meta_query'             => array(
     327                                        array(
     328                                                'key'     => 'foo',
     329                                                'value'   => 'bar',
     330                                                'compare' => 'NOT STARTSWITH',
     331                                        ),
     332                                ),
     333                        )
     334                );
     335
     336                $expected = array( $p2, $p3, $p4 );
     337                $this->assertSameSets( $expected, $query->posts );
     338        }
     339
     340        public function test_meta_query_single_query_compare_endswith() {
     341                $p1 = self::factory()->post->create();
     342                $p2 = self::factory()->post->create();
     343                $p3 = self::factory()->post->create();
     344                $p4 = self::factory()->post->create();
     345                $p5 = self::factory()->post->create();
     346                $p6 = self::factory()->post->create();
     347
     348                add_post_meta( $p1, 'foo', 'barSTARTSWITH' );
     349                add_post_meta( $p2, 'foo', 'ENDSWITHbar' );
     350                add_post_meta( $p3, 'foo', 'CONTAINSbarCONTAINS' );
     351                add_post_meta( $p4, 'foo', 'nomatch' );
     352                add_post_meta( $p5, 'foo', 'barbar' );
     353
     354                $query = new WP_Query(
     355                        array(
     356                                'update_post_meta_cache' => false,
     357                                'update_post_term_cache' => false,
     358                                'fields'                 => 'ids',
     359                                'meta_query'             => array(
     360                                        array(
     361                                                'key'     => 'foo',
     362                                                'value'   => 'ar',
     363                                                'compare' => 'ENDSWITH',
     364                                        ),
     365                                ),
     366                        )
     367                );
     368
     369                $expected = array( $p2, $p5 );
     370                $this->assertSameSets( $expected, $query->posts );
     371        }
     372
     373        public function test_meta_query_single_query_compare_not_endswith() {
     374                $p1 = self::factory()->post->create();
     375                $p2 = self::factory()->post->create();
     376                $p3 = self::factory()->post->create();
     377                $p4 = self::factory()->post->create();
     378                $p5 = self::factory()->post->create();
     379                $p6 = self::factory()->post->create();
     380
     381                add_post_meta( $p1, 'foo', 'barSTARTSWITH' );
     382                add_post_meta( $p2, 'foo', 'ENDSWITHbar' );
     383                add_post_meta( $p3, 'foo', 'CONTAINSbarCONTAINS' );
     384                add_post_meta( $p4, 'foo', 'nomatch' );
     385                add_post_meta( $p5, 'foo', 'barbar' );
     386
     387                $query = new WP_Query(
     388                        array(
     389                                'update_post_meta_cache' => false,
     390                                'update_post_term_cache' => false,
     391                                'fields'                 => 'ids',
     392                                'meta_query'             => array(
     393                                        array(
     394                                                'key'     => 'foo',
     395                                                'value'   => 'bar',
     396                                                'compare' => 'NOT ENDSWITH',
     397                                        ),
     398                                ),
     399                        )
     400                );
     401
     402                $expected = array( $p1, $p3, $p4 );
     403                $this->assertSameSets( $expected, $query->posts );
     404        }
     405
    274406        public function test_meta_query_single_query_compare_between_not_between() {
    275407                $p1 = self::factory()->post->create();
    276408                $p2 = self::factory()->post->create();