Make WordPress Core


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

Introduce WP_Object_Query. See #15032

File:
1 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 *
Note: See TracChangeset for help on using the changeset viewer.