Make WordPress Core

Changeset 31286


Ignore:
Timestamp:
01/27/2015 08:03:50 PM (12 years ago)
Author:
boonebgorges
Message:

Improve organiation of tax_query and meta_query unit tests.

meta_query tests have been moved to tests/phpunit/tests/query/metaQuery.php and tax_query tests to tests/phpunit/tests/query/taxQuery.php. This is an improvement because (a) it better corresponds to the way that other WP_Query parameter tests are organized, (b) splitting meta and tax tests into separate classes simplifies the required @group annotations, and (c) the tests have nothing to do with posts per se, and so do not belong in the post subdirectory.

The tests previously found at tests/phpunit/tests/query/taxQuery.php have been moved to isTerm.php in the same directory. These tests are related to the is_* functions that have to do with taxonomy terms, like is_category().

See #26999.

Location:
trunk/tests/phpunit/tests
Files:
1 added
2 edited
1 copied

Legend:

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

    r30846 r31286  
    44        function setUp() {
    55                parent::setUp();
    6         }
    7 
    8         /**
    9          * @group meta
    10          */
    11         public function test_meta_query_no_key() {
    12                 $p1 = $this->factory->post->create();
    13                 $p2 = $this->factory->post->create();
    14                 $p3 = $this->factory->post->create();
    15 
    16                 add_post_meta( $p1, 'foo', 'bar' );
    17                 add_post_meta( $p2, 'oof', 'bar' );
    18                 add_post_meta( $p3, 'oof', 'baz' );
    19 
    20                 $query = new WP_Query( array(
    21                         'update_post_meta_cache' => false,
    22                         'update_post_term_cache' => false,
    23                         'fields' => 'ids',
    24                         'meta_query' => array(
    25                                 array(
    26                                         'value' => 'bar',
    27                                 ),
    28                         ),
    29                 ) );
    30 
    31                 $expected = array( $p1, $p2 );
    32                 $this->assertEqualSets( $expected, $query->posts );
    33         }
    34 
    35         /**
    36          * @group meta
    37          */
    38         public function test_meta_query_no_value() {
    39                 $p1 = $this->factory->post->create();
    40                 $p2 = $this->factory->post->create();
    41                 $p3 = $this->factory->post->create();
    42 
    43                 add_post_meta( $p1, 'foo', 'bar' );
    44                 add_post_meta( $p2, 'oof', 'bar' );
    45                 add_post_meta( $p3, 'oof', 'baz' );
    46 
    47                 $query = new WP_Query( array(
    48                         'update_post_meta_cache' => false,
    49                         'update_post_term_cache' => false,
    50                         'fields' => 'ids',
    51                         'meta_query' => array(
    52                                 array(
    53                                         'key' => 'oof',
    54                                 ),
    55                         ),
    56                 ) );
    57 
    58                 $expected = array( $p2, $p3 );
    59                 $this->assertEqualSets( $expected, $query->posts );
    60         }
    61 
    62         /**
    63          * @group meta
    64          */
    65         public function test_meta_query_single_query_compare_default() {
    66                 $p1 = $this->factory->post->create();
    67                 $p2 = $this->factory->post->create();
    68 
    69                 add_post_meta( $p1, 'foo', 'bar' );
    70 
    71                 $query = new WP_Query( array(
    72                         'update_post_meta_cache' => false,
    73                         'update_post_term_cache' => false,
    74                         'fields' => 'ids',
    75                         'meta_query' => array(
    76                                 array(
    77                                         'key' => 'foo',
    78                                         'value' => 'bar',
    79                                 ),
    80                         ),
    81                 ) );
    82 
    83                 $expected = array( $p1 );
    84                 $this->assertEqualSets( $expected, $query->posts );
    85         }
    86 
    87         /**
    88          * @group meta
    89          */
    90         public function test_meta_query_single_query_compare_equals() {
    91                 $p1 = $this->factory->post->create();
    92                 $p2 = $this->factory->post->create();
    93 
    94                 add_post_meta( $p1, 'foo', 'bar' );
    95 
    96                 $query = new WP_Query( array(
    97                         'update_post_meta_cache' => false,
    98                         'update_post_term_cache' => false,
    99                         'fields' => 'ids',
    100                         'meta_query' => array(
    101                                 array(
    102                                         'key' => 'foo',
    103                                         'value' => 'bar',
    104                                         'compare' => '=',
    105                                 ),
    106                         ),
    107                 ) );
    108 
    109                 $expected = array( $p1 );
    110                 $this->assertEqualSets( $expected, $query->posts );
    111         }
    112 
    113         /**
    114          * @group meta
    115          */
    116         public function test_meta_query_single_query_compare_not_equals() {
    117                 $p1 = $this->factory->post->create();
    118                 $p2 = $this->factory->post->create();
    119                 $p3 = $this->factory->post->create();
    120 
    121                 add_post_meta( $p1, 'foo', 'bar' );
    122                 add_post_meta( $p2, 'foo', 'baz' );
    123 
    124                 $query = new WP_Query( array(
    125                         'update_post_meta_cache' => false,
    126                         'update_post_term_cache' => false,
    127                         'fields' => 'ids',
    128                         'meta_query' => array(
    129                                 array(
    130                                         'key' => 'foo',
    131                                         'value' => 'bar',
    132                                         'compare' => '!=',
    133                                 ),
    134                         ),
    135                 ) );
    136 
    137                 $expected = array( $p2 );
    138                 $this->assertEqualSets( $expected, $query->posts );
    139         }
    140 
    141         /**
    142          * @group meta
    143          */
    144         public function test_meta_query_single_query_compare_arithmetic_comparisons() {
    145                 $p1 = $this->factory->post->create();
    146                 $p2 = $this->factory->post->create();
    147                 $p3 = $this->factory->post->create();
    148 
    149                 add_post_meta( $p1, 'foo', '1' );
    150                 add_post_meta( $p2, 'foo', '2' );
    151                 add_post_meta( $p3, 'foo', '3' );
    152 
    153                 // <
    154                 $query = new WP_Query( array(
    155                         'update_post_meta_cache' => false,
    156                         'update_post_term_cache' => false,
    157                         'fields' => 'ids',
    158                         'meta_query' => array(
    159                                 array(
    160                                         'key' => 'foo',
    161                                         'value' => 2,
    162                                         'compare' => '<',
    163                                 ),
    164                         ),
    165                 ) );
    166 
    167                 $expected = array( $p1 );
    168                 $this->assertEqualSets( $expected, $query->posts );
    169 
    170                 // <=
    171                 $query = new WP_Query( array(
    172                         'update_post_meta_cache' => false,
    173                         'update_post_term_cache' => false,
    174                         'fields' => 'ids',
    175                         'meta_query' => array(
    176                                 array(
    177                                         'key' => 'foo',
    178                                         'value' => 2,
    179                                         'compare' => '<=',
    180                                 ),
    181                         ),
    182                 ) );
    183 
    184                 $expected = array( $p1, $p2 );
    185                 $this->assertEqualSets( $expected, $query->posts );
    186 
    187                 // >=
    188                 $query = new WP_Query( array(
    189                         'update_post_meta_cache' => false,
    190                         'update_post_term_cache' => false,
    191                         'fields' => 'ids',
    192                         'meta_query' => array(
    193                                 array(
    194                                         'key' => 'foo',
    195                                         'value' => 2,
    196                                         'compare' => '>=',
    197                                 ),
    198                         ),
    199                 ) );
    200 
    201                 $expected = array( $p2, $p3 );
    202                 $this->assertEqualSets( $expected, $query->posts );
    203 
    204                 // >
    205                 $query = new WP_Query( array(
    206                         'update_post_meta_cache' => false,
    207                         'update_post_term_cache' => false,
    208                         'fields' => 'ids',
    209                         'meta_query' => array(
    210                                 array(
    211                                         'key' => 'foo',
    212                                         'value' => 2,
    213                                         'compare' => '>',
    214                                 ),
    215                         ),
    216                 ) );
    217 
    218                 $expected = array( $p3 );
    219                 $this->assertEqualSets( $expected, $query->posts );
    220         }
    221 
    222         /**
    223          * @group meta
    224          */
    225         public function test_meta_query_single_query_compare_like() {
    226                 $p1 = $this->factory->post->create();
    227                 $p2 = $this->factory->post->create();
    228 
    229                 add_post_meta( $p1, 'foo', 'bar' );
    230 
    231                 $query = new WP_Query( array(
    232                         'update_post_meta_cache' => false,
    233                         'update_post_term_cache' => false,
    234                         'fields' => 'ids',
    235                         'meta_query' => array(
    236                                 array(
    237                                         'key' => 'foo',
    238                                         'value' => 'ba',
    239                                         'compare' => 'LIKE',
    240                                 ),
    241                         ),
    242                 ) );
    243 
    244                 $expected = array( $p1 );
    245                 $this->assertEqualSets( $expected, $query->posts );
    246         }
    247 
    248         /**
    249          * @group meta
    250          */
    251         public function test_meta_query_single_query_compare_not_like() {
    252                 $p1 = $this->factory->post->create();
    253                 $p2 = $this->factory->post->create();
    254                 $p3 = $this->factory->post->create();
    255 
    256                 add_post_meta( $p1, 'foo', 'bar' );
    257                 add_post_meta( $p2, 'foo', 'rab' );
    258 
    259                 $query = new WP_Query( array(
    260                         'update_post_meta_cache' => false,
    261                         'update_post_term_cache' => false,
    262                         'fields' => 'ids',
    263                         'meta_query' => array(
    264                                 array(
    265                                         'key' => 'foo',
    266                                         'value' => 'ba',
    267                                         'compare' => 'NOT LIKE',
    268                                 ),
    269                         ),
    270                 ) );
    271 
    272                 $expected = array( $p2 );
    273                 $this->assertEqualSets( $expected, $query->posts );
    274         }
    275 
    276         /**
    277          * @group meta
    278          */
    279         public function test_meta_query_single_query_compare_between_not_between() {
    280                 $p1 = $this->factory->post->create();
    281                 $p2 = $this->factory->post->create();
    282                 $p3 = $this->factory->post->create();
    283 
    284                 add_post_meta( $p1, 'foo', '1' );
    285                 add_post_meta( $p2, 'foo', '10' );
    286                 add_post_meta( $p3, 'foo', '100' );
    287 
    288                 $query = new WP_Query( array(
    289                         'update_post_meta_cache' => false,
    290                         'update_post_term_cache' => false,
    291                         'fields' => 'ids',
    292                         'meta_query' => array(
    293                                 array(
    294                                         'key' => 'foo',
    295                                         'value' => array( 9, 12 ),
    296                                         'compare' => 'BETWEEN',
    297                                         'type' => 'NUMERIC',
    298                                 ),
    299                         ),
    300                 ) );
    301 
    302                 $expected = array( $p2 );
    303                 $this->assertEqualSets( $expected, $query->posts );
    304 
    305                 $query = new WP_Query( array(
    306                         'update_post_meta_cache' => false,
    307                         'update_post_term_cache' => false,
    308                         'fields' => 'ids',
    309                         'meta_query' => array(
    310                                 array(
    311                                         'key' => 'foo',
    312                                         'value' => array( 9, 12 ),
    313                                         'compare' => 'NOT BETWEEN',
    314                                         'type' => 'NUMERIC',
    315                                 ),
    316                         ),
    317                 ) );
    318 
    319                 $expected = array( $p1, $p3 );
    320                 $this->assertEqualSets( $expected, $query->posts );
    321         }
    322 
    323         /**
    324          * @group meta
    325          */
    326         public function test_meta_query_single_query_compare_regexp_rlike() {
    327                 $p1 = $this->factory->post->create();
    328                 $p2 = $this->factory->post->create();
    329 
    330                 add_post_meta( $p1, 'foo', 'bar' );
    331                 add_post_meta( $p2, 'foo', 'baz' );
    332 
    333                 $query = new WP_Query( array(
    334                         'update_post_meta_cache' => false,
    335                         'update_post_term_cache' => false,
    336                         'fields' => 'ids',
    337                         'meta_query' => array(
    338                                 array(
    339                                         'key' => 'foo',
    340                                         'value' => 'z$',
    341                                         'compare' => 'REGEXP',
    342                                 ),
    343                         ),
    344                 ) );
    345 
    346                 $expected = array( $p2 );
    347                 $this->assertEqualSets( $expected, $query->posts );
    348 
    349                 // RLIKE is a synonym for REGEXP.
    350                 $query = new WP_Query( array(
    351                         'update_post_meta_cache' => false,
    352                         'update_post_term_cache' => false,
    353                         'fields' => 'ids',
    354                         'meta_query' => array(
    355                                 array(
    356                                         'key' => 'foo',
    357                                         'value' => 'z$',
    358                                         'compare' => 'RLIKE',
    359                                 ),
    360                         ),
    361                 ) );
    362 
    363                 $expected = array( $p2 );
    364                 $this->assertEqualSets( $expected, $query->posts );
    365         }
    366 
    367         /**
    368          * @group meta
    369          */
    370         public function test_meta_query_single_query_compare_not_regexp() {
    371                 $p1 = $this->factory->post->create();
    372                 $p2 = $this->factory->post->create();
    373 
    374                 add_post_meta( $p1, 'foo', 'bar' );
    375                 add_post_meta( $p2, 'foo', 'baz' );
    376 
    377                 $query = new WP_Query( array(
    378                         'update_post_meta_cache' => false,
    379                         'update_post_term_cache' => false,
    380                         'fields' => 'ids',
    381                         'meta_query' => array(
    382                                 array(
    383                                         'key' => 'foo',
    384                                         'value' => 'z$',
    385                                         'compare' => 'NOT REGEXP',
    386                                 ),
    387                         ),
    388                 ) );
    389 
    390                 $expected = array( $p1 );
    391                 $this->assertEqualSets( $expected, $query->posts );
    392         }
    393 
    394         /**
    395          * @group meta
    396          */
    397         public function test_meta_query_relation_default() {
    398                 $p1 = $this->factory->post->create();
    399                 $p2 = $this->factory->post->create();
    400                 $p3 = $this->factory->post->create();
    401 
    402                 add_post_meta( $p1, 'foo', 'foo value 1' );
    403                 add_post_meta( $p1, 'bar', 'bar value 1' );
    404                 add_post_meta( $p2, 'foo', 'foo value 1' );
    405                 add_post_meta( $p2, 'bar', 'bar value 2' );
    406 
    407                 $query = new WP_Query( array(
    408                         'update_post_meta_cache' => false,
    409                         'update_post_term_cache' => false,
    410                         'fields' => 'ids',
    411                         'meta_query' => array(
    412                                 array(
    413                                         'key' => 'foo',
    414                                         'value' => 'foo value 1',
    415                                 ),
    416                                 array(
    417                                         'key' => 'bar',
    418                                         'value' => 'bar value 1',
    419                                 ),
    420                         ),
    421                 ) );
    422 
    423                 $expected = array( $p1 );
    424                 $this->assertEquals( $expected, $query->posts );
    425         }
    426 
    427         /**
    428          * @group meta
    429          */
    430         public function test_meta_query_relation_or() {
    431                 $post_id = $this->factory->post->create();
    432                 add_post_meta( $post_id, 'foo', rand_str() );
    433                 add_post_meta( $post_id, 'foo', rand_str() );
    434                 $post_id2 = $this->factory->post->create();
    435                 add_post_meta( $post_id2, 'bar', 'val2' );
    436                 $post_id3 = $this->factory->post->create();
    437                 add_post_meta( $post_id3, 'baz', rand_str() );
    438                 $post_id4 = $this->factory->post->create();
    439                 add_post_meta( $post_id4, 'froo', rand_str() );
    440                 $post_id5 = $this->factory->post->create();
    441                 add_post_meta( $post_id5, 'tango', 'val2' );
    442                 $post_id6 = $this->factory->post->create();
    443                 add_post_meta( $post_id6, 'bar', 'val1' );
    444 
    445                 $query = new WP_Query( array(
    446                         'update_post_meta_cache' => false,
    447                         'update_post_term_cache' => false,
    448                         'fields' => 'ids',
    449                         'meta_query' => array(
    450                                 array(
    451                                         'key' => 'foo'
    452                                 ),
    453                                 array(
    454                                         'key' => 'bar',
    455                                         'value' => 'val2'
    456                                 ),
    457                                 array(
    458                                         'key' => 'baz'
    459                                 ),
    460                                 array(
    461                                         'key' => 'froo'
    462                                 ),
    463                                 'relation' => 'OR',
    464                         ),
    465                 ) );
    466 
    467                 $expected = array( $post_id, $post_id2, $post_id3, $post_id4 );
    468                 $this->assertEqualSets( $expected, $query->posts );
    469         }
    470 
    471         /**
    472          * @group meta
    473          */
    474         public function test_meta_query_relation_and() {
    475                 $post_id = $this->factory->post->create();
    476                 add_post_meta( $post_id, 'foo', rand_str() );
    477                 add_post_meta( $post_id, 'foo', rand_str() );
    478                 $post_id2 = $this->factory->post->create();
    479                 add_post_meta( $post_id2, 'bar', 'val2' );
    480                 add_post_meta( $post_id2, 'foo', rand_str() );
    481                 $post_id3 = $this->factory->post->create();
    482                 add_post_meta( $post_id3, 'baz', rand_str() );
    483                 $post_id4 = $this->factory->post->create();
    484                 add_post_meta( $post_id4, 'froo', rand_str() );
    485                 $post_id5 = $this->factory->post->create();
    486                 add_post_meta( $post_id5, 'tango', 'val2' );
    487                 $post_id6 = $this->factory->post->create();
    488                 add_post_meta( $post_id6, 'bar', 'val1' );
    489                 add_post_meta( $post_id6, 'foo', rand_str() );
    490                 $post_id7 = $this->factory->post->create();
    491                 add_post_meta( $post_id7, 'foo', rand_str() );
    492                 add_post_meta( $post_id7, 'froo', rand_str() );
    493                 add_post_meta( $post_id7, 'baz', rand_str() );
    494                 add_post_meta( $post_id7, 'bar', 'val2' );
    495 
    496                 $query = new WP_Query( array(
    497                         'meta_query' => array(
    498                                 array(
    499                                         'key' => 'foo'
    500                                 ),
    501                                 array(
    502                                         'key' => 'bar',
    503                                         'value' => 'val2'
    504                                 ),
    505                                 array(
    506                                         'key' => 'baz'
    507                                 ),
    508                                 array(
    509                                         'key' => 'froo'
    510                                 ),
    511                                 'relation' => 'AND',
    512                         ),
    513                         'update_post_meta_cache' => false,
    514                         'update_post_term_cache' => false,
    515                         'fields' => 'ids',
    516                 ) );
    517 
    518                 $expected = array( $post_id7 );
    519                 $this->assertEqualSets( $expected, $query->posts );
    520 
    521                 $query = new WP_Query( array(
    522                         'meta_query' => array(
    523                                 array(
    524                                         'key' => 'foo'
    525                                 ),
    526                                 array(
    527                                         'key' => 'bar',
    528                                 ),
    529                                 'relation' => 'AND',
    530                         ),
    531                         'update_post_meta_cache' => false,
    532                         'update_post_term_cache' => false,
    533                         'fields' => 'ids',
    534                 ) );
    535 
    536                 $expected = array( $post_id2, $post_id6, $post_id7 );
    537                 $this->assertEqualSets( $expected, $query->posts );
    538         }
    539 
    540         /**
    541          * @ticket 30681
    542          */
    543         public function test_meta_query_compare_exists() {
    544                 $posts = $this->factory->post->create_many( 3 );
    545                 add_post_meta( $posts[0], 'foo', 'bar' );
    546                 add_post_meta( $posts[2], 'foo', 'baz' );
    547 
    548                 $query = new WP_Query( array(
    549                         'fields' => 'ids',
    550                         'meta_query' => array(
    551                                 array(
    552                                         'compare' => 'EXISTS',
    553                                         'key' => 'foo',
    554                                 ),
    555                         ),
    556                 ) );
    557 
    558                 $this->assertEqualSets( array( $posts[0], $posts[2] ), $query->posts );
    559         }
    560 
    561         /**
    562          * @ticket 30681
    563          */
    564         public function test_meta_query_compare_exists_with_value_should_convert_to_equals() {
    565                 $posts = $this->factory->post->create_many( 3 );
    566                 add_post_meta( $posts[0], 'foo', 'bar' );
    567                 add_post_meta( $posts[2], 'foo', 'baz' );
    568 
    569                 $query = new WP_Query( array(
    570                         'fields' => 'ids',
    571                         'meta_query' => array(
    572                                 array(
    573                                         'compare' => 'EXISTS',
    574                                         'value' => 'baz',
    575                                         'key' => 'foo',
    576                                 ),
    577                         ),
    578                 ) );
    579 
    580                 $this->assertEqualSets( array( $posts[2] ), $query->posts );
    581         }
    582 
    583         /**
    584          * @ticket 30681
    585          */
    586         public function test_meta_query_compare_not_exists_should_ignore_value() {
    587                 $posts = $this->factory->post->create_many( 3 );
    588                 add_post_meta( $posts[0], 'foo', 'bar' );
    589                 add_post_meta( $posts[2], 'foo', 'baz' );
    590 
    591                 $query = new WP_Query( array(
    592                         'fields' => 'ids',
    593                         'meta_query' => array(
    594                                 array(
    595                                         'compare' => 'NOT EXISTS',
    596                                         'value' => 'bar',
    597                                         'key' => 'foo',
    598                                 ),
    599                         ),
    600                 ) );
    601 
    602                 $this->assertEqualSets( array( $posts[1] ), $query->posts );
    603         }
    604 
    605         /**
    606          * @ticket 18158
    607          * @group meta
    608          */
    609         public function test_meta_query_compare_not_exists() {
    610                 $post_id = $this->factory->post->create();
    611                 add_post_meta( $post_id, 'foo', rand_str() );
    612                 $post_id2 = $this->factory->post->create();
    613                 add_post_meta( $post_id2, 'bar', rand_str() );
    614                 $post_id3 = $this->factory->post->create();
    615                 add_post_meta( $post_id3, 'bar', rand_str() );
    616                 $post_id4 = $this->factory->post->create();
    617                 add_post_meta( $post_id4, 'baz', rand_str() );
    618                 $post_id5 = $this->factory->post->create();
    619                 add_post_meta( $post_id5, 'foo', rand_str() );
    620 
    621                 $query = new WP_Query( array(
    622                         'meta_query' => array(
    623                                 array(
    624                                         'key' => 'foo',
    625                                         'compare' => 'NOT EXISTS',
    626                                 ),
    627                         ),
    628                         'update_post_meta_cache' => false,
    629                         'update_post_term_cache' => false,
    630                         'fields' => 'ids',
    631                 ) );
    632 
    633                 $expected = array( $post_id2, $post_id3, $post_id4 );
    634                 $this->assertEqualSets( $expected, $query->posts );
    635 
    636                 $query = new WP_Query( array(
    637                         'meta_query' => array(
    638                                 array(
    639                                         'key' => 'foo',
    640                                         'compare' => 'NOT EXISTS',
    641                                 ),
    642                                 array(
    643                                         'key' => 'bar',
    644                                         'compare' => 'NOT EXISTS',
    645                                 ),
    646                         ),
    647                         'update_post_meta_cache' => false,
    648                         'update_post_term_cache' => false,
    649                         'fields' => 'ids',
    650                 ) );
    651 
    652                 $expected = array( $post_id4 );
    653                 $this->assertEquals( $expected, $query->posts );
    654 
    655                 $query = new WP_Query( array(
    656                         'meta_query' => array(
    657                                 array(
    658                                         'key' => 'foo',
    659                                         'compare' => 'NOT EXISTS',
    660                                 ),
    661                                 array(
    662                                         'key' => 'bar',
    663                                         'compare' => 'NOT EXISTS',
    664                                 ),
    665                                 array(
    666                                         'key' => 'baz',
    667                                         'compare' => 'NOT EXISTS',
    668                                 ),
    669                         ),
    670                         'update_post_meta_cache' => false,
    671                         'update_post_term_cache' => false,
    672                         'fields' => 'ids',
    673                 ) );
    674 
    675                 $this->assertEquals( 0, count( $query->posts ) );
    676         }
    677 
    678         /**
    679          * @ticket 29062
    680          */
    681         public function test_meta_query_compare_not_exists_with_another_condition_relation_or() {
    682                 $posts = $this->factory->post->create_many( 4 );
    683                 update_post_meta( $posts[0], 'color', 'orange' );
    684                 update_post_meta( $posts[1], 'color', 'blue' );
    685                 update_post_meta( $posts[1], 'vegetable', 'onion' );
    686                 update_post_meta( $posts[2], 'vegetable', 'shallot' );
    687 
    688                 $post_3_meta = get_post_meta( $posts[3] );
    689                 foreach ( $post_3_meta as $meta_key => $meta_value ) {
    690                         delete_post_meta( $posts[3], $meta_key );
    691                 }
    692 
    693                 $query = new WP_Query( array(
    694                         'meta_query' => array(
    695                                 'relation' => 'OR',
    696                                 array(
    697                                         'key' => 'vegetable',
    698                                         'value' => 'onion',
    699                                 ),
    700                                 array(
    701                                         'key' => 'color',
    702                                         'compare' => 'NOT EXISTS',
    703                                 ),
    704                         ),
    705                         'update_post_meta_cache' => false,
    706                         'update_post_term_cache' => false,
    707                         'fields' => 'ids',
    708                 ) );
    709 
    710                 $expected = array( $posts[1], $posts[2], $posts[3] );
    711                 $this->assertEqualSets( $expected, $query->posts );
    712         }
    713 
    714         /**
    715          * @ticket 24093
    716          */
    717         public function test_meta_query_relation_or_compare_equals() {
    718                 $posts = $this->factory->post->create_many( 4 );
    719                 add_post_meta( $posts[0], 'color', 'orange' );
    720                 add_post_meta( $posts[1], 'color', 'blue' );
    721                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    722                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    723 
    724                 $query = new WP_Query( array(
    725                         'meta_query' => array(
    726                                 'relation' => 'OR',
    727                                 array(
    728                                         'key' => 'vegetable',
    729                                         'value' => 'onion',
    730                                         'compare' => '=',
    731                                 ),
    732                                 array(
    733                                         'key' => 'vegetable',
    734                                         'value' => 'shallot',
    735                                         'compare' => '=',
    736                                 ),
    737                         ),
    738                         'update_post_meta_cache' => false,
    739                         'update_post_term_cache' => false,
    740                         'fields' => 'ids',
    741                 ) );
    742 
    743                 $expected = array( $posts[1], $posts[2] );
    744                 $this->assertEqualSets( $expected, $query->posts );
    745         }
    746 
    747         /**
    748          * @ticket 24093
    749          */
    750         public function test_meta_query_relation_or_compare_equals_different_keys() {
    751                 $posts = $this->factory->post->create_many( 4 );
    752                 add_post_meta( $posts[0], 'color', 'orange' );
    753                 add_post_meta( $posts[1], 'color', 'blue' );
    754                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    755                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    756 
    757                 $query = new WP_Query( array(
    758                         'meta_query' => array(
    759                                 'relation' => 'OR',
    760                                 array(
    761                                         'key' => 'vegetable',
    762                                         'value' => 'onion',
    763                                         'compare' => '=',
    764                                 ),
    765                                 array(
    766                                         'key' => 'color',
    767                                         'value' => 'orange',
    768                                         'compare' => '=',
    769                                 ),
    770                         ),
    771                         'update_post_meta_cache' => false,
    772                         'update_post_term_cache' => false,
    773                         'fields' => 'ids',
    774                 ) );
    775 
    776                 $expected = array( $posts[0], $posts[1] );
    777                 $this->assertEqualSets( $expected, $query->posts );
    778         }
    779 
    780         /**
    781          * @ticket 24093
    782          */
    783         public function test_meta_query_relation_or_compare_equals_and_in() {
    784                 $posts = $this->factory->post->create_many( 4 );
    785                 add_post_meta( $posts[0], 'color', 'orange' );
    786                 add_post_meta( $posts[1], 'color', 'blue' );
    787                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    788                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    789 
    790                 $query = new WP_Query( array(
    791                         'meta_query' => array(
    792                                 'relation' => 'OR',
    793                                 array(
    794                                         'key' => 'vegetable',
    795                                         'value' => 'onion',
    796                                         'compare' => '=',
    797                                 ),
    798                                 array(
    799                                         'key' => 'color',
    800                                         'value' => array( 'orange', 'green' ),
    801                                         'compare' => 'IN',
    802                                 ),
    803                         ),
    804                         'update_post_meta_cache' => false,
    805                         'update_post_term_cache' => false,
    806                         'fields' => 'ids',
    807                 ) );
    808 
    809                 $expected = array( $posts[0], $posts[1] );
    810                 $this->assertEqualSets( $expected, $query->posts );
    811         }
    812 
    813         /**
    814          * @ticket 24093
    815          */
    816         public function test_meta_query_relation_or_compare_equals_and_like() {
    817                 $posts = $this->factory->post->create_many( 4 );
    818                 add_post_meta( $posts[0], 'color', 'orange' );
    819                 add_post_meta( $posts[1], 'color', 'blue' );
    820                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    821                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    822 
    823                 $query = new WP_Query( array(
    824                         'meta_query' => array(
    825                                 'relation' => 'OR',
    826                                 array(
    827                                         'key' => 'vegetable',
    828                                         'value' => 'onion',
    829                                         'compare' => '=',
    830                                 ),
    831                                 array(
    832                                         'key' => 'vegetable',
    833                                         'value' => 'hall',
    834                                         'compare' => 'LIKE',
    835                                 ),
    836                         ),
    837                         'update_post_meta_cache' => false,
    838                         'update_post_term_cache' => false,
    839                         'fields' => 'ids',
    840                 ) );
    841 
    842                 $expected = array( $posts[1], $posts[2] );
    843                 $this->assertEqualSets( $expected, $query->posts );
    844         }
    845 
    846         /**
    847          * @ticket 24093
    848          */
    849         public function test_meta_query_relation_or_compare_equals_and_between() {
    850                 $posts = $this->factory->post->create_many( 4 );
    851                 add_post_meta( $posts[0], 'number_of_colors', '2' );
    852                 add_post_meta( $posts[1], 'number_of_colors', '5' );
    853                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    854                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    855 
    856                 $query = new WP_Query( array(
    857                         'meta_query' => array(
    858                                 'relation' => 'OR',
    859                                 array(
    860                                         'key' => 'vegetable',
    861                                         'value' => 'shallot',
    862                                         'compare' => '=',
    863                                 ),
    864                                 array(
    865                                         'key' => 'number_of_colors',
    866                                         'value' => array( 1, 3 ),
    867                                         'compare' => 'BETWEEN',
    868                                         'type' => 'SIGNED',
    869                                 ),
    870                         ),
    871                         'update_post_meta_cache' => false,
    872                         'update_post_term_cache' => false,
    873                         'fields' => 'ids',
    874                 ) );
    875 
    876                 $expected = array( $posts[0], $posts[2] );
    877                 $this->assertEqualSets( $expected, $query->posts );
    878         }
    879 
    880         /**
    881          * @ticket 24093
    882          */
    883         public function test_meta_query_relation_and_compare_in_same_keys() {
    884                 $posts = $this->factory->post->create_many( 4 );
    885                 add_post_meta( $posts[0], 'color', 'orange' );
    886                 add_post_meta( $posts[1], 'color', 'blue' );
    887                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    888                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    889                 add_post_meta( $posts[3], 'vegetable', 'banana' );
    890                 add_post_meta( $posts[3], 'vegetable', 'onion' );
    891 
    892                 $query = new WP_Query( array(
    893                         'meta_query' => array(
    894                                 'relation' => 'AND',
    895                                 array(
    896                                         'key' => 'vegetable',
    897                                         'value' => array( 'onion', 'shallot' ),
    898                                         'compare' => 'IN',
    899                                 ),
    900                                 array(
    901                                         'key' => 'vegetable',
    902                                         'value' => array( 'banana' ),
    903                                         'compare' => 'IN',
    904                                 ),
    905                         ),
    906                         'update_post_meta_cache' => false,
    907                         'update_post_term_cache' => false,
    908                         'fields' => 'ids',
    909                 ) );
    910 
    911                 $expected = array( $posts[3] );
    912                 $this->assertEqualSets( $expected, $query->posts );
    913         }
    914 
    915         /**
    916          * @ticket 24093
    917          */
    918         public function test_meta_query_relation_and_compare_in_different_keys() {
    919                 $posts = $this->factory->post->create_many( 4 );
    920                 add_post_meta( $posts[0], 'color', 'orange' );
    921                 add_post_meta( $posts[1], 'color', 'blue' );
    922                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    923                 add_post_meta( $posts[1], 'vegetable', 'shallot' );
    924                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    925                 add_post_meta( $posts[3], 'vegetable', 'banana' );
    926 
    927                 $query = new WP_Query( array(
    928                         'meta_query' => array(
    929                                 'relation' => 'AND',
    930                                 array(
    931                                         'key' => 'vegetable',
    932                                         'value' => array( 'onion', 'shallot' ),
    933                                         'compare' => 'IN',
    934                                 ),
    935                                 array(
    936                                         'key' => 'color',
    937                                         'value' => array( 'blue' ),
    938                                         'compare' => 'IN',
    939                                 ),
    940                         ),
    941                         'update_post_meta_cache' => false,
    942                         'update_post_term_cache' => false,
    943                         'fields' => 'ids',
    944                 ) );
    945 
    946                 $expected = array( $posts[1] );
    947                 $this->assertEqualSets( $expected, $query->posts );
    948         }
    949 
    950         /**
    951          * @ticket 24093
    952          */
    953         public function test_meta_query_relation_and_compare_not_equals() {
    954                 $posts = $this->factory->post->create_many( 4 );
    955                 add_post_meta( $posts[0], 'color', 'orange' );
    956                 add_post_meta( $posts[1], 'color', 'blue' );
    957                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    958                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    959                 add_post_meta( $posts[3], 'vegetable', 'banana' );
    960 
    961                 $query = new WP_Query( array(
    962                         'meta_query' => array(
    963                                 'relation' => 'AND',
    964                                 array(
    965                                         'key' => 'vegetable',
    966                                         'value' => 'onion',
    967                                         'compare' => '!=',
    968                                 ),
    969                                 array(
    970                                         'key' => 'vegetable',
    971                                         'value' => 'shallot',
    972                                         'compare' => '!=',
    973                                 ),
    974                         ),
    975                         'update_post_meta_cache' => false,
    976                         'update_post_term_cache' => false,
    977                         'fields' => 'ids',
    978                 ) );
    979 
    980                 $expected = array( $posts[3] );
    981                 $this->assertEqualSets( $expected, $query->posts );
    982         }
    983 
    984         /**
    985          * @ticket 24093
    986          */
    987         public function test_meta_query_relation_and_compare_not_equals_different_keys() {
    988                 $posts = $this->factory->post->create_many( 4 );
    989 
    990                 // !shallot, but orange.
    991                 add_post_meta( $posts[0], 'color', 'orange' );
    992                 add_post_meta( $posts[0], 'vegetable', 'onion' );
    993 
    994                 // !orange, but shallot.
    995                 add_post_meta( $posts[1], 'color', 'blue' );
    996                 add_post_meta( $posts[1], 'vegetable', 'shallot' );
    997 
    998                 // Neither.
    999                 add_post_meta( $posts[2], 'color', 'blue' );
    1000                 add_post_meta( $posts[2], 'vegetable', 'onion' );
    1001 
    1002                 $query = new WP_Query( array(
    1003                         'meta_query' => array(
    1004                                 'relation' => 'AND',
    1005                                 array(
    1006                                         'key' => 'vegetable',
    1007                                         'value' => 'shallot',
    1008                                         'compare' => '!=',
    1009                                 ),
    1010                                 array(
    1011                                         'key' => 'color',
    1012                                         'value' => 'orange',
    1013                                         'compare' => '!=',
    1014                                 ),
    1015                         ),
    1016                         'update_post_meta_cache' => false,
    1017                         'update_post_term_cache' => false,
    1018                         'fields' => 'ids',
    1019                 ) );
    1020 
    1021                 $expected = array( $posts[2] );
    1022                 $this->assertEqualSets( $expected, $query->posts );
    1023         }
    1024 
    1025         /**
    1026          * @ticket 24093
    1027          */
    1028         public function test_meta_query_relation_and_compare_not_equals_not_in() {
    1029                 $posts = $this->factory->post->create_many( 4 );
    1030                 add_post_meta( $posts[0], 'color', 'orange' );
    1031                 add_post_meta( $posts[1], 'color', 'blue' );
    1032                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    1033                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    1034                 add_post_meta( $posts[3], 'vegetable', 'banana' );
    1035 
    1036                 $query = new WP_Query( array(
    1037                         'meta_query' => array(
    1038                                 'relation' => 'AND',
    1039                                 array(
    1040                                         'key' => 'vegetable',
    1041                                         'value' => 'onion',
    1042                                         'compare' => '!=',
    1043                                 ),
    1044                                 array(
    1045                                         'key' => 'vegetable',
    1046                                         'value' => array( 'shallot' ),
    1047                                         'compare' => 'NOT IN',
    1048                                 ),
    1049                         ),
    1050                         'update_post_meta_cache' => false,
    1051                         'update_post_term_cache' => false,
    1052                         'fields' => 'ids',
    1053                 ) );
    1054 
    1055                 $expected = array( $posts[3] );
    1056                 $this->assertEqualSets( $expected, $query->posts );
    1057         }
    1058 
    1059         /**
    1060          * @ticket 24093
    1061          */
    1062         public function test_meta_query_relation_and_compare_not_equals_and_not_like() {
    1063                 $posts = $this->factory->post->create_many( 4 );
    1064                 add_post_meta( $posts[0], 'color', 'orange' );
    1065                 add_post_meta( $posts[1], 'color', 'blue' );
    1066                 add_post_meta( $posts[1], 'vegetable', 'onion' );
    1067                 add_post_meta( $posts[2], 'vegetable', 'shallot' );
    1068                 add_post_meta( $posts[3], 'vegetable', 'banana' );
    1069 
    1070                 $query = new WP_Query( array(
    1071                         'meta_query' => array(
    1072                                 'relation' => 'AND',
    1073                                 array(
    1074                                         'key' => 'vegetable',
    1075                                         'value' => 'onion',
    1076                                         'compare' => '!=',
    1077                                 ),
    1078                                 array(
    1079                                         'key' => 'vegetable',
    1080                                         'value' => 'hall',
    1081                                         'compare' => 'NOT LIKE',
    1082                                 ),
    1083                         ),
    1084                         'update_post_meta_cache' => false,
    1085                         'update_post_term_cache' => false,
    1086                         'fields' => 'ids',
    1087                 ) );
    1088 
    1089                 $expected = array( $posts[3] );
    1090                 $this->assertEqualSets( $expected, $query->posts );
    1091         }
    1092 
    1093         /**
    1094          * @ticket 23033
    1095          * @group meta
    1096          */
    1097         public function test_meta_query_decimal_results() {
    1098                 $post_1 = $this->factory->post->create();
    1099                 $post_2 = $this->factory->post->create();
    1100                 $post_3 = $this->factory->post->create();
    1101                 $post_4 = $this->factory->post->create();
    1102 
    1103                 update_post_meta( $post_1, 'decimal_value', '-0.3' );
    1104                 update_post_meta( $post_2, 'decimal_value', '0.23409844' );
    1105                 update_post_meta( $post_3, 'decimal_value', '0.3' );
    1106                 update_post_meta( $post_4, 'decimal_value', '0.4' );
    1107 
    1108                 $query = new WP_Query( array(
    1109                         'meta_query' => array(
    1110                                 array(
    1111                                         'key' => 'decimal_value',
    1112                                         'value' => '.300',
    1113                                         'compare' => '=',
    1114                                         'type' => 'DECIMAL(10,2)'
    1115                                 )
    1116                         ),
    1117                         'update_post_meta_cache' => false,
    1118                         'update_post_term_cache' => false,
    1119                         'fields' => 'ids',
    1120                 ) );
    1121                 $this->assertEqualSets( array( $post_3 ), $query->posts );
    1122 
    1123                 $query = new WP_Query( array(
    1124                         'meta_query' => array(
    1125                                 array(
    1126                                         'key' => 'decimal_value',
    1127                                         'value' => '0.35',
    1128                                         'compare' => '>',
    1129                                         'type' => 'DECIMAL(10,2)'
    1130                                 )
    1131                         ),
    1132                         'update_post_meta_cache' => false,
    1133                         'update_post_term_cache' => false,
    1134                         'fields' => 'ids',
    1135                 ) );
    1136                 $this->assertEqualSets( array( $post_4 ), $query->posts );
    1137 
    1138                 $query = new WP_Query( array(
    1139                         'meta_query' => array(
    1140                                 array(
    1141                                         'key' => 'decimal_value',
    1142                                         'value' => '0.3',
    1143                                         'compare' => '>=',
    1144                                         'type' => 'DECIMAL(10,2)'
    1145                                 )
    1146                         ),
    1147                         'update_post_meta_cache' => false,
    1148                         'update_post_term_cache' => false,
    1149                         'fields' => 'ids',
    1150                 ) );
    1151                 $this->assertEqualSets( array( $post_3, $post_4 ), $query->posts );
    1152 
    1153                 $query = new WP_Query( array(
    1154                         'meta_query' => array(
    1155                                 array(
    1156                                         'key' => 'decimal_value',
    1157                                         'value' => '0',
    1158                                         'compare' => '<',
    1159                                         'type' => 'DECIMAL(10,2)'
    1160                                 )
    1161                         ),
    1162                         'update_post_meta_cache' => false,
    1163                         'update_post_term_cache' => false,
    1164                         'fields' => 'ids',
    1165                 ) );
    1166                 $this->assertEqualSets( array( $post_1 ), $query->posts, 'ID' );
    1167 
    1168                 $query = new WP_Query( array(
    1169                         'meta_query' => array(
    1170                                 array(
    1171                                         'key' => 'decimal_value',
    1172                                         'value' => '0.3',
    1173                                         'compare' => '<=',
    1174                                         'type' => 'DECIMAL(10,2)'
    1175                                 )
    1176                         ),
    1177                         'update_post_meta_cache' => false,
    1178                         'update_post_term_cache' => false,
    1179                         'fields' => 'ids',
    1180                 ) );
    1181                 $this->assertEqualSets( array( $post_1, $post_2, $post_3 ), $query->posts );
    1182 
    1183                 $query = new WP_Query( array(
    1184                         'meta_query' => array(
    1185                                 array(
    1186                                         'key' => 'decimal_value',
    1187                                         'value' => array( 0.23409845, .31 ),
    1188                                         'compare' => 'BETWEEN',
    1189                                         'type' => 'DECIMAL(10, 10)'
    1190                                 )
    1191                         ),
    1192                         'update_post_meta_cache' => false,
    1193                         'update_post_term_cache' => false,
    1194                         'fields' => 'ids',
    1195                 ) );
    1196                 $this->assertEqualSets( array( $post_3 ), $query->posts );
    1197 
    1198                 $query = new WP_Query( array(
    1199                         'meta_query' => array(
    1200                                 array(
    1201                                         'key' => 'decimal_value',
    1202                                         'value' => array( 0.23409845, .31 ),
    1203                                         'compare' => 'NOT BETWEEN',
    1204                                         'type' => 'DECIMAL(10,10)'
    1205                                 )
    1206                         ),
    1207                         'update_post_meta_cache' => false,
    1208                         'update_post_term_cache' => false,
    1209                         'fields' => 'ids',
    1210                 ) );
    1211                 $this->assertEqualSets( array( $post_1, $post_2, $post_4 ), $query->posts );
    1212 
    1213                 $query = new WP_Query( array(
    1214                         'meta_query' => array(
    1215                                 array(
    1216                                         'key' => 'decimal_value',
    1217                                         'value' => '.3',
    1218                                         'compare' => 'LIKE',
    1219                                         'type' => 'DECIMAL(10,2)'
    1220                                 )
    1221                         ),
    1222                         'update_post_meta_cache' => false,
    1223                         'update_post_term_cache' => false,
    1224                         'fields' => 'ids',
    1225                 ) );
    1226                 $this->assertEqualSets( array( $post_1, $post_3 ), $query->posts );
    1227 
    1228                 $query = new WP_Query( array(
    1229                         'meta_query' => array(
    1230                                 array(
    1231                                         'key' => 'decimal_value',
    1232                                         'value' => '.3',
    1233                                         'compare' => 'NOT LIKE',
    1234                                         'type' => 'DECIMAL(10,2)'
    1235                                 )
    1236                         ),
    1237                         'update_post_meta_cache' => false,
    1238                         'update_post_term_cache' => false,
    1239                         'fields' => 'ids',
    1240                 ) );
    1241                 $this->assertEqualSets( array( $post_2, $post_4 ), $query->posts );
    1242 
    1243                 $query = new WP_Query( array(
    1244                         'orderby' => 'meta_value',
    1245                         'order' => 'DESC',
    1246                         'meta_key' => 'decimal_value',
    1247                         'meta_type' => 'DECIMAL(10, 2)',
    1248                         'update_post_meta_cache' => false,
    1249                         'update_post_term_cache' => false,
    1250                         'fields' => 'ids',
    1251                 ) );
    1252                 $this->assertEqualSets( array( $post_4, $post_3, $post_2, $post_1 ), $query->posts );
    1253         }
    1254 
    1255         /**
    1256          * @group meta
    1257          * @ticket 29604
    1258          */
    1259         public function test_meta_query_with_orderby_meta_value_relation_or() {
    1260                 $posts = $this->factory->post->create_many( 4 );
    1261                 update_post_meta( $posts[0], 'foo', 5 );
    1262                 update_post_meta( $posts[1], 'foo', 6 );
    1263                 update_post_meta( $posts[2], 'foo', 4 );
    1264                 update_post_meta( $posts[3], 'foo', 7 );
    1265 
    1266                 update_post_meta( $posts[0], 'bar1', 'baz' );
    1267                 update_post_meta( $posts[1], 'bar1', 'baz' );
    1268                 update_post_meta( $posts[2], 'bar2', 'baz' );
    1269 
    1270                 $query = new WP_Query( array(
    1271                         'orderby' => 'meta_value',
    1272                         'order' => 'ASC',
    1273                         'meta_key' => 'foo',
    1274                         'meta_query' => array(
    1275                                 'relation' => 'OR',
    1276                                 array(
    1277                                         'key' => 'bar1',
    1278                                         'value' => 'baz',
    1279                                         'compare' => '=',
    1280                                 ),
    1281                                 array(
    1282                                         'key' => 'bar2',
    1283                                         'value' => 'baz',
    1284                                         'compare' => '=',
    1285                                 ),
    1286                         ),
    1287                         'update_post_meta_cache' => false,
    1288                         'update_post_term_cache' => false,
    1289                         'fields' => 'ids',
    1290                 ) );
    1291 
    1292                 $this->assertEquals( array( $posts[2], $posts[0], $posts[1] ), $query->posts );
    1293         }
    1294 
    1295         /**
    1296          * @group meta
    1297          * @ticket 29604
    1298          */
    1299         public function test_meta_query_with_orderby_meta_value_relation_and() {
    1300                 $posts = $this->factory->post->create_many( 4 );
    1301                 update_post_meta( $posts[0], 'foo', 5 );
    1302                 update_post_meta( $posts[1], 'foo', 6 );
    1303                 update_post_meta( $posts[2], 'foo', 4 );
    1304                 update_post_meta( $posts[3], 'foo', 7 );
    1305 
    1306                 update_post_meta( $posts[0], 'bar1', 'baz' );
    1307                 update_post_meta( $posts[1], 'bar1', 'baz' );
    1308                 update_post_meta( $posts[2], 'bar1', 'baz' );
    1309                 update_post_meta( $posts[3], 'bar1', 'baz' );
    1310                 update_post_meta( $posts[0], 'bar2', 'baz' );
    1311                 update_post_meta( $posts[1], 'bar2', 'baz' );
    1312                 update_post_meta( $posts[2], 'bar2', 'baz' );
    1313 
    1314                 $query = new WP_Query( array(
    1315                         'orderby' => 'meta_value',
    1316                         'order' => 'ASC',
    1317                         'meta_key' => 'foo',
    1318                         'meta_query' => array(
    1319                                 'relation' => 'AND',
    1320                                 array(
    1321                                         'key' => 'bar1',
    1322                                         'value' => 'baz',
    1323                                         'compare' => '=',
    1324                                 ),
    1325                                 array(
    1326                                         'key' => 'bar2',
    1327                                         'value' => 'baz',
    1328                                         'compare' => '=',
    1329                                 ),
    1330                         ),
    1331                         'update_post_meta_cache' => false,
    1332                         'update_post_term_cache' => false,
    1333                         'fields' => 'ids',
    1334                 ) );
    1335 
    1336                 $this->assertEquals( array( $posts[2], $posts[0], $posts[1] ), $query->posts );
    1337         }
    1338 
    1339         /**
    1340          * @ticket 29642
    1341          * @group meta
    1342          */
    1343         public function test_meta_query_nested() {
    1344                 $p1 = $this->factory->post->create();
    1345                 $p2 = $this->factory->post->create();
    1346                 $p3 = $this->factory->post->create();
    1347 
    1348                 add_post_meta( $p1, 'foo', 'bar' );
    1349                 add_post_meta( $p2, 'foo2', 'bar' );
    1350                 add_post_meta( $p3, 'foo2', 'bar' );
    1351                 add_post_meta( $p3, 'foo3', 'bar' );
    1352 
    1353                 $query = new WP_Query( array(
    1354                         'update_post_meta_cache' => false,
    1355                         'update_term_meta_cache' => false,
    1356                         'fields' => 'ids',
    1357                         'meta_query' => array(
    1358                                 'relation' => 'OR',
    1359                                 array(
    1360                                         'key' => 'foo',
    1361                                         'value' => 'bar',
    1362                                 ),
    1363                                 array(
    1364                                         'relation' => 'AND',
    1365                                         array(
    1366                                                 'key' => 'foo2',
    1367                                                 'value' => 'bar',
    1368                                         ),
    1369                                         array(
    1370                                                 'key' => 'foo3',
    1371                                                 'value' => 'bar',
    1372                                         ),
    1373                                 ),
    1374                         ),
    1375                 ) );
    1376 
    1377                 $expected = array( $p1, $p3 );
    1378                 $this->assertEqualSets( $expected, $query->posts );
    1379         }
    1380 
    1381         /**
    1382          * @ticket 29642
    1383          * @group meta
    1384          */
    1385         public function test_meta_query_nested_two_levels_deep() {
    1386                 $p1 = $this->factory->post->create();
    1387                 $p2 = $this->factory->post->create();
    1388                 $p3 = $this->factory->post->create();
    1389 
    1390                 add_post_meta( $p1, 'foo', 'bar' );
    1391                 add_post_meta( $p3, 'foo2', 'bar' );
    1392                 add_post_meta( $p3, 'foo3', 'bar' );
    1393                 add_post_meta( $p3, 'foo4', 'bar' );
    1394 
    1395                 $query = new WP_Query( array(
    1396                         'update_post_meta_cache' => false,
    1397                         'update_term_meta_cache' => false,
    1398                         'fields' => 'ids',
    1399                         'meta_query' => array(
    1400                                 'relation' => 'OR',
    1401                                 array(
    1402                                         'key' => 'foo',
    1403                                         'value' => 'bar',
    1404                                 ),
    1405                                 array(
    1406                                         'relation' => 'OR',
    1407                                         array(
    1408                                                 'key' => 'foo2',
    1409                                                 'value' => 'bar',
    1410                                         ),
    1411                                         array(
    1412                                                 'relation' => 'AND',
    1413                                                 array(
    1414                                                         'key' => 'foo3',
    1415                                                         'value' => 'bar',
    1416                                                 ),
    1417                                                 array(
    1418                                                         'key' => 'foo4',
    1419                                                         'value' => 'bar',
    1420                                                 ),
    1421                                         ),
    1422                                 ),
    1423                         ),
    1424                 ) );
    1425 
    1426                 $expected = array( $p1, $p3 );
    1427                 $this->assertEqualSets( $expected, $query->posts );
    1428         }
    1429 
    1430         /**
    1431          * @group meta
    1432          */
    1433         function test_meta_between_not_between() {
    1434                 $post_id = $this->factory->post->create();
    1435                 add_post_meta( $post_id, 'time', 500 );
    1436                 $post_id2 = $this->factory->post->create();
    1437                 add_post_meta( $post_id2, 'time', 1001 );
    1438                 $post_id3 = $this->factory->post->create();
    1439                 add_post_meta( $post_id3, 'time', 0 );
    1440                 $post_id4 = $this->factory->post->create();
    1441                 add_post_meta( $post_id4, 'time', 1 );
    1442                 $post_id5 = $this->factory->post->create();
    1443                 add_post_meta( $post_id5, 'time', 1000 );
    1444 
    1445                 $args = array(
    1446                         'meta_key' => 'time',
    1447                         'meta_value' => array( 1, 1000 ),
    1448                         'meta_type' => 'numeric',
    1449                         'meta_compare' => 'NOT BETWEEN'
    1450                         );
    1451 
    1452                 $query = new WP_Query( $args );
    1453                 $this->assertEquals( 2, count ( $query->posts ) );
    1454                 foreach ( $query->posts as $post ) {
    1455                         $this->assertInstanceOf( 'WP_Post', $post );
    1456                         $this->assertEquals( 'raw', $post->filter );
    1457                 }
    1458                 $posts = wp_list_pluck( $query->posts, 'ID' );
    1459                 $this->assertEqualSets( array( $post_id2, $post_id3 ), $posts );
    1460 
    1461                 $args = array(
    1462                         'meta_key' => 'time',
    1463                         'meta_value' => array( 1, 1000 ),
    1464                         'meta_type' => 'numeric',
    1465                         'meta_compare' => 'BETWEEN'
    1466                         );
    1467 
    1468                 $query = new WP_Query( $args );
    1469                 $this->assertEquals( 3, count ( $query->posts ) );
    1470                 foreach ( $query->posts as $post ) {
    1471                         $this->assertInstanceOf( 'WP_Post', $post );
    1472                         $this->assertEquals( 'raw', $post->filter );
    1473                 }
    1474                 $posts = wp_list_pluck( $query->posts, 'ID' );
    1475                 $this->assertEqualSets( array( $post_id, $post_id4, $post_id5 ), $posts );
    1476         }
    1477 
    1478         /**
    1479          * @ticket 16829
    1480          * @group meta
    1481          */
    1482         function test_meta_default_compare() {
    1483                 // compare should default to IN when meta_value is an array
    1484                 $post_id = $this->factory->post->create();
    1485                 add_post_meta( $post_id, 'foo', 'bar' );
    1486                 $post_id2 = $this->factory->post->create();
    1487                 add_post_meta( $post_id2, 'bar', 'baz' );
    1488                 $post_id3 = $this->factory->post->create();
    1489                 add_post_meta( $post_id3, 'foo', 'baz' );
    1490                 $post_id4 = $this->factory->post->create();
    1491                 add_post_meta( $post_id4, 'baz', 'bar' );
    1492                 $post_id5 = $this->factory->post->create();
    1493                 add_post_meta( $post_id5, 'foo', rand_str() );
    1494 
    1495                 $posts = get_posts( array(
    1496                         'meta_key' => 'foo',
    1497                         'meta_value' => array( 'bar', 'baz' )
    1498                 ) );
    1499 
    1500                 $this->assertEquals( 2, count( $posts ) );
    1501                 $posts = wp_list_pluck( $posts, 'ID' );
    1502                 $this->assertEqualSets( array( $post_id, $post_id3 ), $posts );
    1503 
    1504                 $posts = get_posts( array(
    1505                         'meta_key' => 'foo',
    1506                         'meta_value' => array( 'bar', 'baz' ),
    1507                         'meta_compare' => 'IN'
    1508                 ) );
    1509 
    1510                 $this->assertEquals( 2, count( $posts ) );
    1511                 foreach ( $posts as $post ) {
    1512                         $this->assertInstanceOf( 'WP_Post', $post );
    1513                         $this->assertEquals( 'raw', $post->filter );
    1514                 }
    1515                 $posts = wp_list_pluck( $posts, 'ID' );
    1516                 $this->assertEqualSets( array( $post_id, $post_id3 ), $posts );
    1517         }
    1518 
    1519         /**
    1520          * @ticket 17264
    1521          * @group meta
    1522          */
    1523         function test_duplicate_posts_when_no_key() {
    1524                 $post_id = $this->factory->post->create();
    1525                 add_post_meta( $post_id, 'city', 'Lorem' );
    1526                 add_post_meta( $post_id, 'address', '123 Lorem St.' );
    1527                 $post_id2 = $this->factory->post->create();
    1528                 add_post_meta( $post_id2, 'city', 'Lorem' );
    1529                 $post_id3 = $this->factory->post->create();
    1530                 add_post_meta( $post_id3, 'city', 'Loren' );
    1531 
    1532                 $args = array(
    1533                         'meta_query' => array(
    1534                         array(
    1535                                 'value' => 'lorem',
    1536                                 'compare' => 'LIKE'
    1537                         )
    1538                         )
    1539                 );
    1540 
    1541                 $posts = get_posts( $args );
    1542                 $this->assertEquals( 2, count( $posts ) );
    1543                 foreach ( $posts as $post ) {
    1544                         $this->assertInstanceOf( 'WP_Post', $post );
    1545                         $this->assertEquals( 'raw', $post->filter );
    1546                 }
    1547                 $posts = wp_list_pluck( $posts, 'ID' );
    1548                 $this->assertEqualSets( array( $post_id, $post_id2 ), $posts );
    1549         }
    1550 
    1551         /**
    1552          * @ticket 15292
    1553          * @group meta
    1554          */
    1555         function test_empty_meta_value() {
    1556                 $post_id = $this->factory->post->create();
    1557                 add_post_meta( $post_id, 'foo', '0' );
    1558                 add_post_meta( $post_id, 'bar', 0 );
    1559                 $post_id2 = $this->factory->post->create();
    1560                 add_post_meta( $post_id2, 'foo', 1 );
    1561                 $post_id3 = $this->factory->post->create();
    1562                 add_post_meta( $post_id3, 'baz', 0 );
    1563                 $post_id4 = $this->factory->post->create();
    1564                 add_post_meta( $post_id4, 'baz', 0 );
    1565                 $post_id5 = $this->factory->post->create();
    1566                 add_post_meta( $post_id5, 'baz', 0 );
    1567                 add_post_meta( $post_id5, 'bar', '0' );
    1568                 $post_id6 = $this->factory->post->create();
    1569                 add_post_meta( $post_id6, 'baz', 0 );
    1570 
    1571                 $q = new WP_Query( array( 'meta_key' => 'foo', 'meta_value' => '0' ) );
    1572                 $this->assertEquals( 1, count ( $q->posts ) );
    1573                 foreach ( $q->posts as $post ) {
    1574                         $this->assertInstanceOf( 'WP_Post', $post );
    1575                         $this->assertEquals( 'raw', $post->filter );
    1576                 }
    1577                 $this->assertEquals( $post_id, $q->posts[0]->ID );
    1578 
    1579                 $posts = get_posts( array( 'meta_key' => 'bar', 'meta_value' => '0' ) );
    1580                 $this->assertEquals( 2, count ( $posts ) );
    1581                 foreach ( $posts as $post ) {
    1582                         $this->assertInstanceOf( 'WP_Post', $post );
    1583                         $this->assertEquals( 'raw', $post->filter );
    1584                 }
    1585                 $posts = wp_list_pluck( $posts, 'ID' );
    1586                 $this->assertEqualSets( array( $post_id, $post_id5 ), $posts );
    1587 
    1588                 $posts = get_posts( array( 'meta_key' => 'bar', 'meta_value' => 0 ) );
    1589                 $this->assertEquals( 2, count ( $posts ) );
    1590                 foreach ( $posts as $post ) {
    1591                         $this->assertInstanceOf( 'WP_Post', $post );
    1592                         $this->assertEquals( 'raw', $post->filter );
    1593                 }
    1594                 $posts = wp_list_pluck( $posts, 'ID' );
    1595                 $this->assertEqualSets( array( $post_id, $post_id5 ), $posts );
    1596 
    1597                 $posts = get_posts( array( 'meta_value' => 0 ) );
    1598                 $this->assertEquals( 5, count ( $posts ) );
    1599                 foreach ( $posts as $post ) {
    1600                         $this->assertInstanceOf( 'WP_Post', $post );
    1601                         $this->assertEquals( 'raw', $post->filter );
    1602                 }
    1603                 $posts = wp_list_pluck( $posts, 'ID' );
    1604                 $this->assertEqualSets( array( $post_id, $post_id3, $post_id4, $post_id5, $post_id6 ), $posts );
    1605 
    1606                 $posts = get_posts( array( 'meta_value' => '0' ) );
    1607                 $this->assertEquals( 5, count ( $posts ) );
    1608                 foreach ( $posts as $post ) {
    1609                         $this->assertInstanceOf( 'WP_Post', $post );
    1610                         $this->assertEquals( 'raw', $post->filter );
    1611                 }
    1612                 $posts = wp_list_pluck( $posts, 'ID' );
    1613                 $this->assertEqualSets( array( $post_id, $post_id3, $post_id4, $post_id5, $post_id6 ), $posts );
    1614         }
    1615 
    1616         /**
    1617          * @group taxonomy
    1618          */
    1619         public function test_tax_query_single_query_single_term_field_slug() {
    1620                 $t = $this->factory->term->create( array(
    1621                         'taxonomy' => 'category',
    1622                         'slug' => 'foo',
    1623                         'name' => 'Foo',
    1624                 ) );
    1625                 $p1 = $this->factory->post->create();
    1626                 $p2 = $this->factory->post->create();
    1627 
    1628                 wp_set_post_terms( $p1, $t, 'category' );
    1629 
    1630                 $q = new WP_Query( array(
    1631                         'fields' => 'ids',
    1632                         'update_post_meta_cache' => false,
    1633                         'update_post_term_cache' => false,
    1634                         'tax_query' => array(
    1635                                 array(
    1636                                         'taxonomy' => 'category',
    1637                                         'terms' => array( 'foo' ),
    1638                                         'field' => 'slug',
    1639                                 ),
    1640                         ),
    1641                 ) );
    1642 
    1643                 $this->assertEquals( array( $p1 ), $q->posts );
    1644         }
    1645 
    1646         /**
    1647          * @group taxonomy
    1648          */
    1649         public function test_tax_query_single_query_single_term_field_name() {
    1650                 $t = $this->factory->term->create( array(
    1651                         'taxonomy' => 'category',
    1652                         'slug' => 'foo',
    1653                         'name' => 'Foo',
    1654                 ) );
    1655                 $p1 = $this->factory->post->create();
    1656                 $p2 = $this->factory->post->create();
    1657 
    1658                 wp_set_post_terms( $p1, $t, 'category' );
    1659 
    1660                 $q = new WP_Query( array(
    1661                         'fields' => 'ids',
    1662                         'update_post_meta_cache' => false,
    1663                         'update_post_term_cache' => false,
    1664                         'tax_query' => array(
    1665                                 array(
    1666                                         'taxonomy' => 'category',
    1667                                         'terms' => array( 'Foo' ),
    1668                                         'field' => 'name',
    1669                                 ),
    1670                         ),
    1671                 ) );
    1672 
    1673                 $this->assertEquals( array( $p1 ), $q->posts );
    1674         }
    1675 
    1676         /**
    1677          * @group taxonomy
    1678          */
    1679         public function test_tax_query_single_query_single_term_field_term_taxonomy_id() {
    1680                 $t = $this->factory->term->create( array(
    1681                         'taxonomy' => 'category',
    1682                         'slug' => 'foo',
    1683                         'name' => 'Foo',
    1684                 ) );
    1685                 $p1 = $this->factory->post->create();
    1686                 $p2 = $this->factory->post->create();
    1687 
    1688                 $tt_ids = wp_set_post_terms( $p1, $t, 'category' );
    1689 
    1690                 $q = new WP_Query( array(
    1691                         'fields' => 'ids',
    1692                         'update_post_meta_cache' => false,
    1693                         'update_post_term_cache' => false,
    1694                         'tax_query' => array(
    1695                                 array(
    1696                                         'taxonomy' => 'category',
    1697                                         'terms' => $tt_ids,
    1698                                         'field' => 'term_taxonomy_id',
    1699                                 ),
    1700                         ),
    1701                 ) );
    1702 
    1703                 $this->assertEquals( array( $p1 ), $q->posts );
    1704         }
    1705 
    1706         /**
    1707          * @group taxonomy
    1708          */
    1709         public function test_tax_query_single_query_single_term_field_term_id() {
    1710                 $t = $this->factory->term->create( array(
    1711                         'taxonomy' => 'category',
    1712                         'slug' => 'foo',
    1713                         'name' => 'Foo',
    1714                 ) );
    1715                 $p1 = $this->factory->post->create();
    1716                 $p2 = $this->factory->post->create();
    1717 
    1718                 wp_set_post_terms( $p1, $t, 'category' );
    1719 
    1720                 $q = new WP_Query( array(
    1721                         'fields' => 'ids',
    1722                         'update_post_meta_cache' => false,
    1723                         'update_post_term_cache' => false,
    1724                         'tax_query' => array(
    1725                                 array(
    1726                                         'taxonomy' => 'category',
    1727                                         'terms' => array( $t ),
    1728                                         'field' => 'term_id',
    1729                                 ),
    1730                         ),
    1731                 ) );
    1732 
    1733                 $this->assertEquals( array( $p1 ), $q->posts );
    1734         }
    1735 
    1736         /**
    1737          * @group taxonomy
    1738          */
    1739         public function test_tax_query_single_query_single_term_operator_in() {
    1740                 $t = $this->factory->term->create( array(
    1741                         'taxonomy' => 'category',
    1742                         'slug' => 'foo',
    1743                         'name' => 'Foo',
    1744                 ) );
    1745                 $p1 = $this->factory->post->create();
    1746                 $p2 = $this->factory->post->create();
    1747 
    1748                 wp_set_post_terms( $p1, $t, 'category' );
    1749 
    1750                 $q = new WP_Query( array(
    1751                         'fields' => 'ids',
    1752                         'update_post_meta_cache' => false,
    1753                         'update_post_term_cache' => false,
    1754                         'tax_query' => array(
    1755                                 array(
    1756                                         'taxonomy' => 'category',
    1757                                         'terms' => array( 'foo' ),
    1758                                         'field' => 'slug',
    1759                                         'operator' => 'IN',
    1760                                 ),
    1761                         ),
    1762                 ) );
    1763 
    1764                 $this->assertEquals( array( $p1 ), $q->posts );
    1765         }
    1766 
    1767         /**
    1768          * @group taxonomy
    1769          */
    1770         public function test_tax_query_single_query_single_term_operator_not_in() {
    1771                 $t = $this->factory->term->create( array(
    1772                         'taxonomy' => 'category',
    1773                         'slug' => 'foo',
    1774                         'name' => 'Foo',
    1775                 ) );
    1776                 $p1 = $this->factory->post->create();
    1777                 $p2 = $this->factory->post->create();
    1778 
    1779                 wp_set_post_terms( $p1, $t, 'category' );
    1780 
    1781                 $q = new WP_Query( array(
    1782                         'fields' => 'ids',
    1783                         'update_post_meta_cache' => false,
    1784                         'update_post_term_cache' => false,
    1785                         'tax_query' => array(
    1786                                 array(
    1787                                         'taxonomy' => 'category',
    1788                                         'terms' => array( 'foo' ),
    1789                                         'field' => 'slug',
    1790                                         'operator' => 'NOT IN',
    1791                                 ),
    1792                         ),
    1793                 ) );
    1794 
    1795                 $this->assertEquals( array( $p2 ), $q->posts );
    1796         }
    1797 
    1798         /**
    1799          * @group taxonomy
    1800          */
    1801         public function test_tax_query_single_query_single_term_operator_and() {
    1802                 $t = $this->factory->term->create( array(
    1803                         'taxonomy' => 'category',
    1804                         'slug' => 'foo',
    1805                         'name' => 'Foo',
    1806                 ) );
    1807                 $p1 = $this->factory->post->create();
    1808                 $p2 = $this->factory->post->create();
    1809 
    1810                 wp_set_post_terms( $p1, $t, 'category' );
    1811 
    1812                 $q = new WP_Query( array(
    1813                         'fields' => 'ids',
    1814                         'update_post_meta_cache' => false,
    1815                         'update_post_term_cache' => false,
    1816                         'tax_query' => array(
    1817                                 array(
    1818                                         'taxonomy' => 'category',
    1819                                         'terms' => array( 'foo' ),
    1820                                         'field' => 'slug',
    1821                                         'operator' => 'AND',
    1822                                 ),
    1823                         ),
    1824                 ) );
    1825 
    1826                 $this->assertEquals( array( $p1 ), $q->posts );
    1827         }
    1828 
    1829         /**
    1830          * @group taxonomy
    1831          */
    1832         public function test_tax_query_single_query_multiple_terms_operator_in() {
    1833                 $t1 = $this->factory->term->create( array(
    1834                         'taxonomy' => 'category',
    1835                         'slug' => 'foo',
    1836                         'name' => 'Foo',
    1837                 ) );
    1838                 $t2 = $this->factory->term->create( array(
    1839                         'taxonomy' => 'category',
    1840                         'slug' => 'bar',
    1841                         'name' => 'Bar',
    1842                 ) );
    1843                 $p1 = $this->factory->post->create();
    1844                 $p2 = $this->factory->post->create();
    1845                 $p3 = $this->factory->post->create();
    1846 
    1847                 wp_set_post_terms( $p1, $t1, 'category' );
    1848                 wp_set_post_terms( $p2, $t2, 'category' );
    1849 
    1850                 $q = new WP_Query( array(
    1851                         'fields' => 'ids',
    1852                         'update_post_meta_cache' => false,
    1853                         'update_post_term_cache' => false,
    1854                         'tax_query' => array(
    1855                                 array(
    1856                                         'taxonomy' => 'category',
    1857                                         'terms' => array( 'foo', 'bar' ),
    1858                                         'field' => 'slug',
    1859                                         'operator' => 'IN',
    1860                                 ),
    1861                         ),
    1862                 ) );
    1863 
    1864                 $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
    1865         }
    1866 
    1867         /**
    1868          * @group taxonomy
    1869          */
    1870         public function test_tax_query_single_query_multiple_terms_operator_not_in() {
    1871                 $t1 = $this->factory->term->create( array(
    1872                         'taxonomy' => 'category',
    1873                         'slug' => 'foo',
    1874                         'name' => 'Foo',
    1875                 ) );
    1876                 $t2 = $this->factory->term->create( array(
    1877                         'taxonomy' => 'category',
    1878                         'slug' => 'bar',
    1879                         'name' => 'Bar',
    1880                 ) );
    1881                 $p1 = $this->factory->post->create();
    1882                 $p2 = $this->factory->post->create();
    1883                 $p3 = $this->factory->post->create();
    1884 
    1885                 wp_set_post_terms( $p1, $t1, 'category' );
    1886                 wp_set_post_terms( $p2, $t2, 'category' );
    1887 
    1888                 $q = new WP_Query( array(
    1889                         'fields' => 'ids',
    1890                         'update_post_meta_cache' => false,
    1891                         'update_post_term_cache' => false,
    1892                         'tax_query' => array(
    1893                                 array(
    1894                                         'taxonomy' => 'category',
    1895                                         'terms' => array( 'foo', 'bar' ),
    1896                                         'field' => 'slug',
    1897                                         'operator' => 'NOT IN',
    1898                                 ),
    1899                         ),
    1900                 ) );
    1901 
    1902                 $this->assertEquals( array( $p3 ), $q->posts );
    1903         }
    1904 
    1905         /**
    1906          * @group taxonomy
    1907          * @ticket 18105
    1908          */
    1909         public function test_tax_query_single_query_multiple_queries_operator_not_in() {
    1910                 $t1 = $this->factory->term->create( array(
    1911                         'taxonomy' => 'category',
    1912                         'slug' => 'foo',
    1913                         'name' => 'Foo',
    1914                 ) );
    1915                 $t2 = $this->factory->term->create( array(
    1916                         'taxonomy' => 'category',
    1917                         'slug' => 'bar',
    1918                         'name' => 'Bar',
    1919                 ) );
    1920                 $p1 = $this->factory->post->create();
    1921                 $p2 = $this->factory->post->create();
    1922                 $p3 = $this->factory->post->create();
    1923 
    1924                 wp_set_post_terms( $p1, $t1, 'category' );
    1925                 wp_set_post_terms( $p2, $t2, 'category' );
    1926 
    1927                 $q = new WP_Query( array(
    1928                         'fields' => 'ids',
    1929                         'update_post_meta_cache' => false,
    1930                         'update_post_term_cache' => false,
    1931                         'tax_query' => array(
    1932                                 'relation' => 'AND',
    1933                                 array(
    1934                                         'taxonomy' => 'category',
    1935                                         'terms' => array( 'foo' ),
    1936                                         'field' => 'slug',
    1937                                         'operator' => 'NOT IN',
    1938                                 ),
    1939                                 array(
    1940                                         'taxonomy' => 'category',
    1941                                         'terms' => array( 'bar' ),
    1942                                         'field' => 'slug',
    1943                                         'operator' => 'NOT IN',
    1944                                 ),
    1945                         ),
    1946                 ) );
    1947 
    1948                 $this->assertEquals( array( $p3 ), $q->posts );
    1949         }
    1950 
    1951         /**
    1952          * @group taxonomy
    1953          */
    1954         public function test_tax_query_single_query_multiple_terms_operator_and() {
    1955                 $t1 = $this->factory->term->create( array(
    1956                         'taxonomy' => 'category',
    1957                         'slug' => 'foo',
    1958                         'name' => 'Foo',
    1959                 ) );
    1960                 $t2 = $this->factory->term->create( array(
    1961                         'taxonomy' => 'category',
    1962                         'slug' => 'bar',
    1963                         'name' => 'Bar',
    1964                 ) );
    1965                 $p1 = $this->factory->post->create();
    1966                 $p2 = $this->factory->post->create();
    1967                 $p3 = $this->factory->post->create();
    1968 
    1969                 wp_set_object_terms( $p1, $t1, 'category' );
    1970                 wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' );
    1971 
    1972                 $q = new WP_Query( array(
    1973                         'fields' => 'ids',
    1974                         'update_post_meta_cache' => false,
    1975                         'update_post_term_cache' => false,
    1976                         'tax_query' => array(
    1977                                 array(
    1978                                         'taxonomy' => 'category',
    1979                                         'terms' => array( 'foo', 'bar' ),
    1980                                         'field' => 'slug',
    1981                                         'operator' => 'AND',
    1982                                 ),
    1983                         ),
    1984                 ) );
    1985 
    1986                 $this->assertEquals( array( $p2 ), $q->posts );
    1987         }
    1988 
    1989         /**
    1990          * @ticket 29181
    1991          */
    1992         public function test_tax_query_operator_not_exists() {
    1993                 register_taxonomy( 'wptests_tax1', 'post' );
    1994                 register_taxonomy( 'wptests_tax2', 'post' );
    1995 
    1996                 $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
    1997                 $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
    1998 
    1999                 $p1 = $this->factory->post->create();
    2000                 $p2 = $this->factory->post->create();
    2001                 $p3 = $this->factory->post->create();
    2002 
    2003                 wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
    2004                 wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
    2005 
    2006                 $q = new WP_Query( array(
    2007                         'fields' => 'ids',
    2008                         'orderby' => 'ID',
    2009                         'order' => 'ASC',
    2010                         'tax_query' => array(
    2011                                 array(
    2012                                         'taxonomy' => 'wptests_tax2',
    2013                                         'operator' => 'NOT EXISTS',
    2014                                 ),
    2015                         ),
    2016                 ) );
    2017 
    2018                 $this->assertEqualSets( array( $p1, $p3 ), $q->posts );
    2019         }
    2020 
    2021         /**
    2022          * @ticket 29181
    2023          */
    2024         public function test_tax_query_operator_exists() {
    2025                 register_taxonomy( 'wptests_tax1', 'post' );
    2026                 register_taxonomy( 'wptests_tax2', 'post' );
    2027 
    2028                 $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
    2029                 $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
    2030 
    2031                 $p1 = $this->factory->post->create();
    2032                 $p2 = $this->factory->post->create();
    2033                 $p3 = $this->factory->post->create();
    2034 
    2035                 wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
    2036                 wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
    2037 
    2038                 $q = new WP_Query( array(
    2039                         'fields' => 'ids',
    2040                         'orderby' => 'ID',
    2041                         'order' => 'ASC',
    2042                         'tax_query' => array(
    2043                                 array(
    2044                                         'taxonomy' => 'wptests_tax2',
    2045                                         'operator' => 'EXISTS',
    2046                                 ),
    2047                         ),
    2048                 ) );
    2049 
    2050                 $this->assertEqualSets( array( $p2 ), $q->posts );
    2051         }
    2052 
    2053         /**
    2054          * @ticket 29181
    2055          */
    2056         public function test_tax_query_operator_exists_should_ignore_terms() {
    2057                 register_taxonomy( 'wptests_tax1', 'post' );
    2058                 register_taxonomy( 'wptests_tax2', 'post' );
    2059 
    2060                 $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
    2061                 $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
    2062 
    2063                 $p1 = $this->factory->post->create();
    2064                 $p2 = $this->factory->post->create();
    2065                 $p3 = $this->factory->post->create();
    2066 
    2067                 wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
    2068                 wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
    2069 
    2070                 $q = new WP_Query( array(
    2071                         'fields' => 'ids',
    2072                         'orderby' => 'ID',
    2073                         'order' => 'ASC',
    2074                         'tax_query' => array(
    2075                                 array(
    2076                                         'taxonomy' => 'wptests_tax2',
    2077                                         'operator' => 'EXISTS',
    2078                                         'terms' => array( 'foo', 'bar' ),
    2079                                 ),
    2080                         ),
    2081                 ) );
    2082 
    2083                 $this->assertEqualSets( array( $p2 ), $q->posts );
    2084         }
    2085 
    2086         /**
    2087          * @ticket 29181
    2088          */
    2089         public function test_tax_query_operator_exists_with_no_taxonomy() {
    2090                 register_taxonomy( 'wptests_tax1', 'post' );
    2091                 register_taxonomy( 'wptests_tax2', 'post' );
    2092 
    2093                 $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
    2094                 $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
    2095 
    2096                 $p1 = $this->factory->post->create();
    2097                 $p2 = $this->factory->post->create();
    2098                 $p3 = $this->factory->post->create();
    2099 
    2100                 wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
    2101                 wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
    2102 
    2103                 $q = new WP_Query( array(
    2104                         'fields' => 'ids',
    2105                         'orderby' => 'ID',
    2106                         'order' => 'ASC',
    2107                         'tax_query' => array(
    2108                                 array(
    2109                                         'operator' => 'EXISTS',
    2110                                 ),
    2111                         ),
    2112                 ) );
    2113 
    2114                 $this->assertEmpty( $q->posts );
    2115         }
    2116 
    2117         /**
    2118          * @group taxonomy
    2119          */
    2120         public function test_tax_query_multiple_queries_relation_and() {
    2121                 $t1 = $this->factory->term->create( array(
    2122                         'taxonomy' => 'category',
    2123                         'slug' => 'foo',
    2124                         'name' => 'Foo',
    2125                 ) );
    2126                 $t2 = $this->factory->term->create( array(
    2127                         'taxonomy' => 'category',
    2128                         'slug' => 'bar',
    2129                         'name' => 'Bar',
    2130                 ) );
    2131                 $p1 = $this->factory->post->create();
    2132                 $p2 = $this->factory->post->create();
    2133                 $p3 = $this->factory->post->create();
    2134 
    2135                 wp_set_object_terms( $p1, $t1, 'category' );
    2136                 wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' );
    2137 
    2138                 $q = new WP_Query( array(
    2139                         'fields' => 'ids',
    2140                         'update_post_meta_cache' => false,
    2141                         'update_post_term_cache' => false,
    2142                         'tax_query' => array(
    2143                                 'relation' => 'AND',
    2144                                 array(
    2145                                         'taxonomy' => 'category',
    2146                                         'terms' => array( 'foo' ),
    2147                                         'field' => 'slug',
    2148                                 ),
    2149                                 array(
    2150                                         'taxonomy' => 'category',
    2151                                         'terms' => array( 'bar' ),
    2152                                         'field' => 'slug',
    2153                                 ),
    2154                         ),
    2155                 ) );
    2156 
    2157                 $this->assertEquals( array( $p2 ), $q->posts );
    2158         }
    2159 
    2160         /**
    2161          * @group taxonomy
    2162          */
    2163         public function test_tax_query_multiple_queries_relation_or() {
    2164                 $t1 = $this->factory->term->create( array(
    2165                         'taxonomy' => 'category',
    2166                         'slug' => 'foo',
    2167                         'name' => 'Foo',
    2168                 ) );
    2169                 $t2 = $this->factory->term->create( array(
    2170                         'taxonomy' => 'category',
    2171                         'slug' => 'bar',
    2172                         'name' => 'Bar',
    2173                 ) );
    2174                 $p1 = $this->factory->post->create();
    2175                 $p2 = $this->factory->post->create();
    2176                 $p3 = $this->factory->post->create();
    2177 
    2178                 wp_set_object_terms( $p1, $t1, 'category' );
    2179                 wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' );
    2180 
    2181                 $q = new WP_Query( array(
    2182                         'fields' => 'ids',
    2183                         'update_post_meta_cache' => false,
    2184                         'update_post_term_cache' => false,
    2185                         'tax_query' => array(
    2186                                 'relation' => 'OR',
    2187                                 array(
    2188                                         'taxonomy' => 'category',
    2189                                         'terms' => array( 'foo' ),
    2190                                         'field' => 'slug',
    2191                                 ),
    2192                                 array(
    2193                                         'taxonomy' => 'category',
    2194                                         'terms' => array( 'bar' ),
    2195                                         'field' => 'slug',
    2196                                 ),
    2197                         ),
    2198                 ) );
    2199 
    2200                 $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
    2201         }
    2202 
    2203         /**
    2204          * @group taxonomy
    2205          */
    2206         public function test_tax_query_multiple_queries_different_taxonomies() {
    2207                 $t1 = $this->factory->term->create( array(
    2208                         'taxonomy' => 'post_tag',
    2209                         'slug' => 'foo',
    2210                         'name' => 'Foo',
    2211                 ) );
    2212                 $t2 = $this->factory->term->create( array(
    2213                         'taxonomy' => 'category',
    2214                         'slug' => 'bar',
    2215                         'name' => 'Bar',
    2216                 ) );
    2217                 $p1 = $this->factory->post->create();
    2218                 $p2 = $this->factory->post->create();
    2219                 $p3 = $this->factory->post->create();
    2220 
    2221                 wp_set_object_terms( $p1, $t1, 'post_tag' );
    2222                 wp_set_object_terms( $p2, $t2, 'category' );
    2223 
    2224                 $q = new WP_Query( array(
    2225                         'fields' => 'ids',
    2226                         'update_post_meta_cache' => false,
    2227                         'update_post_term_cache' => false,
    2228                         'tax_query' => array(
    2229                                 'relation' => 'OR',
    2230                                 array(
    2231                                         'taxonomy' => 'post_tag',
    2232                                         'terms' => array( 'foo' ),
    2233                                         'field' => 'slug',
    2234                                 ),
    2235                                 array(
    2236                                         'taxonomy' => 'category',
    2237                                         'terms' => array( 'bar' ),
    2238                                         'field' => 'slug',
    2239                                 ),
    2240                         ),
    2241                 ) );
    2242 
    2243                 $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
    2244         }
    2245 
    2246         /**
    2247          * @ticket 29738
    2248          * @group taxonomy
    2249          */
    2250         public function test_tax_query_two_nested_queries() {
    2251                 register_taxonomy( 'foo', 'post' );
    2252                 register_taxonomy( 'bar', 'post' );
    2253 
    2254                 $foo_term_1 = $this->factory->term->create( array(
    2255                         'taxonomy' => 'foo',
    2256                 ) );
    2257                 $foo_term_2 = $this->factory->term->create( array(
    2258                         'taxonomy' => 'foo',
    2259                 ) );
    2260                 $bar_term_1 = $this->factory->term->create( array(
    2261                         'taxonomy' => 'bar',
    2262                 ) );
    2263                 $bar_term_2 = $this->factory->term->create( array(
    2264                         'taxonomy' => 'bar',
    2265                 ) );
    2266 
    2267                 $p1 = $this->factory->post->create();
    2268                 $p2 = $this->factory->post->create();
    2269                 $p3 = $this->factory->post->create();
    2270 
    2271                 wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
    2272                 wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
    2273                 wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
    2274                 wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
    2275                 wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
    2276                 wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
    2277 
    2278                 $q = new WP_Query( array(
    2279                         'fields' => 'ids',
    2280                         'update_post_meta_cache' => false,
    2281                         'update_post_term_cache' => false,
    2282                         'tax_query' => array(
    2283                                 'relation' => 'OR',
    2284                                 array(
    2285                                         'relation' => 'AND',
    2286                                         array(
    2287                                                 'taxonomy' => 'foo',
    2288                                                 'terms' => array( $foo_term_1 ),
    2289                                                 'field' => 'term_id',
    2290                                         ),
    2291                                         array(
    2292                                                 'taxonomy' => 'bar',
    2293                                                 'terms' => array( $bar_term_1 ),
    2294                                                 'field' => 'term_id',
    2295                                         ),
    2296                                 ),
    2297                                 array(
    2298                                         'relation' => 'AND',
    2299                                         array(
    2300                                                 'taxonomy' => 'foo',
    2301                                                 'terms' => array( $foo_term_2 ),
    2302                                                 'field' => 'term_id',
    2303                                         ),
    2304                                         array(
    2305                                                 'taxonomy' => 'bar',
    2306                                                 'terms' => array( $bar_term_2 ),
    2307                                                 'field' => 'term_id',
    2308                                         ),
    2309                                 ),
    2310                         ),
    2311                 ) );
    2312 
    2313                 _unregister_taxonomy( 'foo' );
    2314                 _unregister_taxonomy( 'bar' );
    2315 
    2316                 $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
    2317         }
    2318 
    2319         /**
    2320          * @ticket 29738
    2321          * @group taxonomy
    2322          */
    2323         public function test_tax_query_one_nested_query_one_first_order_query() {
    2324                 register_taxonomy( 'foo', 'post' );
    2325                 register_taxonomy( 'bar', 'post' );
    2326 
    2327                 $foo_term_1 = $this->factory->term->create( array(
    2328                         'taxonomy' => 'foo',
    2329                 ) );
    2330                 $foo_term_2 = $this->factory->term->create( array(
    2331                         'taxonomy' => 'foo',
    2332                 ) );
    2333                 $bar_term_1 = $this->factory->term->create( array(
    2334                         'taxonomy' => 'bar',
    2335                 ) );
    2336                 $bar_term_2 = $this->factory->term->create( array(
    2337                         'taxonomy' => 'bar',
    2338                 ) );
    2339 
    2340                 $p1 = $this->factory->post->create();
    2341                 $p2 = $this->factory->post->create();
    2342                 $p3 = $this->factory->post->create();
    2343 
    2344                 wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
    2345                 wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
    2346                 wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
    2347                 wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
    2348                 wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
    2349                 wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
    2350 
    2351                 $q = new WP_Query( array(
    2352                         'fields' => 'ids',
    2353                         'update_post_meta_cache' => false,
    2354                         'update_post_term_cache' => false,
    2355                         'tax_query' => array(
    2356                                 'relation' => 'OR',
    2357                                 array(
    2358                                         'taxonomy' => 'foo',
    2359                                         'terms' => array( $foo_term_2 ),
    2360                                         'field' => 'term_id',
    2361                                 ),
    2362                                 array(
    2363                                         'relation' => 'AND',
    2364                                         array(
    2365                                                 'taxonomy' => 'foo',
    2366                                                 'terms' => array( $foo_term_1 ),
    2367                                                 'field' => 'term_id',
    2368                                         ),
    2369                                         array(
    2370                                                 'taxonomy' => 'bar',
    2371                                                 'terms' => array( $bar_term_1 ),
    2372                                                 'field' => 'term_id',
    2373                                         ),
    2374                                 ),
    2375                         ),
    2376                 ) );
    2377 
    2378                 _unregister_taxonomy( 'foo' );
    2379                 _unregister_taxonomy( 'bar' );
    2380 
    2381                 $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
    2382         }
    2383 
    2384         /**
    2385          * @ticket 29738
    2386          * @group taxonomy
    2387          */
    2388         public function test_tax_query_one_double_nested_query_one_first_order_query() {
    2389                 register_taxonomy( 'foo', 'post' );
    2390                 register_taxonomy( 'bar', 'post' );
    2391 
    2392                 $foo_term_1 = $this->factory->term->create( array(
    2393                         'taxonomy' => 'foo',
    2394                 ) );
    2395                 $foo_term_2 = $this->factory->term->create( array(
    2396                         'taxonomy' => 'foo',
    2397                 ) );
    2398                 $bar_term_1 = $this->factory->term->create( array(
    2399                         'taxonomy' => 'bar',
    2400                 ) );
    2401                 $bar_term_2 = $this->factory->term->create( array(
    2402                         'taxonomy' => 'bar',
    2403                 ) );
    2404 
    2405                 $p1 = $this->factory->post->create();
    2406                 $p2 = $this->factory->post->create();
    2407                 $p3 = $this->factory->post->create();
    2408                 $p4 = $this->factory->post->create();
    2409 
    2410                 wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
    2411                 wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
    2412                 wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
    2413                 wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
    2414                 wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
    2415                 wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
    2416 
    2417                 $q = new WP_Query( array(
    2418                         'fields' => 'ids',
    2419                         'update_post_meta_cache' => false,
    2420                         'update_post_term_cache' => false,
    2421                         'tax_query' => array(
    2422                                 'relation' => 'OR',
    2423                                 array(
    2424                                         'taxonomy' => 'foo',
    2425                                         'terms' => array( $foo_term_2 ),
    2426                                         'field' => 'term_id',
    2427                                 ),
    2428                                 array(
    2429                                         'relation' => 'AND',
    2430                                         array(
    2431                                                 'taxonomy' => 'foo',
    2432                                                 'terms' => array( $foo_term_1 ),
    2433                                                 'field' => 'term_id',
    2434                                         ),
    2435                                         array(
    2436                                                 'relation' => 'OR',
    2437                                                 array(
    2438                                                         'taxonomy' => 'bar',
    2439                                                         'terms' => array( $bar_term_1 ),
    2440                                                         'field' => 'term_id',
    2441                                                 ),
    2442                                                 array(
    2443                                                         'taxonomy' => 'bar',
    2444                                                         'terms' => array( $bar_term_2 ),
    2445                                                         'field' => 'term_id',
    2446                                                 ),
    2447                                         ),
    2448                                 ),
    2449                         ),
    2450                 ) );
    2451 
    2452                 _unregister_taxonomy( 'foo' );
    2453                 _unregister_taxonomy( 'bar' );
    2454 
    2455                 $this->assertEqualSets( array( $p1, $p2, $p3 ), $q->posts );
    2456         }
    2457 
    2458         /**
    2459          * @ticket 20604
    2460          * @group taxonomy
    2461          */
    2462         public function test_tax_query_relation_or_both_clauses_empty_terms() {
    2463                 // An empty tax query should return an empty array, not all posts.
    2464 
    2465                 $this->factory->post->create_many( 10 );
    2466 
    2467                 $query = new WP_Query( array(
    2468                         'fields' => 'ids',
    2469                         'update_post_term_cache' => false,
    2470                         'update_post_meta_cache' => false,
    2471                         'tax_query' => array(
    2472                                 'relation' => 'OR',
    2473                                 array(
    2474                                         'taxonomy' => 'post_tag',
    2475                                         'field' => 'id',
    2476                                         'terms' => false,
    2477                                         'operator' => 'IN'
    2478                                 ),
    2479                                 array(
    2480                                         'taxonomy' => 'category',
    2481                                         'field' => 'id',
    2482                                         'terms' => false,
    2483                                         'operator' => 'IN'
    2484                                 ),
    2485                         )
    2486                 ) );
    2487 
    2488                 $posts = $query->get_posts();
    2489                 $this->assertEquals( 0 , count( $posts ) );
    2490         }
    2491 
    2492         /**
    2493          * @ticket 20604
    2494          * @group taxonomy
    2495          */
    2496         public function test_tax_query_relation_or_one_clause_empty_terms() {
    2497                 // An empty tax query should return an empty array, not all posts.
    2498 
    2499                 $this->factory->post->create_many( 10 );
    2500 
    2501                 $query = new WP_Query( array(
    2502                         'fields' => 'ids',
    2503                         'update_post_term_cache' => false,
    2504                         'update_post_meta_cache' => false,
    2505                         'tax_query' => array(
    2506                                 'relation' => 'OR',
    2507                                 array(
    2508                                         'taxonomy' => 'post_tag',
    2509                                         'field' => 'id',
    2510                                         'terms' => array( 'foo' ),
    2511                                         'operator' => 'IN'
    2512                                 ),
    2513                                 array(
    2514                                         'taxonomy' => 'category',
    2515                                         'field' => 'id',
    2516                                         'terms' => false,
    2517                                         'operator' => 'IN'
    2518                                 ),
    2519                         )
    2520                 ) );
    2521 
    2522                 $posts = $query->get_posts();
    2523                 $this->assertEquals( 0 , count( $posts ) );
    2524         }
    2525 
    2526         /**
    2527          * @group taxonomy
    2528          */
    2529         public function test_tax_query_include_children() {
    2530                 $cat_a = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'Australia' ) );
    2531                 $cat_b = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'Sydney', 'parent' => $cat_a ) );
    2532                 $cat_c = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'East Syndney', 'parent' => $cat_b ) );
    2533                 $cat_d = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'West Syndney', 'parent' => $cat_b ) );
    2534 
    2535                 $post_a = $this->factory->post->create( array( 'post_category' => array( $cat_a ) ) );
    2536                 $post_b = $this->factory->post->create( array( 'post_category' => array( $cat_b ) ) );
    2537                 $post_c = $this->factory->post->create( array( 'post_category' => array( $cat_c ) ) );
    2538                 $post_d = $this->factory->post->create( array( 'post_category' => array( $cat_d ) ) );
    2539 
    2540                 $posts = get_posts( array(
    2541                         'fields' => 'ids',
    2542                         'update_post_meta_cache' => false,
    2543                         'update_post_term_cache' => false,
    2544                         'tax_query' => array(
    2545                                 array(
    2546                                         'taxonomy' => 'category',
    2547                                         'field' => 'id',
    2548                                         'terms' => array( $cat_a ),
    2549                                 )
    2550                         )
    2551                 ) );
    2552 
    2553                 $this->assertEquals( 4 , count( $posts ) );
    2554 
    2555                 $posts = get_posts( array(
    2556                         'fields' => 'ids',
    2557                         'update_post_meta_cache' => false,
    2558                         'update_post_term_cache' => false,
    2559                         'tax_query' => array(
    2560                                 array(
    2561                                         'taxonomy' => 'category',
    2562                                         'field' => 'id',
    2563                                         'terms' => array( $cat_a ),
    2564                                         'include_children' => false
    2565                                 )
    2566                         )
    2567                 ) );
    2568 
    2569                 $this->assertEquals( 1 , count( $posts ) );
    2570 
    2571                 $posts = get_posts( array(
    2572                         'fields' => 'ids',
    2573                         'update_post_meta_cache' => false,
    2574                         'update_post_term_cache' => false,
    2575                         'tax_query' => array(
    2576                                 array(
    2577                                         'taxonomy' => 'category',
    2578                                         'field' => 'id',
    2579                                         'terms' => array( $cat_b ),
    2580                                 )
    2581                         )
    2582                 ) );
    2583 
    2584                 $this->assertEquals( 3 , count( $posts ) );
    2585 
    2586                 $posts = get_posts( array(
    2587                         'fields' => 'ids',
    2588                         'update_post_meta_cache' => false,
    2589                         'update_post_term_cache' => false,
    2590                         'tax_query' => array(
    2591                                 array(
    2592                                         'taxonomy' => 'category',
    2593                                         'field' => 'id',
    2594                                         'terms' => array( $cat_b ),
    2595                                         'include_children' => false
    2596                                 )
    2597                         )
    2598                 ) );
    2599 
    2600                 $this->assertEquals( 1 , count( $posts ) );
    2601 
    2602                 $posts = get_posts( array(
    2603                         'fields' => 'ids',
    2604                         'update_post_meta_cache' => false,
    2605                         'update_post_term_cache' => false,
    2606                         'tax_query' => array(
    2607                                 array(
    2608                                         'taxonomy' => 'category',
    2609                                         'field' => 'id',
    2610                                         'terms' => array( $cat_c ),
    2611                                 )
    2612                         )
    2613                 ) );
    2614 
    2615                 $this->assertEquals( 1 , count( $posts ) );
    2616 
    2617                 $posts = get_posts( array(
    2618                         'fields' => 'ids',
    2619                         'update_post_meta_cache' => false,
    2620                         'update_post_term_cache' => false,
    2621                         'tax_query' => array(
    2622                                 array(
    2623                                         'taxonomy' => 'category',
    2624                                         'field' => 'id',
    2625                                         'terms' => array( $cat_c ),
    2626                                         'include_children' => false
    2627                                 )
    2628                         )
    2629                 ) );
    2630 
    2631                 $this->assertEquals( 1 , count( $posts ) );
    26326        }
    26337
     
    266438
    266539        /**
    2666          * @group taxonomy
    2667          */
    2668         public function test_tax_query_taxonomy_with_attachments() {
    2669                 $q = new WP_Query();
    2670 
    2671                 register_taxonomy_for_object_type( 'post_tag', 'attachment:image' );
    2672                 $tag_id = $this->factory->term->create( array( 'slug' => rand_str(), 'name' => rand_str() ) );
    2673                 $image_id = $this->factory->attachment->create_object( 'image.jpg', 0, array(
    2674                         'post_mime_type' => 'image/jpeg',
    2675                         'post_type' => 'attachment'
    2676                 ) );
    2677                 wp_set_object_terms( $image_id, $tag_id, 'post_tag' );
    2678 
    2679                 $posts = $q->query( array(
    2680                         'fields' => 'ids',
    2681                         'update_post_meta_cache' => false,
    2682                         'update_post_term_cache' => false,
    2683                         'post_type' => 'attachment',
    2684                         'post_status' => 'inherit',
    2685                         'tax_query' => array(
    2686                                 array(
    2687                                         'taxonomy' => 'post_tag',
    2688                                         'field' => 'term_id',
    2689                                         'terms' => array( $tag_id )
    2690                                 )
    2691                         )
    2692                 ) );
    2693 
    2694                 $this->assertEquals( array( $image_id ), $posts );
    2695         }
    2696 
    2697         /**
    2698          * @group taxonomy
    2699          */
    2700         function test_tax_query_no_taxonomy() {
    2701                 $cat_id = $this->factory->category->create( array( 'name' => 'alpha' ) );
    2702                 $this->factory->post->create( array( 'post_title' => 'alpha', 'post_category' => array( $cat_id ) ) );
    2703 
    2704                 $response1 = new WP_Query( array(
    2705                         'tax_query' => array(
    2706                                 array( 'terms' => array( $cat_id ) )
    2707                         )
    2708                 ) );
    2709                 $this->assertEmpty( $response1->posts );
    2710 
    2711                 $response2 = new WP_Query( array(
    2712                         'fields' => 'ids',
    2713                         'update_post_meta_cache' => false,
    2714                         'update_post_term_cache' => false,
    2715                         'tax_query' => array(
    2716                                 array(
    2717                                         'taxonomy' => 'category',
    2718                                         'terms' => array( $cat_id )
    2719                                 )
    2720                         )
    2721                 ) );
    2722                 $this->assertNotEmpty( $response2->posts );
    2723 
    2724                 $term = get_category( $cat_id );
    2725                 $response3 = new WP_Query( array(
    2726                         'fields' => 'ids',
    2727                         'update_post_meta_cache' => false,
    2728                         'update_post_term_cache' => false,
    2729                         'tax_query' => array(
    2730                                 array(
    2731                                         'field' => 'term_taxonomy_id',
    2732                                         'terms' => array( $term->term_taxonomy_id )
    2733                                 )
    2734                         )
    2735                 ) );
    2736                 $this->assertNotEmpty( $response3->posts );
    2737         }
    2738 
    2739         /**
    2740          * @group taxonomy
    2741          */
    2742         function test_term_taxonomy_id_field_no_taxonomy() {
    2743                 $q = new WP_Query();
    2744 
    2745                 $posts = $this->factory->post->create_many( 5 );
    2746 
    2747                 $cats = $tags = array();
    2748 
    2749                 // need term_taxonomy_ids in addition to term_ids, so no factory
    2750                 for ( $i = 0; $i < 5; $i++ ) {
    2751                         $cats[$i] = wp_insert_term( 'category-' . $i , 'category' );
    2752                         $tags[$i] = wp_insert_term( 'tag-' . $i, 'post_tag' );
    2753 
    2754                         // post 0 gets all terms
    2755                         wp_set_object_terms( $posts[0], array( $cats[$i]['term_id'] ), 'category', true );
    2756                         wp_set_object_terms( $posts[0], array( $tags[$i]['term_id'] ), 'post_tag', true );
    2757                 }
    2758 
    2759                 wp_set_object_terms( $posts[1], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' );
    2760                 wp_set_object_terms( $posts[1], array( $tags[0]['term_id'], $tags[2]['term_id'], $cats[4]['term_id'] ), 'post_tag' );
    2761 
    2762                 wp_set_object_terms( $posts[2], array( $cats[1]['term_id'], $cats[3]['term_id'] ), 'category' );
    2763                 wp_set_object_terms( $posts[2], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' );
    2764 
    2765                 wp_set_object_terms( $posts[3], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' );
    2766                 wp_set_object_terms( $posts[3], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' );
    2767 
    2768                 $results1 = $q->query( array(
    2769                         'fields' => 'ids',
    2770                         'update_post_meta_cache' => false,
    2771                         'update_post_term_cache' => false,
    2772                         'orderby' => 'ID',
    2773                         'order' => 'ASC',
    2774                         'tax_query' => array(
    2775                                 'relation' => 'OR',
    2776                                 array(
    2777                                         'field' => 'term_taxonomy_id',
    2778                                         'terms' => array( $cats[0]['term_taxonomy_id'], $cats[2]['term_taxonomy_id'], $cats[4]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'], $tags[2]['term_taxonomy_id'], $cats[4]['term_taxonomy_id'] ),
    2779                                         'operator' => 'AND',
    2780                                         'include_children' => false,
    2781                                 ),
    2782                                 array(
    2783                                         'field' => 'term_taxonomy_id',
    2784                                         'terms' => array( $cats[1]['term_taxonomy_id'], $cats[3]['term_taxonomy_id'], $tags[1]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ),
    2785                                         'operator' => 'AND',
    2786                                         'include_children' => false,
    2787                                 )
    2788                         )
    2789                 ) );
    2790 
    2791                 $this->assertEquals( array( $posts[0], $posts[1], $posts[2] ), $results1, 'Relation: OR; Operator: AND' );
    2792 
    2793                 $results2 = $q->query( array(
    2794                         'fields' => 'ids',
    2795                         'update_post_meta_cache' => false,
    2796                         'update_post_term_cache' => false,
    2797                         'orderby' => 'ID',
    2798                         'order' => 'ASC',
    2799                         'tax_query' => array(
    2800                                 'relation' => 'AND',
    2801                                 array(
    2802                                         'field' => 'term_taxonomy_id',
    2803                                         'terms' => array( $cats[0]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'] ),
    2804                                         'operator' => 'IN',
    2805                                         'include_children' => false,
    2806                                 ),
    2807                                 array(
    2808                                         'field' => 'term_taxonomy_id',
    2809                                         'terms' => array( $cats[3]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ),
    2810                                         'operator' => 'IN',
    2811                                         'include_children' => false,
    2812                                 )
    2813                         )
    2814                 ) );
    2815 
    2816                 $this->assertEquals( array( $posts[0], $posts[3] ), $results2, 'Relation: AND; Operator: IN' );
    2817         }
    2818 
    2819         /**
    282040         * @ticket 28099
    282141         * @group taxonomy
     
    284565                $q6 = get_posts( array( 'tag_slug__in' => array() ) );
    284666                $this->assertNotEmpty( $q6 );
    2847         }
    2848 
    2849         /**
    2850          * @group taxonomy
    2851          * @ticket 29738
    2852          */
    2853         public function test_populate_taxonomy_query_var_from_tax_query() {
    2854                 register_taxonomy( 'foo', 'post' );
    2855                 $t = $this->factory->term->create( array(
    2856                         'taxonomy' => 'foo',
    2857                 ) );
    2858                 $c = $this->factory->term->create( array(
    2859                         'taxonomy' => 'category',
    2860                 ) );
    2861 
    2862                 $q = new WP_Query( array(
    2863                         'tax_query' => array(
    2864                                 // Empty terms mean that this one should be skipped
    2865                                 array(
    2866                                         'taxonomy' => 'bar',
    2867                                         'terms' => array(),
    2868                                 ),
    2869 
    2870                                 // Category and post tags should be skipped
    2871                                 array(
    2872                                         'taxonomy' => 'category',
    2873                                         'terms' => array( $c ),
    2874                                 ),
    2875 
    2876                                 array(
    2877                                         'taxonomy' => 'foo',
    2878                                         'terms' => array( $t ),
    2879                                 ),
    2880                         ),
    2881                 ) );
    2882 
    2883                 $this->assertSame( 'foo', $q->get( 'taxonomy' ) );
    2884 
    2885                 _unregister_taxonomy( 'foo' );
    2886         }
    2887 
    2888         /**
    2889          * @group taxonomy
    2890          */
    2891         public function test_populate_taxonomy_query_var_from_tax_query_taxonomy_already_set() {
    2892                 register_taxonomy( 'foo', 'post' );
    2893                 register_taxonomy( 'foo1', 'post' );
    2894                 $t = $this->factory->term->create( array(
    2895                         'taxonomy' => 'foo',
    2896                 ) );
    2897 
    2898                 $q = new WP_Query( array(
    2899                         'taxonomy' => 'bar',
    2900                         'tax_query' => array(
    2901                                 array(
    2902                                         'taxonomy' => 'foo',
    2903                                         'terms' => array( $t ),
    2904                                 ),
    2905                         ),
    2906                 ) );
    2907 
    2908                 $this->assertSame( 'bar', $q->get( 'taxonomy' ) );
    2909 
    2910                 _unregister_taxonomy( 'foo' );
    2911                 _unregister_taxonomy( 'foo1' );
    2912         }
    2913 
    2914         /**
    2915          * @group taxonomy
    2916          */
    2917         public function test_populate_term_query_var_from_tax_query() {
    2918                 register_taxonomy( 'foo', 'post' );
    2919                 $t = $this->factory->term->create( array(
    2920                         'taxonomy' => 'foo',
    2921                         'slug' => 'bar',
    2922                 ) );
    2923 
    2924                 $q = new WP_Query( array(
    2925                         'tax_query' => array(
    2926                                 array(
    2927                                         'taxonomy' => 'foo',
    2928                                         'terms' => array( 'bar' ),
    2929                                         'field' => 'slug',
    2930                                 ),
    2931                         ),
    2932                 ) );
    2933 
    2934                 $this->assertSame( 'bar', $q->get( 'term' ) );
    2935 
    2936                 _unregister_taxonomy( 'foo' );
    2937         }
    2938 
    2939         /**
    2940          * @group taxonomy
    2941          */
    2942         public function test_populate_term_id_query_var_from_tax_query() {
    2943                 register_taxonomy( 'foo', 'post' );
    2944                 $t = $this->factory->term->create( array(
    2945                         'taxonomy' => 'foo',
    2946                         'slug' => 'bar',
    2947                 ) );
    2948 
    2949                 $q = new WP_Query( array(
    2950                         'tax_query' => array(
    2951                                 array(
    2952                                         'taxonomy' => 'foo',
    2953                                         'terms' => array( $t ),
    2954                                         'field' => 'term_id',
    2955                                 ),
    2956                         ),
    2957                 ) );
    2958 
    2959                 $this->assertEquals( $t, $q->get( 'term_id' ) );
    2960 
    2961                 _unregister_taxonomy( 'foo' );
    2962         }
    2963 
    2964         /**
    2965          * @group taxonomy
    2966          * @ticket 29738
    2967          */
    2968         public function test_populate_cat_category_name_query_var_from_tax_query() {
    2969                 register_taxonomy( 'foo', 'post' );
    2970                 $t = $this->factory->term->create( array(
    2971                         'taxonomy' => 'foo',
    2972                 ) );
    2973                 $c = $this->factory->term->create( array(
    2974                         'taxonomy' => 'category',
    2975                         'slug' => 'bar',
    2976                 ) );
    2977 
    2978                 $q = new WP_Query( array(
    2979                         'tax_query' => array(
    2980                                 // Non-category should be skipped
    2981                                 array(
    2982                                         'taxonomy' => 'foo',
    2983                                         'terms' => array( $t ),
    2984                                 ),
    2985 
    2986                                 // Empty terms mean that this one should be skipped
    2987                                 array(
    2988                                         'taxonomy' => 'category',
    2989                                         'terms' => array(),
    2990                                 ),
    2991 
    2992                                 // Category and post tags should be skipped
    2993                                 array(
    2994                                         'taxonomy' => 'category',
    2995                                         'terms' => array( $c ),
    2996                                 ),
    2997                         ),
    2998                 ) );
    2999 
    3000                 $this->assertEquals( $c, $q->get( 'cat' ) );
    3001                 $this->assertEquals( 'bar', $q->get( 'category_name' ) );
    3002 
    3003                 _unregister_taxonomy( 'foo' );
    3004         }
    3005 
    3006         /**
    3007          * @group taxonomy
    3008          * @ticket 29738
    3009          */
    3010         public function test_populate_tag_id_query_var_from_tax_query() {
    3011                 register_taxonomy( 'foo', 'post' );
    3012                 $t = $this->factory->term->create( array(
    3013                         'taxonomy' => 'foo',
    3014                 ) );
    3015                 $tag = $this->factory->term->create( array(
    3016                         'taxonomy' => 'post_tag',
    3017                         'slug' => 'bar',
    3018                 ) );
    3019 
    3020                 $q = new WP_Query( array(
    3021                         'tax_query' => array(
    3022                                 // Non-tag should be skipped
    3023                                 array(
    3024                                         'taxonomy' => 'foo',
    3025                                         'terms' => array( $t ),
    3026                                 ),
    3027 
    3028                                 // Empty terms mean that this one should be skipped
    3029                                 array(
    3030                                         'taxonomy' => 'post_tag',
    3031                                         'terms' => array(),
    3032                                 ),
    3033 
    3034                                 // Category and post tags should be skipped
    3035                                 array(
    3036                                         'taxonomy' => 'post_tag',
    3037                                         'terms' => array( $tag ),
    3038                                 ),
    3039                         ),
    3040                 ) );
    3041 
    3042                 $this->assertEquals( $tag, $q->get( 'tag_id' ) );
    3043 
    3044                 _unregister_taxonomy( 'foo' );
    304567        }
    304668
  • trunk/tests/phpunit/tests/query/isTerm.php

    r31285 r31286  
    22
    33/**
    4  * Test the is_*() functions in query.php across the URL structure
     4 * Test the is_*() functions in query.php related to taxonomy terms across the URL structure.
    55 *
    66 * This exercises both query.php and rewrite.php: urls are fed through the rewrite code,
     
    99 * @group query
    1010 * @group rewrite
     11 * @group taxonomy
    1112 */
    12 class Tests_Query_TaxQuery extends WP_UnitTestCase {
     13class Tests_Query_IsTerm extends WP_UnitTestCase {
    1314        protected $tag_id;
    1415        protected $cat_id;
  • trunk/tests/phpunit/tests/query/taxQuery.php

    r30771 r31286  
    22
    33/**
    4  * Test the is_*() functions in query.php across the URL structure
    5  *
    6  * This exercises both query.php and rewrite.php: urls are fed through the rewrite code,
    7  * then we test the effects of each url on the wp_query object.
    8  *
    94 * @group query
    10  * @group rewrite
     5 * @group taxonomy
    116 */
    127class Tests_Query_TaxQuery extends WP_UnitTestCase {
    13         protected $tag_id;
    14         protected $cat_id;
    15         protected $tax_id;
    16         protected $tax_id2;
    17         protected $post_id;
    18 
    19         protected $cat;
    20         protected $uncat;
    21         protected $tag;
    22         protected $tax;
    23 
    24         function setUp() {
    25                 global $wp_rewrite;
    26                 parent::setUp();
    27 
    28                 set_current_screen( 'front' );
    29 
    30                 $GLOBALS['wp_the_query'] = new WP_Query();
    31                 $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
    32 
    33                 $wp_rewrite->init();
    34                 $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );
    35 
    36                 create_initial_taxonomies();
    37                 register_taxonomy( 'testtax', 'post', array( 'public' => true ) );
    38 
    39                 $wp_rewrite->flush_rules();
    40 
    41                 $this->tag_id = $this->factory->tag->create( array( 'slug' => 'tag-slug' ) );
    42                 $this->cat_id = $this->factory->category->create( array( 'slug' => 'cat-slug' ) );
    43                 $this->tax_id = $this->factory->term->create( array( 'taxonomy' => 'testtax', 'slug' => 'tax-slug' ) );
    44                 $this->tax_id2 = $this->factory->term->create( array( 'taxonomy' => 'testtax', 'slug' => 'tax-slug2' ) );
    45                 $this->post_id = $this->factory->post->create();
    46                 wp_set_object_terms( $this->post_id, $this->cat_id, 'category' );
    47                 wp_set_object_terms( $this->post_id, array( $this->tax_id, $this->tax_id2 ), 'testtax' );
    48 
    49                 $this->cat = get_term( $this->cat_id, 'category' );
    50                 _make_cat_compat( $this->cat );
    51                 $this->tag = get_term( $this->tag_id, 'post_tag' );
    52 
    53                 $this->uncat = get_term_by( 'slug', 'uncategorized', 'category' );
    54                 _make_cat_compat( $this->uncat );
    55 
    56                 add_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) );
    57         }
    58 
    59         function tearDown() {
    60                 global $wp_rewrite;
    61                 parent::tearDown();
    62 
    63                 _unregister_taxonomy( 'testtax' );
    64 
    65                 $wp_rewrite->init();
    66 
    67                 remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) );
    68         }
    69 
    70         function test_tag_action_tax() {
    71                 // tag with tax added
    72                 $this->go_to( home_url( "/tag/tag-slug/" ) );
    73                 $this->assertQueryTrue( 'is_tag', 'is_archive' );
    74                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    75                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    76                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    77                 $this->assertNotEmpty( get_query_var( 'tag_id' ) );
    78                 $this->assertEquals( get_queried_object(), $this->tag );
    79         }
    80 
    81         function test_tag_query_cat_action_tax() {
    82                 // tag + category with tax added
    83                 $this->go_to( home_url( "/tag/tag-slug/?cat=$this->cat_id" ) );
    84                 $this->assertQueryTrue( 'is_category', 'is_tag', 'is_archive' );
    85                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    86                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    87                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    88                 $this->assertNotEmpty( get_query_var( 'cat' ) );
    89                 $this->assertNotEmpty( get_query_var( 'tag_id' ) );
    90                 $this->assertEquals( get_queried_object(), $this->cat );
    91         }
    92 
    93         function test_tag_query_cat_query_tax_action_tax() {
    94                 // tag + category + tax with tax added
    95                 $this->go_to( home_url( "/tag/tag-slug/?cat=$this->cat_id&testtax=tax-slug2" ) );
    96                 $this->assertQueryTrue( 'is_category', 'is_tag', 'is_tax', 'is_archive' );
    97                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    98                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    99                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    100                 $this->assertNotEmpty( get_query_var( 'cat' ) );
    101                 $this->assertNotEmpty( get_query_var( 'tag_id' ) );
    102                 $this->assertNotEmpty( get_query_var( 'testtax' ) );
    103                 $this->assertEquals( get_queried_object(), $this->cat );
    104         }
    105 
    106         function test_cat_action_tax() {
    107                 // category with tax added
    108                 $this->go_to( home_url( "/category/cat-slug/" ) );
    109                 $this->assertQueryTrue( 'is_category', 'is_archive' );
    110                 $this->assertNotEmpty( get_query_var( 'cat' ) );
    111                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    112                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    113                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    114                 $this->assertEquals( get_queried_object(), $this->cat );
     8        public function test_tax_query_single_query_single_term_field_slug() {
     9                $t = $this->factory->term->create( array(
     10                        'taxonomy' => 'category',
     11                        'slug' => 'foo',
     12                        'name' => 'Foo',
     13                ) );
     14                $p1 = $this->factory->post->create();
     15                $p2 = $this->factory->post->create();
     16
     17                wp_set_post_terms( $p1, $t, 'category' );
     18
     19                $q = new WP_Query( array(
     20                        'fields' => 'ids',
     21                        'update_post_meta_cache' => false,
     22                        'update_post_term_cache' => false,
     23                        'tax_query' => array(
     24                                array(
     25                                        'taxonomy' => 'category',
     26                                        'terms' => array( 'foo' ),
     27                                        'field' => 'slug',
     28                                ),
     29                        ),
     30                ) );
     31
     32                $this->assertEquals( array( $p1 ), $q->posts );
     33        }
     34
     35        public function test_tax_query_single_query_single_term_field_name() {
     36                $t = $this->factory->term->create( array(
     37                        'taxonomy' => 'category',
     38                        'slug' => 'foo',
     39                        'name' => 'Foo',
     40                ) );
     41                $p1 = $this->factory->post->create();
     42                $p2 = $this->factory->post->create();
     43
     44                wp_set_post_terms( $p1, $t, 'category' );
     45
     46                $q = new WP_Query( array(
     47                        'fields' => 'ids',
     48                        'update_post_meta_cache' => false,
     49                        'update_post_term_cache' => false,
     50                        'tax_query' => array(
     51                                array(
     52                                        'taxonomy' => 'category',
     53                                        'terms' => array( 'Foo' ),
     54                                        'field' => 'name',
     55                                ),
     56                        ),
     57                ) );
     58
     59                $this->assertEquals( array( $p1 ), $q->posts );
     60        }
     61
     62        public function test_tax_query_single_query_single_term_field_term_taxonomy_id() {
     63                $t = $this->factory->term->create( array(
     64                        'taxonomy' => 'category',
     65                        'slug' => 'foo',
     66                        'name' => 'Foo',
     67                ) );
     68                $p1 = $this->factory->post->create();
     69                $p2 = $this->factory->post->create();
     70
     71                $tt_ids = wp_set_post_terms( $p1, $t, 'category' );
     72
     73                $q = new WP_Query( array(
     74                        'fields' => 'ids',
     75                        'update_post_meta_cache' => false,
     76                        'update_post_term_cache' => false,
     77                        'tax_query' => array(
     78                                array(
     79                                        'taxonomy' => 'category',
     80                                        'terms' => $tt_ids,
     81                                        'field' => 'term_taxonomy_id',
     82                                ),
     83                        ),
     84                ) );
     85
     86                $this->assertEquals( array( $p1 ), $q->posts );
     87        }
     88
     89        public function test_tax_query_single_query_single_term_field_term_id() {
     90                $t = $this->factory->term->create( array(
     91                        'taxonomy' => 'category',
     92                        'slug' => 'foo',
     93                        'name' => 'Foo',
     94                ) );
     95                $p1 = $this->factory->post->create();
     96                $p2 = $this->factory->post->create();
     97
     98                wp_set_post_terms( $p1, $t, 'category' );
     99
     100                $q = new WP_Query( array(
     101                        'fields' => 'ids',
     102                        'update_post_meta_cache' => false,
     103                        'update_post_term_cache' => false,
     104                        'tax_query' => array(
     105                                array(
     106                                        'taxonomy' => 'category',
     107                                        'terms' => array( $t ),
     108                                        'field' => 'term_id',
     109                                ),
     110                        ),
     111                ) );
     112
     113                $this->assertEquals( array( $p1 ), $q->posts );
     114        }
     115
     116        public function test_tax_query_single_query_single_term_operator_in() {
     117                $t = $this->factory->term->create( array(
     118                        'taxonomy' => 'category',
     119                        'slug' => 'foo',
     120                        'name' => 'Foo',
     121                ) );
     122                $p1 = $this->factory->post->create();
     123                $p2 = $this->factory->post->create();
     124
     125                wp_set_post_terms( $p1, $t, 'category' );
     126
     127                $q = new WP_Query( array(
     128                        'fields' => 'ids',
     129                        'update_post_meta_cache' => false,
     130                        'update_post_term_cache' => false,
     131                        'tax_query' => array(
     132                                array(
     133                                        'taxonomy' => 'category',
     134                                        'terms' => array( 'foo' ),
     135                                        'field' => 'slug',
     136                                        'operator' => 'IN',
     137                                ),
     138                        ),
     139                ) );
     140
     141                $this->assertEquals( array( $p1 ), $q->posts );
     142        }
     143
     144        public function test_tax_query_single_query_single_term_operator_not_in() {
     145                $t = $this->factory->term->create( array(
     146                        'taxonomy' => 'category',
     147                        'slug' => 'foo',
     148                        'name' => 'Foo',
     149                ) );
     150                $p1 = $this->factory->post->create();
     151                $p2 = $this->factory->post->create();
     152
     153                wp_set_post_terms( $p1, $t, 'category' );
     154
     155                $q = new WP_Query( array(
     156                        'fields' => 'ids',
     157                        'update_post_meta_cache' => false,
     158                        'update_post_term_cache' => false,
     159                        'tax_query' => array(
     160                                array(
     161                                        'taxonomy' => 'category',
     162                                        'terms' => array( 'foo' ),
     163                                        'field' => 'slug',
     164                                        'operator' => 'NOT IN',
     165                                ),
     166                        ),
     167                ) );
     168
     169                $this->assertEquals( array( $p2 ), $q->posts );
     170        }
     171
     172        public function test_tax_query_single_query_single_term_operator_and() {
     173                $t = $this->factory->term->create( array(
     174                        'taxonomy' => 'category',
     175                        'slug' => 'foo',
     176                        'name' => 'Foo',
     177                ) );
     178                $p1 = $this->factory->post->create();
     179                $p2 = $this->factory->post->create();
     180
     181                wp_set_post_terms( $p1, $t, 'category' );
     182
     183                $q = new WP_Query( array(
     184                        'fields' => 'ids',
     185                        'update_post_meta_cache' => false,
     186                        'update_post_term_cache' => false,
     187                        'tax_query' => array(
     188                                array(
     189                                        'taxonomy' => 'category',
     190                                        'terms' => array( 'foo' ),
     191                                        'field' => 'slug',
     192                                        'operator' => 'AND',
     193                                ),
     194                        ),
     195                ) );
     196
     197                $this->assertEquals( array( $p1 ), $q->posts );
     198        }
     199
     200        public function test_tax_query_single_query_multiple_terms_operator_in() {
     201                $t1 = $this->factory->term->create( array(
     202                        'taxonomy' => 'category',
     203                        'slug' => 'foo',
     204                        'name' => 'Foo',
     205                ) );
     206                $t2 = $this->factory->term->create( array(
     207                        'taxonomy' => 'category',
     208                        'slug' => 'bar',
     209                        'name' => 'Bar',
     210                ) );
     211                $p1 = $this->factory->post->create();
     212                $p2 = $this->factory->post->create();
     213                $p3 = $this->factory->post->create();
     214
     215                wp_set_post_terms( $p1, $t1, 'category' );
     216                wp_set_post_terms( $p2, $t2, 'category' );
     217
     218                $q = new WP_Query( array(
     219                        'fields' => 'ids',
     220                        'update_post_meta_cache' => false,
     221                        'update_post_term_cache' => false,
     222                        'tax_query' => array(
     223                                array(
     224                                        'taxonomy' => 'category',
     225                                        'terms' => array( 'foo', 'bar' ),
     226                                        'field' => 'slug',
     227                                        'operator' => 'IN',
     228                                ),
     229                        ),
     230                ) );
     231
     232                $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     233        }
     234
     235        public function test_tax_query_single_query_multiple_terms_operator_not_in() {
     236                $t1 = $this->factory->term->create( array(
     237                        'taxonomy' => 'category',
     238                        'slug' => 'foo',
     239                        'name' => 'Foo',
     240                ) );
     241                $t2 = $this->factory->term->create( array(
     242                        'taxonomy' => 'category',
     243                        'slug' => 'bar',
     244                        'name' => 'Bar',
     245                ) );
     246                $p1 = $this->factory->post->create();
     247                $p2 = $this->factory->post->create();
     248                $p3 = $this->factory->post->create();
     249
     250                wp_set_post_terms( $p1, $t1, 'category' );
     251                wp_set_post_terms( $p2, $t2, 'category' );
     252
     253                $q = new WP_Query( array(
     254                        'fields' => 'ids',
     255                        'update_post_meta_cache' => false,
     256                        'update_post_term_cache' => false,
     257                        'tax_query' => array(
     258                                array(
     259                                        'taxonomy' => 'category',
     260                                        'terms' => array( 'foo', 'bar' ),
     261                                        'field' => 'slug',
     262                                        'operator' => 'NOT IN',
     263                                ),
     264                        ),
     265                ) );
     266
     267                $this->assertEquals( array( $p3 ), $q->posts );
    115268        }
    116269
    117270        /**
    118          * @ticket 26627
     271         * @ticket 18105
    119272         */
    120         function test_cat_uncat_action_tax() {
    121                 // category with tax added
    122                 add_action( 'pre_get_posts', array( $this, '_cat_uncat_action_tax' ), 11 );
    123 
    124                 $this->go_to( home_url( "/category/uncategorized/" ) );
    125                 $this->assertQueryTrue( 'is_category', 'is_archive' );
    126                 $this->assertNotEmpty( get_query_var( 'cat' ) );
    127                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    128                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    129                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    130                 $this->assertEquals( get_queried_object(), $this->uncat );
    131 
    132                 remove_action( 'pre_get_posts', array( $this, '_cat_uncat_action_tax' ), 11 );
    133         }
    134 
    135         function _cat_uncat_action_tax( &$query ) {
    136                 $this->assertTrue( $query->is_category() );
    137                 $this->assertTrue( $query->is_archive() );
    138                 $this->assertNotEmpty( $query->get( 'category_name' ) );
    139                 $this->assertNotEmpty( $query->get( 'tax_query' ) );
    140                 $this->assertEquals( $query->get_queried_object(), $this->uncat );
     273        public function test_tax_query_single_query_multiple_queries_operator_not_in() {
     274                $t1 = $this->factory->term->create( array(
     275                        'taxonomy' => 'category',
     276                        'slug' => 'foo',
     277                        'name' => 'Foo',
     278                ) );
     279                $t2 = $this->factory->term->create( array(
     280                        'taxonomy' => 'category',
     281                        'slug' => 'bar',
     282                        'name' => 'Bar',
     283                ) );
     284                $p1 = $this->factory->post->create();
     285                $p2 = $this->factory->post->create();
     286                $p3 = $this->factory->post->create();
     287
     288                wp_set_post_terms( $p1, $t1, 'category' );
     289                wp_set_post_terms( $p2, $t2, 'category' );
     290
     291                $q = new WP_Query( array(
     292                        'fields' => 'ids',
     293                        'update_post_meta_cache' => false,
     294                        'update_post_term_cache' => false,
     295                        'tax_query' => array(
     296                                'relation' => 'AND',
     297                                array(
     298                                        'taxonomy' => 'category',
     299                                        'terms' => array( 'foo' ),
     300                                        'field' => 'slug',
     301                                        'operator' => 'NOT IN',
     302                                ),
     303                                array(
     304                                        'taxonomy' => 'category',
     305                                        'terms' => array( 'bar' ),
     306                                        'field' => 'slug',
     307                                        'operator' => 'NOT IN',
     308                                ),
     309                        ),
     310                ) );
     311
     312                $this->assertEquals( array( $p3 ), $q->posts );
     313        }
     314
     315        public function test_tax_query_single_query_multiple_terms_operator_and() {
     316                $t1 = $this->factory->term->create( array(
     317                        'taxonomy' => 'category',
     318                        'slug' => 'foo',
     319                        'name' => 'Foo',
     320                ) );
     321                $t2 = $this->factory->term->create( array(
     322                        'taxonomy' => 'category',
     323                        'slug' => 'bar',
     324                        'name' => 'Bar',
     325                ) );
     326                $p1 = $this->factory->post->create();
     327                $p2 = $this->factory->post->create();
     328                $p3 = $this->factory->post->create();
     329
     330                wp_set_object_terms( $p1, $t1, 'category' );
     331                wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' );
     332
     333                $q = new WP_Query( array(
     334                        'fields' => 'ids',
     335                        'update_post_meta_cache' => false,
     336                        'update_post_term_cache' => false,
     337                        'tax_query' => array(
     338                                array(
     339                                        'taxonomy' => 'category',
     340                                        'terms' => array( 'foo', 'bar' ),
     341                                        'field' => 'slug',
     342                                        'operator' => 'AND',
     343                                ),
     344                        ),
     345                ) );
     346
     347                $this->assertEquals( array( $p2 ), $q->posts );
    141348        }
    142349
    143350        /**
    144          * @ticket 26728
     351         * @ticket 29181
    145352         */
    146         function test_tax_action_tax() {
    147                 // tax with tax added
    148                 $this->go_to( home_url( '/testtax/tax-slug2/' ) );
    149                 $this->assertQueryTrue( 'is_tax', 'is_archive' );
    150                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    151                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    152                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    153                 $this->assertEquals( get_queried_object(), get_term( $this->tax_id, 'testtax' ) );
    154         }
    155 
    156         function test_tax_query_tag_action_tax() {
    157                 // tax + tag with tax added
    158                 $this->go_to( home_url( "/testtax/tax-slug2/?tag_id=$this->tag_id" ) );
    159                 $this->assertQueryTrue( 'is_tag', 'is_tax', 'is_archive' );
    160                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    161                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    162                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    163                 $this->assertNotEmpty( get_query_var( 'tag_id' ) );
    164                 $this->assertEquals( get_queried_object(), $this->tag );
    165         }
    166 
    167         function test_tax_query_cat_action_tax() {
    168                 // tax + cat with tax added
    169                 $this->go_to( home_url( "/testtax/tax-slug2/?cat=$this->cat_id" ) );
    170                 $this->assertQueryTrue( 'is_category', 'is_tax', 'is_archive' );
    171                 $this->assertNotEmpty( get_query_var( 'tax_query' ) );
    172                 $this->assertNotEmpty( get_query_var( 'taxonomy' ) );
    173                 $this->assertNotEmpty( get_query_var( 'term_id' ) );
    174                 $this->assertNotEmpty( get_query_var( 'cat' ) );
    175                 $this->assertEquals( get_queried_object(), $this->cat );
    176         }
    177 
    178         function pre_get_posts_tax_category_tax_query( &$query ) {
    179                 $query->set( 'tax_query', array(
    180                         array( 'taxonomy' => 'testtax', 'field' => 'term_id', 'terms' => $this->tax_id )
    181                 ) );
     353        public function test_tax_query_operator_not_exists() {
     354                register_taxonomy( 'wptests_tax1', 'post' );
     355                register_taxonomy( 'wptests_tax2', 'post' );
     356
     357                $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
     358                $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
     359
     360                $p1 = $this->factory->post->create();
     361                $p2 = $this->factory->post->create();
     362                $p3 = $this->factory->post->create();
     363
     364                wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
     365                wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
     366
     367                $q = new WP_Query( array(
     368                        'fields' => 'ids',
     369                        'orderby' => 'ID',
     370                        'order' => 'ASC',
     371                        'tax_query' => array(
     372                                array(
     373                                        'taxonomy' => 'wptests_tax2',
     374                                        'operator' => 'NOT EXISTS',
     375                                ),
     376                        ),
     377                ) );
     378
     379                $this->assertEqualSets( array( $p1, $p3 ), $q->posts );
    182380        }
    183381
    184382        /**
    185          * @group 30623
     383         * @ticket 29181
    186384         */
    187         public function test_get_queried_object_with_custom_taxonomy_tax_query_and_field_term_id_should_return_term_object() {
    188                 // Don't override the args provided below.
    189                 remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) );
    190 
    191                 $args = array(
     385        public function test_tax_query_operator_exists() {
     386                register_taxonomy( 'wptests_tax1', 'post' );
     387                register_taxonomy( 'wptests_tax2', 'post' );
     388
     389                $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
     390                $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
     391
     392                $p1 = $this->factory->post->create();
     393                $p2 = $this->factory->post->create();
     394                $p3 = $this->factory->post->create();
     395
     396                wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
     397                wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
     398
     399                $q = new WP_Query( array(
     400                        'fields' => 'ids',
     401                        'orderby' => 'ID',
     402                        'order' => 'ASC',
     403                        'tax_query' => array(
     404                                array(
     405                                        'taxonomy' => 'wptests_tax2',
     406                                        'operator' => 'EXISTS',
     407                                ),
     408                        ),
     409                ) );
     410
     411                $this->assertEqualSets( array( $p2 ), $q->posts );
     412        }
     413
     414        /**
     415         * @ticket 29181
     416         */
     417        public function test_tax_query_operator_exists_should_ignore_terms() {
     418                register_taxonomy( 'wptests_tax1', 'post' );
     419                register_taxonomy( 'wptests_tax2', 'post' );
     420
     421                $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
     422                $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
     423
     424                $p1 = $this->factory->post->create();
     425                $p2 = $this->factory->post->create();
     426                $p3 = $this->factory->post->create();
     427
     428                wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
     429                wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
     430
     431                $q = new WP_Query( array(
     432                        'fields' => 'ids',
     433                        'orderby' => 'ID',
     434                        'order' => 'ASC',
     435                        'tax_query' => array(
     436                                array(
     437                                        'taxonomy' => 'wptests_tax2',
     438                                        'operator' => 'EXISTS',
     439                                        'terms' => array( 'foo', 'bar' ),
     440                                ),
     441                        ),
     442                ) );
     443
     444                $this->assertEqualSets( array( $p2 ), $q->posts );
     445        }
     446
     447        /**
     448         * @ticket 29181
     449         */
     450        public function test_tax_query_operator_exists_with_no_taxonomy() {
     451                register_taxonomy( 'wptests_tax1', 'post' );
     452                register_taxonomy( 'wptests_tax2', 'post' );
     453
     454                $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
     455                $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
     456
     457                $p1 = $this->factory->post->create();
     458                $p2 = $this->factory->post->create();
     459                $p3 = $this->factory->post->create();
     460
     461                wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' );
     462                wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' );
     463
     464                $q = new WP_Query( array(
     465                        'fields' => 'ids',
     466                        'orderby' => 'ID',
     467                        'order' => 'ASC',
     468                        'tax_query' => array(
     469                                array(
     470                                        'operator' => 'EXISTS',
     471                                ),
     472                        ),
     473                ) );
     474
     475                $this->assertEmpty( $q->posts );
     476        }
     477
     478        public function test_tax_query_multiple_queries_relation_and() {
     479                $t1 = $this->factory->term->create( array(
     480                        'taxonomy' => 'category',
     481                        'slug' => 'foo',
     482                        'name' => 'Foo',
     483                ) );
     484                $t2 = $this->factory->term->create( array(
     485                        'taxonomy' => 'category',
     486                        'slug' => 'bar',
     487                        'name' => 'Bar',
     488                ) );
     489                $p1 = $this->factory->post->create();
     490                $p2 = $this->factory->post->create();
     491                $p3 = $this->factory->post->create();
     492
     493                wp_set_object_terms( $p1, $t1, 'category' );
     494                wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' );
     495
     496                $q = new WP_Query( array(
     497                        'fields' => 'ids',
     498                        'update_post_meta_cache' => false,
     499                        'update_post_term_cache' => false,
    192500                        'tax_query' => array(
    193501                                'relation' => 'AND',
    194502                                array(
    195                                         'taxonomy' => 'testtax',
     503                                        'taxonomy' => 'category',
     504                                        'terms' => array( 'foo' ),
     505                                        'field' => 'slug',
     506                                ),
     507                                array(
     508                                        'taxonomy' => 'category',
     509                                        'terms' => array( 'bar' ),
     510                                        'field' => 'slug',
     511                                ),
     512                        ),
     513                ) );
     514
     515                $this->assertEquals( array( $p2 ), $q->posts );
     516        }
     517
     518        public function test_tax_query_multiple_queries_relation_or() {
     519                $t1 = $this->factory->term->create( array(
     520                        'taxonomy' => 'category',
     521                        'slug' => 'foo',
     522                        'name' => 'Foo',
     523                ) );
     524                $t2 = $this->factory->term->create( array(
     525                        'taxonomy' => 'category',
     526                        'slug' => 'bar',
     527                        'name' => 'Bar',
     528                ) );
     529                $p1 = $this->factory->post->create();
     530                $p2 = $this->factory->post->create();
     531                $p3 = $this->factory->post->create();
     532
     533                wp_set_object_terms( $p1, $t1, 'category' );
     534                wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' );
     535
     536                $q = new WP_Query( array(
     537                        'fields' => 'ids',
     538                        'update_post_meta_cache' => false,
     539                        'update_post_term_cache' => false,
     540                        'tax_query' => array(
     541                                'relation' => 'OR',
     542                                array(
     543                                        'taxonomy' => 'category',
     544                                        'terms' => array( 'foo' ),
     545                                        'field' => 'slug',
     546                                ),
     547                                array(
     548                                        'taxonomy' => 'category',
     549                                        'terms' => array( 'bar' ),
     550                                        'field' => 'slug',
     551                                ),
     552                        ),
     553                ) );
     554
     555                $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     556        }
     557
     558        public function test_tax_query_multiple_queries_different_taxonomies() {
     559                $t1 = $this->factory->term->create( array(
     560                        'taxonomy' => 'post_tag',
     561                        'slug' => 'foo',
     562                        'name' => 'Foo',
     563                ) );
     564                $t2 = $this->factory->term->create( array(
     565                        'taxonomy' => 'category',
     566                        'slug' => 'bar',
     567                        'name' => 'Bar',
     568                ) );
     569                $p1 = $this->factory->post->create();
     570                $p2 = $this->factory->post->create();
     571                $p3 = $this->factory->post->create();
     572
     573                wp_set_object_terms( $p1, $t1, 'post_tag' );
     574                wp_set_object_terms( $p2, $t2, 'category' );
     575
     576                $q = new WP_Query( array(
     577                        'fields' => 'ids',
     578                        'update_post_meta_cache' => false,
     579                        'update_post_term_cache' => false,
     580                        'tax_query' => array(
     581                                'relation' => 'OR',
     582                                array(
     583                                        'taxonomy' => 'post_tag',
     584                                        'terms' => array( 'foo' ),
     585                                        'field' => 'slug',
     586                                ),
     587                                array(
     588                                        'taxonomy' => 'category',
     589                                        'terms' => array( 'bar' ),
     590                                        'field' => 'slug',
     591                                ),
     592                        ),
     593                ) );
     594
     595                $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     596        }
     597
     598        /**
     599         * @ticket 29738
     600         */
     601        public function test_tax_query_two_nested_queries() {
     602                register_taxonomy( 'foo', 'post' );
     603                register_taxonomy( 'bar', 'post' );
     604
     605                $foo_term_1 = $this->factory->term->create( array(
     606                        'taxonomy' => 'foo',
     607                ) );
     608                $foo_term_2 = $this->factory->term->create( array(
     609                        'taxonomy' => 'foo',
     610                ) );
     611                $bar_term_1 = $this->factory->term->create( array(
     612                        'taxonomy' => 'bar',
     613                ) );
     614                $bar_term_2 = $this->factory->term->create( array(
     615                        'taxonomy' => 'bar',
     616                ) );
     617
     618                $p1 = $this->factory->post->create();
     619                $p2 = $this->factory->post->create();
     620                $p3 = $this->factory->post->create();
     621
     622                wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
     623                wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
     624                wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
     625                wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
     626                wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
     627                wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
     628
     629                $q = new WP_Query( array(
     630                        'fields' => 'ids',
     631                        'update_post_meta_cache' => false,
     632                        'update_post_term_cache' => false,
     633                        'tax_query' => array(
     634                                'relation' => 'OR',
     635                                array(
     636                                        'relation' => 'AND',
     637                                        array(
     638                                                'taxonomy' => 'foo',
     639                                                'terms' => array( $foo_term_1 ),
     640                                                'field' => 'term_id',
     641                                        ),
     642                                        array(
     643                                                'taxonomy' => 'bar',
     644                                                'terms' => array( $bar_term_1 ),
     645                                                'field' => 'term_id',
     646                                        ),
     647                                ),
     648                                array(
     649                                        'relation' => 'AND',
     650                                        array(
     651                                                'taxonomy' => 'foo',
     652                                                'terms' => array( $foo_term_2 ),
     653                                                'field' => 'term_id',
     654                                        ),
     655                                        array(
     656                                                'taxonomy' => 'bar',
     657                                                'terms' => array( $bar_term_2 ),
     658                                                'field' => 'term_id',
     659                                        ),
     660                                ),
     661                        ),
     662                ) );
     663
     664                _unregister_taxonomy( 'foo' );
     665                _unregister_taxonomy( 'bar' );
     666
     667                $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     668        }
     669
     670        /**
     671         * @ticket 29738
     672         */
     673        public function test_tax_query_one_nested_query_one_first_order_query() {
     674                register_taxonomy( 'foo', 'post' );
     675                register_taxonomy( 'bar', 'post' );
     676
     677                $foo_term_1 = $this->factory->term->create( array(
     678                        'taxonomy' => 'foo',
     679                ) );
     680                $foo_term_2 = $this->factory->term->create( array(
     681                        'taxonomy' => 'foo',
     682                ) );
     683                $bar_term_1 = $this->factory->term->create( array(
     684                        'taxonomy' => 'bar',
     685                ) );
     686                $bar_term_2 = $this->factory->term->create( array(
     687                        'taxonomy' => 'bar',
     688                ) );
     689
     690                $p1 = $this->factory->post->create();
     691                $p2 = $this->factory->post->create();
     692                $p3 = $this->factory->post->create();
     693
     694                wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
     695                wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
     696                wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
     697                wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
     698                wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
     699                wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
     700
     701                $q = new WP_Query( array(
     702                        'fields' => 'ids',
     703                        'update_post_meta_cache' => false,
     704                        'update_post_term_cache' => false,
     705                        'tax_query' => array(
     706                                'relation' => 'OR',
     707                                array(
     708                                        'taxonomy' => 'foo',
     709                                        'terms' => array( $foo_term_2 ),
    196710                                        'field' => 'term_id',
    197                                         'terms' => array(
    198                                                 $this->tax_id,
     711                                ),
     712                                array(
     713                                        'relation' => 'AND',
     714                                        array(
     715                                                'taxonomy' => 'foo',
     716                                                'terms' => array( $foo_term_1 ),
     717                                                'field' => 'term_id',
    199718                                        ),
     719                                        array(
     720                                                'taxonomy' => 'bar',
     721                                                'terms' => array( $bar_term_1 ),
     722                                                'field' => 'term_id',
     723                                        ),
     724                                ),
     725                        ),
     726                ) );
     727
     728                _unregister_taxonomy( 'foo' );
     729                _unregister_taxonomy( 'bar' );
     730
     731                $this->assertEqualSets( array( $p1, $p2 ), $q->posts );
     732        }
     733
     734        /**
     735         * @ticket 29738
     736         */
     737        public function test_tax_query_one_double_nested_query_one_first_order_query() {
     738                register_taxonomy( 'foo', 'post' );
     739                register_taxonomy( 'bar', 'post' );
     740
     741                $foo_term_1 = $this->factory->term->create( array(
     742                        'taxonomy' => 'foo',
     743                ) );
     744                $foo_term_2 = $this->factory->term->create( array(
     745                        'taxonomy' => 'foo',
     746                ) );
     747                $bar_term_1 = $this->factory->term->create( array(
     748                        'taxonomy' => 'bar',
     749                ) );
     750                $bar_term_2 = $this->factory->term->create( array(
     751                        'taxonomy' => 'bar',
     752                ) );
     753
     754                $p1 = $this->factory->post->create();
     755                $p2 = $this->factory->post->create();
     756                $p3 = $this->factory->post->create();
     757                $p4 = $this->factory->post->create();
     758
     759                wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' );
     760                wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' );
     761                wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' );
     762                wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' );
     763                wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' );
     764                wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' );
     765
     766                $q = new WP_Query( array(
     767                        'fields' => 'ids',
     768                        'update_post_meta_cache' => false,
     769                        'update_post_term_cache' => false,
     770                        'tax_query' => array(
     771                                'relation' => 'OR',
     772                                array(
     773                                        'taxonomy' => 'foo',
     774                                        'terms' => array( $foo_term_2 ),
     775                                        'field' => 'term_id',
     776                                ),
     777                                array(
     778                                        'relation' => 'AND',
     779                                        array(
     780                                                'taxonomy' => 'foo',
     781                                                'terms' => array( $foo_term_1 ),
     782                                                'field' => 'term_id',
     783                                        ),
     784                                        array(
     785                                                'relation' => 'OR',
     786                                                array(
     787                                                        'taxonomy' => 'bar',
     788                                                        'terms' => array( $bar_term_1 ),
     789                                                        'field' => 'term_id',
     790                                                ),
     791                                                array(
     792                                                        'taxonomy' => 'bar',
     793                                                        'terms' => array( $bar_term_2 ),
     794                                                        'field' => 'term_id',
     795                                                ),
     796                                        ),
     797                                ),
     798                        ),
     799                ) );
     800
     801                _unregister_taxonomy( 'foo' );
     802                _unregister_taxonomy( 'bar' );
     803
     804                $this->assertEqualSets( array( $p1, $p2, $p3 ), $q->posts );
     805        }
     806
     807        /**
     808         * @ticket 20604
     809         */
     810        public function test_tax_query_relation_or_both_clauses_empty_terms() {
     811                // An empty tax query should return an empty array, not all posts.
     812
     813                $this->factory->post->create_many( 10 );
     814
     815                $query = new WP_Query( array(
     816                        'fields' => 'ids',
     817                        'update_post_term_cache' => false,
     818                        'update_post_meta_cache' => false,
     819                        'tax_query' => array(
     820                                'relation' => 'OR',
     821                                array(
     822                                        'taxonomy' => 'post_tag',
     823                                        'field' => 'id',
     824                                        'terms' => false,
     825                                        'operator' => 'IN'
     826                                ),
     827                                array(
     828                                        'taxonomy' => 'category',
     829                                        'field' => 'id',
     830                                        'terms' => false,
     831                                        'operator' => 'IN'
    200832                                ),
    201833                        )
    202                 );
    203 
    204                 $q = new WP_Query( $args );
    205                 $object = $q->get_queried_object();
    206 
    207                 $expected = get_term( $this->tax_id, 'testtax' );
    208 
    209                 $this->assertEquals( $expected, $object );
     834                ) );
     835
     836                $posts = $query->get_posts();
     837                $this->assertEquals( 0 , count( $posts ) );
    210838        }
    211839
    212840        /**
    213          * @group 30623
     841         * @ticket 20604
    214842         */
    215         public function test_get_queried_object_with_custom_taxonomy_tax_query_and_field_slug_should_return_term_object() {
    216                 // Don't override the args provided below.
    217                 remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) );
    218 
    219                 $args = array(
     843        public function test_tax_query_relation_or_one_clause_empty_terms() {
     844                // An empty tax query should return an empty array, not all posts.
     845
     846                $this->factory->post->create_many( 10 );
     847
     848                $query = new WP_Query( array(
     849                        'fields' => 'ids',
     850                        'update_post_term_cache' => false,
     851                        'update_post_meta_cache' => false,
     852                        'tax_query' => array(
     853                                'relation' => 'OR',
     854                                array(
     855                                        'taxonomy' => 'post_tag',
     856                                        'field' => 'id',
     857                                        'terms' => array( 'foo' ),
     858                                        'operator' => 'IN'
     859                                ),
     860                                array(
     861                                        'taxonomy' => 'category',
     862                                        'field' => 'id',
     863                                        'terms' => false,
     864                                        'operator' => 'IN'
     865                                ),
     866                        )
     867                ) );
     868
     869                $posts = $query->get_posts();
     870                $this->assertEquals( 0 , count( $posts ) );
     871        }
     872
     873        public function test_tax_query_include_children() {
     874                $cat_a = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'Australia' ) );
     875                $cat_b = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'Sydney', 'parent' => $cat_a ) );
     876                $cat_c = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'East Syndney', 'parent' => $cat_b ) );
     877                $cat_d = $this->factory->term->create( array( 'taxonomy' => 'category', 'name' => 'West Syndney', 'parent' => $cat_b ) );
     878
     879                $post_a = $this->factory->post->create( array( 'post_category' => array( $cat_a ) ) );
     880                $post_b = $this->factory->post->create( array( 'post_category' => array( $cat_b ) ) );
     881                $post_c = $this->factory->post->create( array( 'post_category' => array( $cat_c ) ) );
     882                $post_d = $this->factory->post->create( array( 'post_category' => array( $cat_d ) ) );
     883
     884                $posts = get_posts( array(
     885                        'fields' => 'ids',
     886                        'update_post_meta_cache' => false,
     887                        'update_post_term_cache' => false,
     888                        'tax_query' => array(
     889                                array(
     890                                        'taxonomy' => 'category',
     891                                        'field' => 'id',
     892                                        'terms' => array( $cat_a ),
     893                                )
     894                        )
     895                ) );
     896
     897                $this->assertEquals( 4 , count( $posts ) );
     898
     899                $posts = get_posts( array(
     900                        'fields' => 'ids',
     901                        'update_post_meta_cache' => false,
     902                        'update_post_term_cache' => false,
     903                        'tax_query' => array(
     904                                array(
     905                                        'taxonomy' => 'category',
     906                                        'field' => 'id',
     907                                        'terms' => array( $cat_a ),
     908                                        'include_children' => false
     909                                )
     910                        )
     911                ) );
     912
     913                $this->assertEquals( 1 , count( $posts ) );
     914
     915                $posts = get_posts( array(
     916                        'fields' => 'ids',
     917                        'update_post_meta_cache' => false,
     918                        'update_post_term_cache' => false,
     919                        'tax_query' => array(
     920                                array(
     921                                        'taxonomy' => 'category',
     922                                        'field' => 'id',
     923                                        'terms' => array( $cat_b ),
     924                                )
     925                        )
     926                ) );
     927
     928                $this->assertEquals( 3 , count( $posts ) );
     929
     930                $posts = get_posts( array(
     931                        'fields' => 'ids',
     932                        'update_post_meta_cache' => false,
     933                        'update_post_term_cache' => false,
     934                        'tax_query' => array(
     935                                array(
     936                                        'taxonomy' => 'category',
     937                                        'field' => 'id',
     938                                        'terms' => array( $cat_b ),
     939                                        'include_children' => false
     940                                )
     941                        )
     942                ) );
     943
     944                $this->assertEquals( 1 , count( $posts ) );
     945
     946                $posts = get_posts( array(
     947                        'fields' => 'ids',
     948                        'update_post_meta_cache' => false,
     949                        'update_post_term_cache' => false,
     950                        'tax_query' => array(
     951                                array(
     952                                        'taxonomy' => 'category',
     953                                        'field' => 'id',
     954                                        'terms' => array( $cat_c ),
     955                                )
     956                        )
     957                ) );
     958
     959                $this->assertEquals( 1 , count( $posts ) );
     960
     961                $posts = get_posts( array(
     962                        'fields' => 'ids',
     963                        'update_post_meta_cache' => false,
     964                        'update_post_term_cache' => false,
     965                        'tax_query' => array(
     966                                array(
     967                                        'taxonomy' => 'category',
     968                                        'field' => 'id',
     969                                        'terms' => array( $cat_c ),
     970                                        'include_children' => false
     971                                )
     972                        )
     973                ) );
     974
     975                $this->assertEquals( 1 , count( $posts ) );
     976        }
     977
     978        public function test_tax_query_taxonomy_with_attachments() {
     979                $q = new WP_Query();
     980
     981                register_taxonomy_for_object_type( 'post_tag', 'attachment:image' );
     982                $tag_id = $this->factory->term->create( array( 'slug' => rand_str(), 'name' => rand_str() ) );
     983                $image_id = $this->factory->attachment->create_object( 'image.jpg', 0, array(
     984                        'post_mime_type' => 'image/jpeg',
     985                        'post_type' => 'attachment'
     986                ) );
     987                wp_set_object_terms( $image_id, $tag_id, 'post_tag' );
     988
     989                $posts = $q->query( array(
     990                        'fields' => 'ids',
     991                        'update_post_meta_cache' => false,
     992                        'update_post_term_cache' => false,
     993                        'post_type' => 'attachment',
     994                        'post_status' => 'inherit',
     995                        'tax_query' => array(
     996                                array(
     997                                        'taxonomy' => 'post_tag',
     998                                        'field' => 'term_id',
     999                                        'terms' => array( $tag_id )
     1000                                )
     1001                        )
     1002                ) );
     1003
     1004                $this->assertEquals( array( $image_id ), $posts );
     1005        }
     1006
     1007        public function test_tax_query_no_taxonomy() {
     1008                $cat_id = $this->factory->category->create( array( 'name' => 'alpha' ) );
     1009                $this->factory->post->create( array( 'post_title' => 'alpha', 'post_category' => array( $cat_id ) ) );
     1010
     1011                $response1 = new WP_Query( array(
     1012                        'tax_query' => array(
     1013                                array( 'terms' => array( $cat_id ) )
     1014                        )
     1015                ) );
     1016                $this->assertEmpty( $response1->posts );
     1017
     1018                $response2 = new WP_Query( array(
     1019                        'fields' => 'ids',
     1020                        'update_post_meta_cache' => false,
     1021                        'update_post_term_cache' => false,
     1022                        'tax_query' => array(
     1023                                array(
     1024                                        'taxonomy' => 'category',
     1025                                        'terms' => array( $cat_id )
     1026                                )
     1027                        )
     1028                ) );
     1029                $this->assertNotEmpty( $response2->posts );
     1030
     1031                $term = get_category( $cat_id );
     1032                $response3 = new WP_Query( array(
     1033                        'fields' => 'ids',
     1034                        'update_post_meta_cache' => false,
     1035                        'update_post_term_cache' => false,
     1036                        'tax_query' => array(
     1037                                array(
     1038                                        'field' => 'term_taxonomy_id',
     1039                                        'terms' => array( $term->term_taxonomy_id )
     1040                                )
     1041                        )
     1042                ) );
     1043                $this->assertNotEmpty( $response3->posts );
     1044        }
     1045
     1046        public function test_term_taxonomy_id_field_no_taxonomy() {
     1047                $q = new WP_Query();
     1048
     1049                $posts = $this->factory->post->create_many( 5 );
     1050
     1051                $cats = $tags = array();
     1052
     1053                // need term_taxonomy_ids in addition to term_ids, so no factory
     1054                for ( $i = 0; $i < 5; $i++ ) {
     1055                        $cats[$i] = wp_insert_term( 'category-' . $i , 'category' );
     1056                        $tags[$i] = wp_insert_term( 'tag-' . $i, 'post_tag' );
     1057
     1058                        // post 0 gets all terms
     1059                        wp_set_object_terms( $posts[0], array( $cats[$i]['term_id'] ), 'category', true );
     1060                        wp_set_object_terms( $posts[0], array( $tags[$i]['term_id'] ), 'post_tag', true );
     1061                }
     1062
     1063                wp_set_object_terms( $posts[1], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' );
     1064                wp_set_object_terms( $posts[1], array( $tags[0]['term_id'], $tags[2]['term_id'], $cats[4]['term_id'] ), 'post_tag' );
     1065
     1066                wp_set_object_terms( $posts[2], array( $cats[1]['term_id'], $cats[3]['term_id'] ), 'category' );
     1067                wp_set_object_terms( $posts[2], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' );
     1068
     1069                wp_set_object_terms( $posts[3], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' );
     1070                wp_set_object_terms( $posts[3], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' );
     1071
     1072                $results1 = $q->query( array(
     1073                        'fields' => 'ids',
     1074                        'update_post_meta_cache' => false,
     1075                        'update_post_term_cache' => false,
     1076                        'orderby' => 'ID',
     1077                        'order' => 'ASC',
     1078                        'tax_query' => array(
     1079                                'relation' => 'OR',
     1080                                array(
     1081                                        'field' => 'term_taxonomy_id',
     1082                                        'terms' => array( $cats[0]['term_taxonomy_id'], $cats[2]['term_taxonomy_id'], $cats[4]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'], $tags[2]['term_taxonomy_id'], $cats[4]['term_taxonomy_id'] ),
     1083                                        'operator' => 'AND',
     1084                                        'include_children' => false,
     1085                                ),
     1086                                array(
     1087                                        'field' => 'term_taxonomy_id',
     1088                                        'terms' => array( $cats[1]['term_taxonomy_id'], $cats[3]['term_taxonomy_id'], $tags[1]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ),
     1089                                        'operator' => 'AND',
     1090                                        'include_children' => false,
     1091                                )
     1092                        )
     1093                ) );
     1094
     1095                $this->assertEquals( array( $posts[0], $posts[1], $posts[2] ), $results1, 'Relation: OR; Operator: AND' );
     1096
     1097                $results2 = $q->query( array(
     1098                        'fields' => 'ids',
     1099                        'update_post_meta_cache' => false,
     1100                        'update_post_term_cache' => false,
     1101                        'orderby' => 'ID',
     1102                        'order' => 'ASC',
    2201103                        'tax_query' => array(
    2211104                                'relation' => 'AND',
    2221105                                array(
    223                                         'taxonomy' => 'testtax',
    224                                         'field' => 'slug',
    225                                         'terms' => array(
    226                                                 'tax-slug',
    227                                         ),
    228                                 ),
     1106                                        'field' => 'term_taxonomy_id',
     1107                                        'terms' => array( $cats[0]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'] ),
     1108                                        'operator' => 'IN',
     1109                                        'include_children' => false,
     1110                                ),
     1111                                array(
     1112                                        'field' => 'term_taxonomy_id',
     1113                                        'terms' => array( $cats[3]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ),
     1114                                        'operator' => 'IN',
     1115                                        'include_children' => false,
     1116                                )
    2291117                        )
    230                 );
    231 
    232                 $q = new WP_Query( $args );
    233                 $object = $q->get_queried_object();
    234 
    235                 $expected = get_term( $this->tax_id, 'testtax' );
    236 
    237                 // Only compare term_id because object_id may or may not be part of either value.
    238                 $this->assertEquals( $expected->term_id, $object->term_id );
     1118                ) );
     1119
     1120                $this->assertEquals( array( $posts[0], $posts[3] ), $results2, 'Relation: AND; Operator: IN' );
    2391121        }
    2401122
    2411123        /**
    242          * @group 30623
     1124         * @ticket 29738
    2431125         */
    244         public function test_get_queried_object_with_custom_taxonomy_tax_query_with_multiple_clauses_should_return_term_object_corresponding_to_the_first_queried_tax() {
    245                 // Don't override the args provided below.
    246                 remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) );
    247 
    248                 register_taxonomy( 'testtax2', 'post' );
    249                 $testtax2_term_id = $this->factory->term->create( array(
    250                         'taxonomy' => 'testtax2',
    251                         'slug' => 'testtax2-slug',
    252                 ) );
    253 
    254                 $args = array(
    255                         'tax_query' => array(
    256                                 'relation' => 'AND',
    257                                 array(
    258                                         'taxonomy' => 'testtax',
    259                                         'field' => 'slug',
    260                                         'terms' => array(
    261                                                 'tax-slug',
    262                                         ),
    263                                 ),
    264                                 array(
    265                                         'taxonomy' => 'testtax2',
    266                                         'field' => 'slug',
    267                                         'terms' => array(
    268                                                 'testtax2-slug',
    269                                         ),
    270                                 ),
    271                         )
    272                 );
    273 
    274                 $q = new WP_Query( $args );
    275                 $object = $q->get_queried_object();
    276 
    277                 $expected = get_term( $this->tax_id, 'testtax' );
    278 
    279                 // Only compare term_id because object_id may or may not be part of either value.
    280                 $this->assertEquals( $expected->term_id, $object->term_id );
     1126        public function test_populate_taxonomy_query_var_from_tax_query() {
     1127                register_taxonomy( 'foo', 'post' );
     1128                $t = $this->factory->term->create( array(
     1129                        'taxonomy' => 'foo',
     1130                ) );
     1131                $c = $this->factory->term->create( array(
     1132                        'taxonomy' => 'category',
     1133                ) );
     1134
     1135                $q = new WP_Query( array(
     1136                        'tax_query' => array(
     1137                                // Empty terms mean that this one should be skipped
     1138                                array(
     1139                                        'taxonomy' => 'bar',
     1140                                        'terms' => array(),
     1141                                ),
     1142
     1143                                // Category and post tags should be skipped
     1144                                array(
     1145                                        'taxonomy' => 'category',
     1146                                        'terms' => array( $c ),
     1147                                ),
     1148
     1149                                array(
     1150                                        'taxonomy' => 'foo',
     1151                                        'terms' => array( $t ),
     1152                                ),
     1153                        ),
     1154                ) );
     1155
     1156                $this->assertSame( 'foo', $q->get( 'taxonomy' ) );
     1157
     1158                _unregister_taxonomy( 'foo' );
     1159        }
     1160
     1161        public function test_populate_taxonomy_query_var_from_tax_query_taxonomy_already_set() {
     1162                register_taxonomy( 'foo', 'post' );
     1163                register_taxonomy( 'foo1', 'post' );
     1164                $t = $this->factory->term->create( array(
     1165                        'taxonomy' => 'foo',
     1166                ) );
     1167
     1168                $q = new WP_Query( array(
     1169                        'taxonomy' => 'bar',
     1170                        'tax_query' => array(
     1171                                array(
     1172                                        'taxonomy' => 'foo',
     1173                                        'terms' => array( $t ),
     1174                                ),
     1175                        ),
     1176                ) );
     1177
     1178                $this->assertSame( 'bar', $q->get( 'taxonomy' ) );
     1179
     1180                _unregister_taxonomy( 'foo' );
     1181                _unregister_taxonomy( 'foo1' );
     1182        }
     1183
     1184        public function test_populate_term_query_var_from_tax_query() {
     1185                register_taxonomy( 'foo', 'post' );
     1186                $t = $this->factory->term->create( array(
     1187                        'taxonomy' => 'foo',
     1188                        'slug' => 'bar',
     1189                ) );
     1190
     1191                $q = new WP_Query( array(
     1192                        'tax_query' => array(
     1193                                array(
     1194                                        'taxonomy' => 'foo',
     1195                                        'terms' => array( 'bar' ),
     1196                                        'field' => 'slug',
     1197                                ),
     1198                        ),
     1199                ) );
     1200
     1201                $this->assertSame( 'bar', $q->get( 'term' ) );
     1202
     1203                _unregister_taxonomy( 'foo' );
     1204        }
     1205
     1206        public function test_populate_term_id_query_var_from_tax_query() {
     1207                register_taxonomy( 'foo', 'post' );
     1208                $t = $this->factory->term->create( array(
     1209                        'taxonomy' => 'foo',
     1210                        'slug' => 'bar',
     1211                ) );
     1212
     1213                $q = new WP_Query( array(
     1214                        'tax_query' => array(
     1215                                array(
     1216                                        'taxonomy' => 'foo',
     1217                                        'terms' => array( $t ),
     1218                                        'field' => 'term_id',
     1219                                ),
     1220                        ),
     1221                ) );
     1222
     1223                $this->assertEquals( $t, $q->get( 'term_id' ) );
     1224
     1225                _unregister_taxonomy( 'foo' );
     1226        }
     1227
     1228        /**
     1229         * @ticket 29738
     1230         */
     1231        public function test_populate_cat_category_name_query_var_from_tax_query() {
     1232                register_taxonomy( 'foo', 'post' );
     1233                $t = $this->factory->term->create( array(
     1234                        'taxonomy' => 'foo',
     1235                ) );
     1236                $c = $this->factory->term->create( array(
     1237                        'taxonomy' => 'category',
     1238                        'slug' => 'bar',
     1239                ) );
     1240
     1241                $q = new WP_Query( array(
     1242                        'tax_query' => array(
     1243                                // Non-category should be skipped
     1244                                array(
     1245                                        'taxonomy' => 'foo',
     1246                                        'terms' => array( $t ),
     1247                                ),
     1248
     1249                                // Empty terms mean that this one should be skipped
     1250                                array(
     1251                                        'taxonomy' => 'category',
     1252                                        'terms' => array(),
     1253                                ),
     1254
     1255                                // Category and post tags should be skipped
     1256                                array(
     1257                                        'taxonomy' => 'category',
     1258                                        'terms' => array( $c ),
     1259                                ),
     1260                        ),
     1261                ) );
     1262
     1263                $this->assertEquals( $c, $q->get( 'cat' ) );
     1264                $this->assertEquals( 'bar', $q->get( 'category_name' ) );
     1265
     1266                _unregister_taxonomy( 'foo' );
     1267        }
     1268
     1269        /**
     1270         * @ticket 29738
     1271         */
     1272        public function test_populate_tag_id_query_var_from_tax_query() {
     1273                register_taxonomy( 'foo', 'post' );
     1274                $t = $this->factory->term->create( array(
     1275                        'taxonomy' => 'foo',
     1276                ) );
     1277                $tag = $this->factory->term->create( array(
     1278                        'taxonomy' => 'post_tag',
     1279                        'slug' => 'bar',
     1280                ) );
     1281
     1282                $q = new WP_Query( array(
     1283                        'tax_query' => array(
     1284                                // Non-tag should be skipped
     1285                                array(
     1286                                        'taxonomy' => 'foo',
     1287                                        'terms' => array( $t ),
     1288                                ),
     1289
     1290                                // Empty terms mean that this one should be skipped
     1291                                array(
     1292                                        'taxonomy' => 'post_tag',
     1293                                        'terms' => array(),
     1294                                ),
     1295
     1296                                // Category and post tags should be skipped
     1297                                array(
     1298                                        'taxonomy' => 'post_tag',
     1299                                        'terms' => array( $tag ),
     1300                                ),
     1301                        ),
     1302                ) );
     1303
     1304                $this->assertEquals( $tag, $q->get( 'tag_id' ) );
     1305
     1306                _unregister_taxonomy( 'foo' );
    2811307        }
    2821308}
Note: See TracChangeset for help on using the changeset viewer.