Make WordPress Core

Changeset 29855


Ignore:
Timestamp:
10/08/2014 03:11:14 PM (10 years ago)
Author:
kovshenin
Message:

Use the primary meta_query clause when parsing orderby in WP_Query.

When using legacy meta_key, meta_value, etc. arguments in WP_Query,
they're converted into the first clause of a meta_query. By using that
clause instead of the original arguments, we make sure that behavior is
consistent between the two available formats.

props boonebgorges.
fixes #16814.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/query.php

    r29760 r29855  
    22242224        );
    22252225
    2226         $meta_key = $this->get( 'meta_key' );
    2227         if ( ! empty( $meta_key ) ) {
    2228             $allowed_keys[] = $meta_key;
     2226        $primary_meta_key = '';
     2227        $primary_meta_query = false;
     2228        if ( ! empty( $this->meta_query->queries ) ) {
     2229            $primary_meta_query = reset( $this->meta_query->queries );
     2230
     2231            if ( ! empty( $primary_meta_query['key'] ) ) {
     2232                $primary_meta_key = $primary_meta_query['key'];
     2233                $allowed_keys[] = $primary_meta_key;
     2234            }
     2235
    22292236            $allowed_keys[] = 'meta_value';
    22302237            $allowed_keys[] = 'meta_value_num';
     
    22512258                $orderby = 'RAND()';
    22522259                break;
    2253             case $meta_key:
     2260            case $primary_meta_key:
    22542261            case 'meta_value':
    2255                 $type = $this->get( 'meta_type' );
    2256                 if ( ! empty( $type ) ) {
    2257                     $meta_type = $this->meta_query->get_cast_for_type( $type );
    2258                     $orderby = "CAST($wpdb->postmeta.meta_value AS {$meta_type})";
     2262                if ( ! empty( $primary_meta_query['type'] ) ) {
     2263                    $sql_type = $this->meta_query->get_cast_for_type( $primary_meta_query['type'] );
     2264                    $orderby = "CAST($wpdb->postmeta.meta_value AS {$sql_type})";
    22592265                } else {
    22602266                    $orderby = "$wpdb->postmeta.meta_value";
  • trunk/tests/phpunit/tests/meta.php

    r29650 r29855  
    163163    }
    164164
     165    /**
     166     * @ticket 16814
     167     */
    165168    function test_meta_type_cast() {
    166169        $post_id1 = $this->factory->post->create();
    167170        add_post_meta( $post_id1, 'num_as_longtext', 123 );
     171        add_post_meta( $post_id1, 'num_as_longtext_desc', 10 );
    168172        $post_id2 = $this->factory->post->create();
    169173        add_post_meta( $post_id2, 'num_as_longtext', 99 );
     174        add_post_meta( $post_id2, 'num_as_longtext_desc', 100 );
    170175
    171176        $posts = new WP_Query( array(
     
    182187        $this->assertEquals( array( $post_id2, $post_id1 ), $posts->posts );
    183188        $this->assertEquals( 2, substr_count( $posts->request, 'CAST(' ) );
     189
     190        // Make sure the newer meta_query syntax behaves in a consistent way
     191        $posts = new WP_Query( array(
     192            'fields' => 'ids',
     193            'post_type' => 'any',
     194            'meta_query' => array(
     195                array(
     196                    'key' => 'num_as_longtext',
     197                    'value' => '0',
     198                    'compare' => '>',
     199                    'type' => 'UNSIGNED',
     200                ),
     201            ),
     202            'orderby' => 'meta_value',
     203            'order' => 'ASC'
     204        ) );
     205
     206        $this->assertEquals( array( $post_id2, $post_id1 ), $posts->posts );
     207        $this->assertEquals( 2, substr_count( $posts->request, 'CAST(' ) );
     208
     209        // The legacy `meta_key` value should take precedence.
     210        $posts = new WP_Query( array(
     211            'fields' => 'ids',
     212            'post_type' => 'any',
     213            'meta_key' => 'num_as_longtext',
     214            'meta_compare' => '>',
     215            'meta_type' => 'UNSIGNED',
     216            'meta_query' => array(
     217                array(
     218                    'key' => 'num_as_longtext_desc',
     219                    'value' => '0',
     220                    'compare' => '>',
     221                    'type' => 'UNSIGNED',
     222                ),
     223            ),
     224            'orderby' => 'meta_value',
     225            'order' => 'ASC'
     226        ) );
     227
     228        $this->assertEquals( array( $post_id2, $post_id1 ), $posts->posts );
     229        $this->assertEquals( 2, substr_count( $posts->request, 'CAST(' ) );
    184230    }
    185231
Note: See TracChangeset for help on using the changeset viewer.