Ticket #42907: 42907.diff
File 42907.diff, 3.7 KB (added by , 8 years ago) |
---|
-
src/wp-includes/class-wp-meta-query.php
236 236 * the rest of the meta_query). 237 237 */ 238 238 $primary_meta_query = array(); 239 foreach ( array( 'key', 'compare', 'type' ) as $key ) {239 foreach ( array( 'key', 'compare', 'type', 'default' ) as $key ) { 240 240 if ( ! empty( $qv[ "meta_$key" ] ) ) { 241 241 $primary_meta_query[ $key ] = $qv[ "meta_$key" ]; 242 242 } … … 513 513 'REGEXP', 514 514 'NOT REGEXP', 515 515 'RLIKE', 516 'NONE', 516 517 ) 517 518 ) ) { 518 519 $clause['compare'] = '='; … … 530 531 $alias = $i ? 'mt' . $i : $this->meta_table; 531 532 532 533 // JOIN clauses for NOT EXISTS have their own syntax. 533 if ( 'NO T EXISTS' === $meta_compare ) {534 if ( 'NONE' === $meta_compare ) { 534 535 $join .= " LEFT JOIN $this->meta_table"; 535 536 $join .= $i ? " AS $alias" : ''; 536 537 $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] ); 537 538 538 539 // All other JOIN clauses. 540 } elseif ( 'NOT EXISTS' === $meta_compare ) { 541 $join .= " LEFT JOIN $this->meta_table"; 542 $join .= $i ? " AS $alias" : ''; 543 $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] ); 544 545 // All other JOIN clauses. 539 546 } else { 540 547 $join .= " INNER JOIN $this->meta_table"; 541 548 $join .= $i ? " AS $alias" : ''; … … 576 583 if ( array_key_exists( 'key', $clause ) ) { 577 584 if ( 'NOT EXISTS' === $meta_compare ) { 578 585 $sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL'; 579 } else {586 } elseif ( 'NONE' !== $meta_compare ) { 580 587 $sql_chunks['where'][] = $wpdb->prepare( "$alias.meta_key = %s", trim( $clause['key'] ) ); 581 588 } 582 589 } … … 620 627 621 628 // 'value' is ignored for NOT EXISTS. 622 629 case 'NOT EXISTS': 630 case 'NONE': 623 631 $where = ''; 624 632 break; 625 633 -
src/wp-includes/class-wp-query.php
1594 1594 } else { 1595 1595 $orderby_clause = "{$primary_meta_query['alias']}.meta_value"; 1596 1596 } 1597 if ( isset( $primary_meta_query['default'] ) ) { 1598 $orderby_clause = $wpdb->prepare( "COALESCE({$orderby_clause},%s)", $primary_meta_query['default'] ); 1599 } 1597 1600 break; 1598 1601 case 'meta_value_num': 1599 1602 $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0"; 1603 if ( isset( $primary_meta_query['default'] ) ) { 1604 $orderby_clause = $wpdb->prepare( "COALESCE({$orderby_clause},%d)", $primary_meta_query['default'] ); 1605 } 1600 1606 break; 1601 1607 default: 1602 1608 if ( array_key_exists( $orderby, $meta_clauses ) ) { -
tests/phpunit/tests/meta/query.php
894 894 $this->assertNotContains( "{$wpdb->postmeta}.post_id IS NULL", $sql['where'] ); 895 895 } 896 896 897 public function test_compare_none() { 898 global $wpdb; 899 900 $query = new WP_Meta_Query( 901 array( 902 array( 903 'key' => 'test', 904 'compare' => 'NONE', 905 ), 906 ) 907 ); 908 909 $sql = $query->get_sql( 'post', $wpdb->posts, 'ID', $this ); 910 911 $this->assertSame( " LEFT JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = 'test' )", $sql['join'] ); 912 $this->assertEmpty( $sql['where'] ); 913 } 914 897 915 /** 898 916 * @ticket 32592 899 917 */