WordPress.org

Make WordPress Core

Ticket #17264: 17264.3.diff

File 17264.3.diff, 3.4 KB (added by scribu, 7 years ago)
  • wp-includes/meta.php

     
    476476
    477477                $meta_id_column = esc_sql( $type . '_id' );
    478478
    479                 $join = '';
     479                $join = array();
    480480                $where = array();
    481                 $i = 0;
     481
    482482                foreach ( $this->queries as $k => $q ) {
    483483                        $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
    484484                        $meta_compare = isset( $q['compare'] ) ? strtoupper( $q['compare'] ) : '=';
    485485                        $meta_type = isset( $q['type'] ) ? strtoupper( $q['type'] ) : 'CHAR';
    486486
    487                         if ( ! in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) )
     487                        if ( ! in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {
    488488                                $meta_compare = '=';
     489                        }
    489490
    490                         if ( 'NUMERIC' == $meta_type )
     491                        if ( 'NUMERIC' == $meta_type ) {
    491492                                $meta_type = 'SIGNED';
    492                         elseif ( ! in_array( $meta_type, array( 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' ) ) )
     493                        } elseif ( ! in_array( $meta_type, array( 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' ) ) ) {
    493494                                $meta_type = 'CHAR';
     495                        }
    494496
    495                         if ( empty( $meta_key ) && empty( $meta_value ) )
    496                                 continue;
    497 
     497                        $i = count( $join );
    498498                        $alias = $i ? 'mt' . $i : $meta_table;
    499499
    500                         $join .= "\nINNER JOIN $meta_table";
    501                         $join .= $i ? " AS $alias" : '';
    502                         $join .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
     500                        // Set JOIN
     501                        $join[$i]  = "INNER JOIN $meta_table";
     502                        $join[$i] .= $i ? " AS $alias" : '';
     503                        $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
    503504
    504                         $i++;
    505 
     505                        $where[$k] = '';
    506506                        if ( !empty( $meta_key ) )
    507507                                $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
    508508
    509                         if ( !isset( $q['value'] ) )
     509                        if ( !isset( $q['value'] ) ) {
     510                                if ( empty( $where[$k] ) ) {
     511                                        unset( $join[$i] );
     512                                }
    510513                                continue;
     514                        }
    511515                        $meta_value = $q['value'];
    512516
    513517                        if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {
    514518                                if ( ! is_array( $meta_value ) )
    515519                                        $meta_value = preg_split( '/[,\s]+/', $meta_value );
    516520
    517                                 if ( empty( $meta_value ) )
     521                                if ( empty( $meta_value ) ) {
     522                                        unset( $join[$i] );
    518523                                        continue;
     524                                }
    519525                        } else {
    520526                                $meta_value = trim( $meta_value );
    521527                        }
     
    531537                        } else {
    532538                                $meta_compare_string = '%s';
    533539                        }
     540                       
     541                        if ( $where[$k] )
     542                                $where[$k] .= ' AND ';
    534543
    535                         $where[$k] = ' (' . $where[$k] . $wpdb->prepare( " AND CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     544                        $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
    536545                }
    537                 $where = ' AND (' . implode( " {$this->relation} ", $where ) . ' )';
    538546
     547                $where = array_filter( $where );
     548
     549                if ( empty( $where ) ) {
     550                        $where = '';
     551                } else {
     552                        $where = ' AND (' . implode( "\n{$this->relation} ", $where ) . ' )';
     553                }
     554
     555                $join = implode( "\n", $join );
     556                if ( !empty( $join ) )
     557                        $join = ' ' . $join;
     558
    539559                return apply_filters_ref_array( 'get_meta_sql', array( compact( 'join', 'where' ), $this->queries, $type, $primary_table, $primary_id_column, $context ) );
    540560        }
    541 
    542561}
    543562
    544563/**