WordPress.org

Make WordPress Core

Ticket #16814: 16814.2.diff

File 16814.2.diff, 3.3 KB (added by boonebgorges, 3 years ago)
  • src/wp-includes/query.php

    diff --git src/wp-includes/query.php src/wp-includes/query.php
    index a832e6d..dc9237f 100644
    class WP_Query { 
    22232223                        'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand', 
    22242224                ); 
    22252225 
    2226                 $meta_key = $this->get( 'meta_key' ); 
    2227                 if ( ! empty( $meta_key ) ) { 
    2228                         $allowed_keys[] = $meta_key; 
     2226                $meta_key = ''; 
     2227                $primary_meta_query = false; 
     2228                if ( ! empty( $this->meta_query->queries ) ) { 
     2229                        $meta_query = reset( $this->meta_query->queries ); 
     2230 
     2231                        if ( ! empty( $meta_query['key'] ) ) { 
     2232                                $meta_key = $meta_query['key']; 
     2233                                $allowed_keys[] = $meta_query['key']; 
     2234                        } 
     2235 
    22292236                        $allowed_keys[] = 'meta_value'; 
    22302237                        $allowed_keys[] = 'meta_value_num'; 
    22312238                } 
    class WP_Query { 
    22522259                                break; 
    22532260                        case $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 ); 
     2262                                if ( ! empty( $meta_query['type'] ) ) { 
     2263                                        $meta_type = $this->meta_query->get_cast_for_type( $meta_query['type'] ); 
    22582264                                        $orderby = "CAST($wpdb->postmeta.meta_value AS {$meta_type})"; 
    22592265                                } else { 
    22602266                                        $orderby = "$wpdb->postmeta.meta_value"; 
  • tests/phpunit/tests/meta.php

    diff --git tests/phpunit/tests/meta.php tests/phpunit/tests/meta.php
    index 8da40de..abf3ba5 100644
    class Tests_Meta extends WP_UnitTestCase { 
    162162                $this->assertEquals( $expected2, get_metadata( 'user', $this->author->ID, $key, true ) ); 
    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( 
    172177                        'fields' => 'ids', 
    class Tests_Meta extends WP_UnitTestCase { 
    181186 
    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 
    186232        function test_meta_cache_order_asc() {