WordPress.org

Make WordPress Core

Ticket #42907: 42907.diff

File 42907.diff, 3.7 KB (added by jdgrimes, 3 years ago)

Initial patch as a proof of concept for WP_Query

  • src/wp-includes/class-wp-meta-query.php

     
    236236                 * the rest of the meta_query).
    237237                 */
    238238                $primary_meta_query = array();
    239                 foreach ( array( 'key', 'compare', 'type' ) as $key ) {
     239                foreach ( array( 'key', 'compare', 'type', 'default' ) as $key ) {
    240240                        if ( ! empty( $qv[ "meta_$key" ] ) ) {
    241241                                $primary_meta_query[ $key ] = $qv[ "meta_$key" ];
    242242                        }
     
    513513                                'REGEXP',
    514514                                'NOT REGEXP',
    515515                                'RLIKE',
     516                                'NONE',
    516517                        )
    517518                ) ) {
    518519                        $clause['compare'] = '=';
     
    530531                        $alias = $i ? 'mt' . $i : $this->meta_table;
    531532
    532533                        // JOIN clauses for NOT EXISTS have their own syntax.
    533                         if ( 'NOT EXISTS' === $meta_compare ) {
     534                        if ( 'NONE' === $meta_compare ) {
    534535                                $join .= " LEFT JOIN $this->meta_table";
    535536                                $join .= $i ? " AS $alias" : '';
    536537                                $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] );
    537538
    538539                                // 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.
    539546                        } else {
    540547                                $join .= " INNER JOIN $this->meta_table";
    541548                                $join .= $i ? " AS $alias" : '';
     
    576583                if ( array_key_exists( 'key', $clause ) ) {
    577584                        if ( 'NOT EXISTS' === $meta_compare ) {
    578585                                $sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL';
    579                         } else {
     586                        } elseif ( 'NONE' !== $meta_compare ) {
    580587                                $sql_chunks['where'][] = $wpdb->prepare( "$alias.meta_key = %s", trim( $clause['key'] ) );
    581588                        }
    582589                }
     
    620627
    621628                                // 'value' is ignored for NOT EXISTS.
    622629                                case 'NOT EXISTS':
     630                                case 'NONE':
    623631                                        $where = '';
    624632                                        break;
    625633
  • src/wp-includes/class-wp-query.php

     
    15941594                                } else {
    15951595                                        $orderby_clause = "{$primary_meta_query['alias']}.meta_value";
    15961596                                }
     1597                                if ( isset( $primary_meta_query['default'] ) ) {
     1598                                        $orderby_clause = $wpdb->prepare( "COALESCE({$orderby_clause},%s)", $primary_meta_query['default'] );
     1599                                }
    15971600                                break;
    15981601                        case 'meta_value_num':
    15991602                                $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                                }
    16001606                                break;
    16011607                        default:
    16021608                                if ( array_key_exists( $orderby, $meta_clauses ) ) {
  • tests/phpunit/tests/meta/query.php

     
    894894                $this->assertNotContains( "{$wpdb->postmeta}.post_id IS NULL", $sql['where'] );
    895895        }
    896896
     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
    897915        /**
    898916         * @ticket 32592
    899917         */