Make WordPress Core


Ignore:
Timestamp:
10/19/2014 06:53:55 PM (12 years ago)
Author:
boonebgorges
Message:

Make orderby=meta_value compatible with meta_query when relation=OR.

Passing orderby=meta_value and meta_key=foo to WP_Query should require that
each matched post have a meta value with the key 'foo'. To make this
requirement compatible with meta_query params that have the relation OR, we
nest the meta_query param, and join it using AND to a meta_query clause
generated from the meta_key/meta_compare/meta_type query vars.

Fixes #25538.

File:
1 edited

Legend:

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

    r29940 r29964  
    11891189
    11901190        /**
     1191         * @group meta
     1192         * @ticket 29604
     1193         */
     1194        public function test_meta_query_with_orderby_meta_value_relation_or() {
     1195                $posts = $this->factory->post->create_many( 4 );
     1196                update_post_meta( $posts[0], 'foo', 5 );
     1197                update_post_meta( $posts[1], 'foo', 6 );
     1198                update_post_meta( $posts[2], 'foo', 4 );
     1199                update_post_meta( $posts[3], 'foo', 7 );
     1200
     1201                update_post_meta( $posts[0], 'bar1', 'baz' );
     1202                update_post_meta( $posts[1], 'bar1', 'baz' );
     1203                update_post_meta( $posts[2], 'bar2', 'baz' );
     1204
     1205                $query = new WP_Query( array(
     1206                        'orderby' => 'meta_value',
     1207                        'order' => 'ASC',
     1208                        'meta_key' => 'foo',
     1209                        'meta_query' => array(
     1210                                'relation' => 'OR',
     1211                                array(
     1212                                        'key' => 'bar1',
     1213                                        'value' => 'baz',
     1214                                        'compare' => '=',
     1215                                ),
     1216                                array(
     1217                                        'key' => 'bar2',
     1218                                        'value' => 'baz',
     1219                                        'compare' => '=',
     1220                                ),
     1221                        ),
     1222                        'update_post_meta_cache' => false,
     1223                        'update_post_term_cache' => false,
     1224                        'fields' => 'ids',
     1225                ) );
     1226
     1227                $this->assertEquals( array( $posts[2], $posts[0], $posts[1] ), $query->posts );
     1228        }
     1229
     1230        /**
     1231         * @group meta
     1232         * @ticket 29604
     1233         */
     1234        public function test_meta_query_with_orderby_meta_value_relation_and() {
     1235                $posts = $this->factory->post->create_many( 4 );
     1236                update_post_meta( $posts[0], 'foo', 5 );
     1237                update_post_meta( $posts[1], 'foo', 6 );
     1238                update_post_meta( $posts[2], 'foo', 4 );
     1239                update_post_meta( $posts[3], 'foo', 7 );
     1240
     1241                update_post_meta( $posts[0], 'bar1', 'baz' );
     1242                update_post_meta( $posts[1], 'bar1', 'baz' );
     1243                update_post_meta( $posts[2], 'bar1', 'baz' );
     1244                update_post_meta( $posts[3], 'bar1', 'baz' );
     1245                update_post_meta( $posts[0], 'bar2', 'baz' );
     1246                update_post_meta( $posts[1], 'bar2', 'baz' );
     1247                update_post_meta( $posts[2], 'bar2', 'baz' );
     1248
     1249                $query = new WP_Query( array(
     1250                        'orderby' => 'meta_value',
     1251                        'order' => 'ASC',
     1252                        'meta_key' => 'foo',
     1253                        'meta_query' => array(
     1254                                'relation' => 'AND',
     1255                                array(
     1256                                        'key' => 'bar1',
     1257                                        'value' => 'baz',
     1258                                        'compare' => '=',
     1259                                ),
     1260                                array(
     1261                                        'key' => 'bar2',
     1262                                        'value' => 'baz',
     1263                                        'compare' => '=',
     1264                                ),
     1265                        ),
     1266                        'update_post_meta_cache' => false,
     1267                        'update_post_term_cache' => false,
     1268                        'fields' => 'ids',
     1269                ) );
     1270
     1271                $this->assertEquals( array( $posts[2], $posts[0], $posts[1] ), $query->posts );
     1272        }
     1273
     1274        /**
    11911275         * @ticket 29642
    11921276         * @group meta
Note: See TracChangeset for help on using the changeset viewer.