mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-05-29 15:44:27 +00:00
Introduce WP_Object_Query. See #15032
git-svn-id: https://develop.svn.wordpress.org/trunk@15715 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -524,6 +524,105 @@ class WP {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* WordPress Query class.
|
||||
*
|
||||
* Abstract class for handling advanced queries
|
||||
*
|
||||
* @package WordPress
|
||||
* @since 3.1.0
|
||||
*/
|
||||
class WP_Object_Query {
|
||||
|
||||
/**
|
||||
* Metadata query
|
||||
*
|
||||
* @since 3.1.0
|
||||
* @access public
|
||||
* @var array
|
||||
*/
|
||||
var $meta_query = array();
|
||||
|
||||
/*
|
||||
* Populates the $meta_query property
|
||||
*
|
||||
* @access private
|
||||
* @since 3.1.0
|
||||
*
|
||||
* @param array $qv The query variables
|
||||
*/
|
||||
function parse_meta_query( $qv ) {
|
||||
if ( !empty( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ) {
|
||||
$this->meta_query = $qv['meta_query'];
|
||||
}
|
||||
|
||||
$meta_query = array();
|
||||
foreach ( array( 'key', 'value', 'compare' ) as $key ) {
|
||||
if ( !empty( $qv[ "meta_$key" ] ) )
|
||||
$meta_query[ $key ] = $qv[ "meta_$key" ];
|
||||
}
|
||||
|
||||
if ( !empty( $meta_query ) ) {
|
||||
$this->meta_query[] = $meta_query;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Used internally to generate an SQL string for searching across multiple meta key = value pairs
|
||||
*
|
||||
* @access private
|
||||
* @since 3.1.0
|
||||
*
|
||||
* @param string $primary_table
|
||||
* @param string $primary_id_column
|
||||
* @param string $meta_table
|
||||
* @param string $meta_id_column
|
||||
* @return array( $join_sql, $where_sql )
|
||||
*/
|
||||
function get_meta_sql( $primary_table, $primary_id_column, $meta_table, $meta_id_column ) {
|
||||
global $wpdb;
|
||||
|
||||
$clauses = array();
|
||||
|
||||
$join = '';
|
||||
$where = '';
|
||||
$i = 0;
|
||||
foreach ( $this->meta_query as $q ) {
|
||||
$meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
|
||||
$meta_value = isset( $q['value'] ) ? trim( $q['value'] ) : '';
|
||||
$meta_compare = isset( $q['compare'] ) ? $q['compare'] : '=';
|
||||
|
||||
if ( !in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'like' ) ) )
|
||||
$meta_compare = '=';
|
||||
|
||||
if ( empty( $meta_key ) && empty( $meta_value ) )
|
||||
continue;
|
||||
|
||||
$alias = $i ? 'mt' . $i : $meta_table;
|
||||
|
||||
$join .= "\nINNER JOIN $meta_table";
|
||||
$join .= $i ? " AS $alias" : '';
|
||||
$join .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
|
||||
|
||||
$i++;
|
||||
|
||||
if ( !empty( $meta_key ) )
|
||||
$where .= $wpdb->prepare( " AND $alias.meta_key = %s", $meta_key );
|
||||
|
||||
if ( empty( $meta_value ) )
|
||||
continue;
|
||||
|
||||
if ( 'like' == $meta_compare ) {
|
||||
$where .= $wpdb->prepare( " AND $alias.meta_value LIKE %s", '%' . like_escape( $meta_value ) . '%' );
|
||||
} else {
|
||||
$where .= $wpdb->prepare( " AND $alias.meta_value $meta_compare %s", $meta_value );
|
||||
}
|
||||
}
|
||||
|
||||
return array( $join, $where );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* WordPress Error class.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user