Make WordPress Core

Changeset 15715


Ignore:
Timestamp:
10/04/2010 06:57:13 PM (14 years ago)
Author:
scribu
Message:

Introduce WP_Object_Query. See #15032

Location:
trunk/wp-includes
Files:
4 edited

Legend:

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

    r15590 r15715  
    526526
    527527/**
     528 * WordPress Query class.
     529 *
     530 * Abstract class for handling advanced queries
     531 *
     532 * @package WordPress
     533 * @since 3.1.0
     534 */
     535class WP_Object_Query {
     536
     537    /**
     538     * Metadata query
     539     *
     540     * @since 3.1.0
     541     * @access public
     542     * @var array
     543     */
     544    var $meta_query = array();
     545
     546    /*
     547     * Populates the $meta_query property
     548     *
     549     * @access private
     550     * @since 3.1.0
     551     *
     552     * @param array $qv The query variables
     553     */
     554    function parse_meta_query( $qv ) {
     555        if ( !empty( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ) {
     556            $this->meta_query = $qv['meta_query'];
     557        }
     558
     559        $meta_query = array();
     560        foreach ( array( 'key', 'value', 'compare' ) as $key ) {
     561            if ( !empty( $qv[ "meta_$key" ] ) )
     562                $meta_query[ $key ] = $qv[ "meta_$key" ];
     563        }
     564
     565        if ( !empty( $meta_query ) ) {
     566            $this->meta_query[] = $meta_query;
     567        }
     568    }
     569
     570    /*
     571     * Used internally to generate an SQL string for searching across multiple meta key = value pairs
     572     *
     573     * @access private
     574     * @since 3.1.0
     575     *
     576     * @param string $primary_table
     577     * @param string $primary_id_column
     578     * @param string $meta_table
     579     * @param string $meta_id_column
     580     * @return array( $join_sql, $where_sql )
     581     */
     582    function get_meta_sql( $primary_table, $primary_id_column, $meta_table, $meta_id_column ) {
     583        global $wpdb;
     584
     585        $clauses = array();
     586
     587        $join = '';
     588        $where = '';
     589        $i = 0;
     590        foreach ( $this->meta_query as $q ) {
     591            $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
     592            $meta_value = isset( $q['value'] ) ? trim( $q['value'] ) : '';
     593            $meta_compare = isset( $q['compare'] ) ? $q['compare'] : '=';
     594
     595            if ( !in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'like' ) ) )
     596                $meta_compare = '=';
     597
     598            if ( empty( $meta_key ) && empty( $meta_value ) )
     599                continue;
     600
     601            $alias = $i ? 'mt' . $i : $meta_table;
     602
     603            $join .= "\nINNER JOIN $meta_table";
     604            $join .= $i ? " AS $alias" : '';
     605            $join .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
     606
     607            $i++;
     608
     609            if ( !empty( $meta_key ) )
     610                $where .= $wpdb->prepare( " AND $alias.meta_key = %s", $meta_key );
     611
     612            if ( empty( $meta_value ) )
     613                continue;
     614
     615            if ( 'like' == $meta_compare ) {
     616                $where .= $wpdb->prepare( " AND $alias.meta_value LIKE %s", '%' . like_escape( $meta_value ) . '%' );
     617            } else {
     618                $where .= $wpdb->prepare( " AND $alias.meta_value $meta_compare %s", $meta_value );
     619            }
     620        }
     621
     622        return array( $join, $where );
     623    }
     624}
     625
     626/**
    528627 * WordPress Error class.
    529628 *
  • trunk/wp-includes/functions.php

    r15714 r15715  
    42584258
    42594259/*
    4260  * Used internally to generate an SQL string for searching across multiple meta key = value pairs
    4261  *
    4262  * @access private
    4263  * @since 3.1.0
    4264  *
    4265  * @param array $queries An array of queries
    4266  * @param string $primary_table
    4267  * @param string $primary_id_column
    4268  * @param string $meta_table
    4269  * @param string $meta_id_column
    4270  * @return array( $join_sql, $where_sql )
    4271  */
    4272 function _wp_meta_sql( $queries, $primary_table, $primary_id_column, $meta_table, $meta_id_column ) {
    4273     global $wpdb;
    4274 
    4275     $clauses = array();
    4276 
    4277     $join = '';
    4278     $where = '';
    4279     $i = 0;
    4280     foreach ( $queries as $q ) {
    4281         $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
    4282         $meta_value = isset( $q['value'] ) ? trim( $q['value'] ) : '';
    4283         $meta_compare = isset( $q['compare'] ) ? $q['compare'] : '=';
    4284 
    4285         if ( !in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'like' ) ) )
    4286             $meta_compare = '=';
    4287 
    4288         if ( empty( $meta_key ) && empty( $meta_value ) )
    4289             continue;
    4290 
    4291         $alias = $i ? 'mt' . $i : $meta_table;
    4292 
    4293         $join .= "\nINNER JOIN $meta_table";
    4294         $join .= $i ? " AS $alias" : '';
    4295         $join .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
    4296 
    4297         $i++;
    4298 
    4299         if ( !empty( $meta_key ) )
    4300             $where .= $wpdb->prepare( " AND $alias.meta_key = %s", $meta_key );
    4301 
    4302         if ( empty( $meta_value ) )
    4303             continue;
    4304 
    4305         if ( 'like' == $meta_compare ) {
    4306             $where .= $wpdb->prepare( " AND $alias.meta_value LIKE %s", '%' . like_escape( $meta_value ) . '%' );
    4307         } else {
    4308             $where .= $wpdb->prepare( " AND $alias.meta_value $meta_compare %s", $meta_value );
    4309         }
    4310     }
    4311 
    4312     return array( $join, $where );
    4313 }
    4314 
    4315 /*
    43164260 * Used internally to tidy up the search terms
    43174261 *
  • trunk/wp-includes/query.php

    r15714 r15715  
    642642 * @since 1.5.0
    643643 */
    644 class WP_Query {
     644class WP_Query extends WP_Object_Query {
    645645
    646646    /**
     
    670670     */
    671671    var $tax_query = array();
    672 
    673     /**
    674      * Metadata query
    675      *
    676      * @since 3.1.0
    677      * @access public
    678      * @var array
    679      */
    680     var $meta_query = array();
    681672
    682673    /**
     
    13901381            }
    13911382
    1392             if ( !empty( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ) {
    1393                 $this->meta_query = $qv['meta_query'];
    1394             }
    1395 
    1396             $meta_query = array();
    1397             foreach ( array( 'key', 'value', 'compare' ) as $key ) {
    1398                 if ( !empty( $qv[ "meta_$key" ] ) )
    1399                     $meta_query[ $key ] = $qv[ "meta_$key" ];
    1400             }
    1401 
    1402             if ( !empty( $meta_query ) ) {
    1403                 $this->meta_query[] = $meta_query;
    1404             }
     1383            $this->parse_meta_query( $qv );
    14051384
    14061385            if ( empty($qv['author']) || ($qv['author'] == '0') ) {
     
    22122191        }
    22132192
    2214         list( $meta_join, $meta_where ) = _wp_meta_sql( $this->meta_query, $wpdb->posts, 'ID', $wpdb->postmeta, 'post_id' );
     2193        list( $meta_join, $meta_where ) = $this->get_meta_sql( $wpdb->posts, 'ID', $wpdb->postmeta, 'post_id' );
    22152194        $join .= $meta_join;
    22162195        $where .= $meta_where;
  • trunk/wp-includes/user.php

    r15714 r15715  
    331331 * @since 3.1.0
    332332 */
    333 class WP_User_Query {
     333class WP_User_Query extends WP_Object_Query {
    334334
    335335    /**
     
    445445        }
    446446
     447        $this->parse_meta_query( $qv );
     448
    447449        $role = trim( $qv['role'] );
    448450        $blog_id = absint( $qv['blog_id'] );
    449 
    450         $meta_queries = array();
    451451
    452452        if ( $blog_id ) {
     
    459459            }
    460460
    461             $meta_queries[] = $cap_meta_query;
    462         }
    463 
    464         $meta_query = array();
    465         foreach ( array( 'key', 'value', 'compare' ) as $key ) {
    466             if ( !empty( $qv[ "meta_$key" ] ) )
    467                 $meta_query[ $key ] = $qv[ "meta_$key" ];
    468         }
    469 
    470         if ( !empty( $meta_query ) ) {
    471             $meta_queries[] = $meta_query;
    472         }
    473 
    474         list( $meta_join, $meta_where ) = _wp_meta_sql( $meta_queries, $wpdb->users, 'ID', $wpdb->usermeta, 'user_id' );
     461            $this->meta_query[] = $cap_meta_query;
     462        }
     463
     464        list( $meta_join, $meta_where ) = $this->get_meta_sql( $wpdb->users, 'ID', $wpdb->usermeta, 'user_id' );
    475465        $this->query_from .= $meta_join;
    476466        $this->query_where .= $meta_where;
Note: See TracChangeset for help on using the changeset viewer.