[wp-trac] [WordPress Trac] #36652: Use meta_value in a meta query to decide type format in SQL clause

WordPress Trac noreply at wordpress.org
Sat Apr 23 19:31:14 UTC 2016


#36652: Use meta_value in a meta query to decide type format in SQL clause
-------------------------+------------------------------
 Reporter:  ericlewis    |       Owner:
     Type:  enhancement  |      Status:  new
 Priority:  normal       |   Milestone:  Awaiting Review
Component:  Query        |     Version:
 Severity:  normal       |  Resolution:
 Keywords:               |     Focuses:
-------------------------+------------------------------
Description changed by ericlewis:

Old description:

> The SQL clause generated for a meta query
> [https://github.com/WordPress/WordPress/blob/4.5/wp-includes/class-wp-
> meta-query.php#L628 quotes the `meta_value` in a string].
>
> This means that if there's a post with a postmeta field for likes set to
> 2 and you run the query looking for posts with 10 or more likes
>
> {{{
> #!php
> <?php
> $query = new WP_Query( array(
>         'meta_query' => array(
>                         array(
>                                 'key' => 'likes',
>                                 'value' => 10,
>                                 'compare' => '>='
>                         )
>                 )
> ) );
> }}}
>
> the query will return the post with 2 likes. This is because the SQL is
> doing a string comparison, as both the column value and the compared-to
> value are strings.
>
> The fix for the developer is to supply a `type` parameter like `NUMERIC`
> in the meta query clause which coerces a numeric MySQL comparison.
>
> We could use the meta_value's type to decide the type format the value
> takes in the SQL clause, so that a query like this works as expected
> without the `type` parameter.
>
> This was [https://core.trac.wordpress.org/ticket/27272#comment:13
> suggested] by @boone in #27272.

New description:

 The SQL clause generated for a meta query
 [https://github.com/WordPress/WordPress/blob/4.5/wp-includes/class-wp-
 meta-query.php#L628 quotes the `meta_value` in a string].

 This means that if there's a post with a postmeta field for likes set to 2
 and you run the query looking for posts with 10 or more likes

 {{{
 #!php
 <?php
 $query = new WP_Query( array(
         'meta_query' => array(
                 array(
                         'key' => 'likes',
                         'value' => 10,
                         'compare' => '>='
                 )
         )
 ) );
 }}}

 the query will return the post with 2 likes. This is because the SQL is
 doing a string comparison, as both the column value and the compared-to
 value are strings.

 The fix for the developer is to supply a `type` parameter like `NUMERIC`
 in the meta query clause which coerces a numeric MySQL comparison.

 We could use the meta_value's type to decide the type format the value
 takes in the SQL clause, so that a query like this works as expected
 without the `type` parameter.

 This was [https://core.trac.wordpress.org/ticket/27272#comment:13
 suggested] by @boone in #27272.

--

--
Ticket URL: <https://core.trac.wordpress.org/ticket/36652#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list