X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/e9d988989fe37ab8c5f903e47fbe36e6e00dc51f..refs/tags/wordpress-3.2-scripts:/wp-includes/query.php diff --git a/wp-includes/query.php b/wp-includes/query.php index 14942d94..d70348cd 100644 --- a/wp-includes/query.php +++ b/wp-includes/query.php @@ -848,6 +848,15 @@ class WP_Query { */ var $tax_query; + /** + * Metadata query container + * + * @since 3.2.0 + * @access public + * @var object WP_Meta_Query + */ + var $meta_query = false; + /** * Holds the data for a single object that is queried. * @@ -1248,6 +1257,15 @@ class WP_Query { */ var $query_vars_changed = true; + /** + * Set if post thumbnails are cached + * + * @since 3.2.0 + * @access public + * @var bool + */ + var $thumbnails_cached = false; + /** * Resets query flags to false. * @@ -1525,8 +1543,6 @@ class WP_Query { } unset( $tax_query ); - _parse_meta_query( $qv ); - if ( empty($qv['author']) || ($qv['author'] == '0') ) { $this->is_author = false; } else { @@ -1625,8 +1641,12 @@ class WP_Query { $qv['post_type'] = sanitize_key($qv['post_type']); } - if ( !empty($qv['post_status']) ) - $qv['post_status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['post_status']); + if ( ! empty( $qv['post_status'] ) ) { + if ( is_array( $qv['post_status'] ) ) + $qv['post_status'] = array_map('sanitize_key', $qv['post_status']); + else + $qv['post_status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['post_status']); + } if ( $this->is_posts_page && ( ! isset($qv['withcomments']) || ! $qv['withcomments'] ) ) $this->is_comment_feed = false; @@ -1896,6 +1916,10 @@ class WP_Query { // Fill again in case pre_get_posts unset some vars. $q = $this->fill_query_vars($q); + // Parse meta query + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $q ); + // Set a flag if a pre_get_posts hook changed the query vars. $hash = md5( serialize( $this->query_vars ) ); if ( $hash != $this->query_vars_hash ) { @@ -2155,9 +2179,6 @@ class WP_Query { $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))"; $searchand = ' AND '; } - $term = esc_sql( like_escape( $q['s'] ) ); - if ( empty($q['sentence']) && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] ) - $search .= " OR ($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}')"; if ( !empty($search) ) { $search = " AND ({$search}) "; @@ -2231,6 +2252,10 @@ class WP_Query { } } + if ( !empty( $this->tax_query->queries ) || !empty( $this->meta_query->queries ) ) { + $groupby = "{$wpdb->posts}.ID"; + } + // Author/user stuff if ( empty($q['author']) || ($q['author'] == '0') ) { @@ -2287,9 +2312,9 @@ class WP_Query { // Order by if ( empty($q['orderby']) ) { - $q['orderby'] = "$wpdb->posts.post_date " . $q['order']; + $orderby = "$wpdb->posts.post_date " . $q['order']; } elseif ( 'none' == $q['orderby'] ) { - $q['orderby'] = ''; + $orderby = ''; } else { // Used to filter values $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count'); @@ -2300,10 +2325,9 @@ class WP_Query { } $q['orderby'] = urldecode($q['orderby']); $q['orderby'] = addslashes_gpc($q['orderby']); - $orderby_array = explode(' ', $q['orderby']); - $q['orderby'] = ''; - foreach ( $orderby_array as $i => $orderby ) { + $orderby_array = array(); + foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) { // Only allow certain values for safety if ( ! in_array($orderby, $allowed_keys) ) continue; @@ -2331,15 +2355,14 @@ class WP_Query { $orderby = "$wpdb->posts.post_" . $orderby; } - $q['orderby'] .= (($i == 0) ? '' : ',') . $orderby; + $orderby_array[] = $orderby; } + $orderby = implode( ',', $orderby_array ); - // append ASC or DESC at the end - if ( !empty($q['orderby'])) - $q['orderby'] .= " {$q['order']}"; - - if ( empty($q['orderby']) ) - $q['orderby'] = "$wpdb->posts.post_date ".$q['order']; + if ( empty( $orderby ) ) + $orderby = "$wpdb->posts.post_date ".$q['order']; + else + $orderby .= " {$q['order']}"; } if ( is_array( $post_type ) ) { @@ -2385,13 +2408,15 @@ class WP_Query { $read_private_cap = 'read_private_' . $post_type_cap . 's'; } - if ( isset($q['post_status']) && '' != $q['post_status'] ) { + if ( ! empty( $q['post_status'] ) ) { $statuswheres = array(); - $q_status = explode(',', $q['post_status']); + $q_status = $q['post_status']; + if ( ! is_array( $q_status ) ) + $q_status = explode(',', $q_status); $r_status = array(); $p_status = array(); $e_status = array(); - if ( $q['post_status'] == 'any' ) { + if ( in_array('any', $q_status) ) { foreach ( get_post_stati( array('exclude_from_search' => true) ) as $status ) $e_status[] = "$wpdb->posts.post_status <> '$status'"; } else { @@ -2460,26 +2485,12 @@ class WP_Query { $where .= ')'; } - // Parse the meta query again if query vars have changed. - if ( $this->query_vars_changed ) { - $meta_query_hash = md5( serialize( $q['meta_query'] ) ); - $_meta_query = $q['meta_query']; - unset( $q['meta_query'] ); - _parse_meta_query( $q ); - if ( md5( serialize( $q['meta_query'] ) ) != $meta_query_hash && is_array( $_meta_query ) ) - $q['meta_query'] = array_merge( $_meta_query, $q['meta_query'] ); - } - - if ( !empty( $q['meta_query'] ) ) { - $clauses = call_user_func_array( '_get_meta_sql', array( $q['meta_query'], 'post', $wpdb->posts, 'ID', &$this) ); + if ( !empty( $this->meta_query->queries ) ) { + $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this ); $join .= $clauses['join']; $where .= $clauses['where']; } - if ( ! empty( $this->tax_query->queries ) || ! empty( $q['meta_query'] ) ) { - $groupby = "{$wpdb->posts}.ID"; - } - // Apply filters on where and join prior to paging so that any // manipulations to them are reflected in the paging by day queries. if ( !$q['suppress_filters'] ) { @@ -2542,8 +2553,6 @@ class WP_Query { $where = "AND 0"; } - $orderby = $q['orderby']; - $pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); // Apply post-paging filters on where and join. Only plugins that @@ -2967,7 +2976,7 @@ class WP_Query { } /** - * PHP4 type constructor. + * Constructor. * * Sets up the WordPress query, if parameter is not empty. * @@ -2977,7 +2986,7 @@ class WP_Query { * @param string $query URL query string. * @return WP_Query */ - function WP_Query($query = '') { + function __construct($query = '') { if ( ! empty($query) ) { $this->query($query); } @@ -3484,6 +3493,12 @@ function wp_old_slug_redirect() { else $post_type = 'post'; + if ( is_array( $post_type ) ) { + if ( count( $post_type ) > 1 ) + return; + $post_type = array_shift( $post_type ); + } + // Do not attempt redirect for hierarchical post types if ( is_post_type_hierarchical( $post_type ) ) return; @@ -3509,7 +3524,7 @@ function wp_old_slug_redirect() { if ( !$link ) return; - wp_redirect($link, '301'); // Permanent redirect + wp_redirect( $link, 301 ); // Permanent redirect exit; endif; }