Make WordPress Core

Changeset 17746


Ignore:
Timestamp:
04/28/2011 03:02:16 PM (13 years ago)
Author:
dd32
Message:

Properly handle querying for meta by value without a key as well as those with invalid parameters. Props scribu. See #17264

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/meta.php

    r17699 r17746  
    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'] ) : '';
     
    493493                $meta_type = 'CHAR';
    494494
    495             if ( empty( $meta_key ) && empty( $meta_value ) )
    496                 continue;
    497 
     495            $i = count( $join );
    498496            $alias = $i ? 'mt' . $i : $meta_table;
    499497
    500             $join .= "\nINNER JOIN $meta_table";
    501             $join .= $i ? " AS $alias" : '';
    502             $join .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
    503 
    504             $i++;
    505 
     498            // Set JOIN
     499            $join[$i]  = "INNER JOIN $meta_table";
     500            $join[$i] .= $i ? " AS $alias" : '';
     501            $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
     502
     503            $where[$k] = '';
    506504            if ( !empty( $meta_key ) )
    507505                $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
    508506
    509             if ( !isset( $q['value'] ) )
     507            if ( !isset( $q['value'] ) ) {
     508                if ( empty( $where[$k] ) )
     509                    unset( $join[$i] );
    510510                continue;
     511            }
     512
    511513            $meta_value = $q['value'];
    512514
     
    515517                    $meta_value = preg_split( '/[,\s]+/', $meta_value );
    516518
    517                 if ( empty( $meta_value ) )
     519                if ( empty( $meta_value ) ) {
     520                    unset( $join[$i] );
    518521                    continue;
     522                }
    519523            } else {
    520524                $meta_value = trim( $meta_value );
     
    533537            }
    534538
    535             $where[$k] = ' (' . $where[$k] . $wpdb->prepare( " AND CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
    536         }
    537         $where = ' AND (' . implode( " {$this->relation} ", $where ) . ' )';
     539            if ( ! empty( $where[$k] ) )
     540                $where[$k] .= ' AND ';
     541
     542            $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
     543        }
     544
     545        $where = array_filter( $where );
     546
     547        if ( empty( $where ) )
     548            $where = '';
     549        else
     550            $where = ' AND (' . implode( "\n{$this->relation} ", $where ) . ' )';
     551
     552        $join = implode( "\n", $join );
     553        if ( ! empty( $join ) )
     554            $join = ' ' . $join;
    538555
    539556        return apply_filters_ref_array( 'get_meta_sql', array( compact( 'join', 'where' ), $this->queries, $type, $primary_table, $primary_id_column, $context ) );
    540557    }
    541 
    542558}
    543559
Note: See TracChangeset for help on using the changeset viewer.