X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/596d585e1dc1eb25bccd3781e37210a4e2504179..6c8f14c09105d0afa4c1574215c59b5021040e76:/wp-includes/meta.php diff --git a/wp-includes/meta.php b/wp-includes/meta.php index d6984f62..9db1de30 100644 --- a/wp-includes/meta.php +++ b/wp-includes/meta.php @@ -123,9 +123,6 @@ function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v if ( null !== $check ) return (bool) $check; - if ( ! $meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) ) ) - return add_metadata($meta_type, $object_id, $meta_key, $passed_value); - // Compare existing value to new value if no prev value given and the key exists only once. if ( empty($prev_value) ) { $old_value = get_metadata($meta_type, $object_id, $meta_key); @@ -135,6 +132,9 @@ function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v } } + if ( ! $meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) ) ) + return add_metadata($meta_type, $object_id, $meta_key, $passed_value); + $_meta_value = $meta_value; $meta_value = maybe_serialize( $meta_value ); @@ -711,7 +711,30 @@ class WP_Meta_Query { $join = array(); $where = array(); - foreach ( $this->queries as $k => $q ) { + $key_only_queries = array(); + $queries = array(); + + // Split out the meta_key only queries (we can only do this for OR) + if ( 'OR' == $this->relation ) { + foreach ( $this->queries as $k => $q ) { + if ( ! isset( $q['value'] ) && ! empty( $q['key'] ) ) + $key_only_queries[$k] = $q; + else + $queries[$k] = $q; + } + } else { + $queries = $this->queries; + } + + // Specify all the meta_key only queries in one go + if ( $key_only_queries ) { + $join[] = "INNER JOIN $meta_table ON $primary_table.$primary_id_column = $meta_table.$meta_id_column"; + + foreach ( $key_only_queries as $key => $q ) + $where["key-only-$key"] = $wpdb->prepare( "$meta_table.meta_key = %s", trim( $q['key'] ) ); + } + + foreach ( $queries as $k => $q ) { $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : ''; $meta_type = isset( $q['type'] ) ? strtoupper( $q['type'] ) : 'CHAR'; @@ -720,10 +743,35 @@ class WP_Meta_Query { elseif ( ! in_array( $meta_type, array( 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' ) ) ) $meta_type = 'CHAR'; + $meta_value = isset( $q['value'] ) ? $q['value'] : null; + + if ( isset( $q['compare'] ) ) + $meta_compare = strtoupper( $q['compare'] ); + else + $meta_compare = is_array( $meta_value ) ? 'IN' : '='; + + if ( ! in_array( $meta_compare, array( + '=', '!=', '>', '>=', '<', '<=', + 'LIKE', 'NOT LIKE', + 'IN', 'NOT IN', + 'BETWEEN', 'NOT BETWEEN', + 'NOT EXISTS' + ) ) ) + $meta_compare = '='; + $i = count( $join ); $alias = $i ? 'mt' . $i : $meta_table; - // Set JOIN + if ( 'NOT EXISTS' == $meta_compare ) { + $join[$i] = "LEFT JOIN $meta_table"; + $join[$i] .= $i ? " AS $alias" : ''; + $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column AND $alias.meta_key = '$meta_key')"; + + $where[$k] = ' ' . $alias . '.' . $meta_id_column . ' IS NULL'; + + continue; + } + $join[$i] = "INNER JOIN $meta_table"; $join[$i] .= $i ? " AS $alias" : ''; $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)"; @@ -732,21 +780,12 @@ class WP_Meta_Query { if ( !empty( $meta_key ) ) $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key ); - if ( !isset( $q['value'] ) ) { + if ( is_null( $meta_value ) ) { if ( empty( $where[$k] ) ) unset( $join[$i] ); continue; } - $meta_value = $q['value']; - - $meta_compare = is_array( $meta_value ) ? 'IN' : '='; - if ( isset( $q['compare'] ) ) - $meta_compare = strtoupper( $q['compare'] ); - - if ( ! in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) - $meta_compare = '='; - if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { if ( ! is_array( $meta_value ) ) $meta_value = preg_split( '/[,\s]+/', $meta_value );