Make WordPress Core

Ticket #18158: 18158.5.diff

File 18158.5.diff, 2.1 KB (added by scribu, 13 years ago)
  • wp-includes/meta.php

    diff --git wp-includes/meta.php wp-includes/meta.php
    index 3caa808..f20d377 100644
    class WP_Meta_Query { 
    716716                        elseif ( ! in_array( $meta_type, array( 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' ) ) )
    717717                                $meta_type = 'CHAR';
    718718
     719                        $meta_value = isset( $q['value'] ) ? $q['value'] : null;
     720
     721                        if ( isset( $q['compare'] ) )
     722                                $meta_compare = strtoupper( $q['compare'] );
     723                        else
     724                                $meta_compare = is_array( $meta_value ) ? 'IN' : '=';
     725
     726                        if ( ! in_array( $meta_compare, array(
     727                                '=', '!=', '>', '>=', '<', '<=',
     728                                'LIKE', 'NOT LIKE',
     729                                'IN', 'NOT IN',
     730                                'BETWEEN', 'NOT BETWEEN',
     731                                'NOT EXISTS'
     732                        ) ) )
     733                                $meta_compare = '=';
     734
    719735                        $i = count( $join );
    720736                        $alias = $i ? 'mt' . $i : $meta_table;
    721737
    722                         // Set JOIN
     738                        if ( $meta_compare == 'NOT EXISTS' ) {
     739                                $join[$i]  = "LEFT JOIN $meta_table";
     740                                $join[$i] .= $i ? " AS $alias" : '';
     741                                $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column AND $alias.meta_key = '$meta_key')";
     742
     743                                $where[$k] = ' ' . $alias . '.' . $meta_id_column . ' IS NULL';
     744
     745                                continue;
     746                        }
     747
    723748                        $join[$i]  = "INNER JOIN $meta_table";
    724749                        $join[$i] .= $i ? " AS $alias" : '';
    725750                        $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
    class WP_Meta_Query { 
    728753                        if ( !empty( $meta_key ) )
    729754                                $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
    730755
    731                         if ( !isset( $q['value'] ) ) {
     756                        if ( is_null( $meta_value ) ) {
    732757                                if ( empty( $where[$k] ) )
    733758                                        unset( $join[$i] );
    734759                                continue;
    735760                        }
    736761
    737                         $meta_value = $q['value'];
    738 
    739                         $meta_compare = is_array( $meta_value ) ? 'IN' : '=';
    740                         if ( isset( $q['compare'] ) )
    741                                 $meta_compare = strtoupper( $q['compare'] );
    742 
    743                         if ( ! in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) )
    744                                 $meta_compare = '=';
    745 
    746762                        if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {
    747763                                if ( ! is_array( $meta_value ) )
    748764                                        $meta_value = preg_split( '/[,\s]+/', $meta_value );