X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/61343b82c4f0da4c68e4c6373daafff4a81efdd1..fa11948979fd6a4ea5705dc613b239699a459db3:/wp-includes/query.php?ds=sidebyside
diff --git a/wp-includes/query.php b/wp-includes/query.php
index 04286aa5..a9300329 100644
--- a/wp-includes/query.php
+++ b/wp-includes/query.php
@@ -108,17 +108,14 @@ function wp_reset_query() {
/**
* After looping through a separate query, this function restores
- * the $post global to the current post in the main query
+ * the $post global to the current post in the main query.
*
* @since 3.0.0
* @uses $wp_query
*/
function wp_reset_postdata() {
global $wp_query;
- if ( !empty($wp_query->post) ) {
- $GLOBALS['post'] = $wp_query->post;
- setup_postdata($wp_query->post);
- }
+ $wp_query->reset_postdata();
}
/*
@@ -246,10 +243,10 @@ function is_category( $category = '' ) {
* @since 2.3.0
* @uses $wp_query
*
- * @param mixed $slug Optional. Tag slug or array of slugs.
+ * @param mixed $tag Optional. Tag ID, name, slug, or array of Tag IDs, names, and slugs.
* @return bool
*/
-function is_tag( $slug = '' ) {
+function is_tag( $tag = '' ) {
global $wp_query;
if ( ! isset( $wp_query ) ) {
@@ -257,7 +254,7 @@ function is_tag( $slug = '' ) {
return false;
}
- return $wp_query->is_tag( $slug );
+ return $wp_query->is_tag( $tag );
}
/**
@@ -720,6 +717,12 @@ function is_404() {
* @return bool
*/
function is_main_query() {
+ if ( 'pre_get_posts' === current_filter() ) {
+ $message = sprintf( __( 'In %1$s
, use the %2$s
method, not the %3$s
function. See %4$s.' ),
+ 'pre_get_posts', 'WP_Query::is_main_query()', 'is_main_query()', __( 'http://codex.wordpress.org/Function_Reference/is_main_query' ) );
+ _doing_it_wrong( __FUNCTION__, $message, '3.7' );
+ }
+
global $wp_query;
return $wp_query->is_main_query();
}
@@ -866,6 +869,15 @@ class WP_Query {
*/
var $meta_query = false;
+ /**
+ * Date query container
+ *
+ * @since 3.7.0
+ * @access public
+ * @var object WP_Date_Query
+ */
+ var $date_query = false;
+
/**
* Holds the data for a single object that is queried.
*
@@ -932,11 +944,11 @@ class WP_Query {
var $in_the_loop = false;
/**
- * The current post ID.
+ * The current post.
*
* @since 1.5.0
* @access public
- * @var object
+ * @var WP_Post
*/
var $post;
@@ -1277,6 +1289,14 @@ class WP_Query {
*/
var $thumbnails_cached = false;
+ /**
+ * Cached list of search stopwords.
+ *
+ * @since 3.7.0
+ * @var array
+ */
+ private $stopwords;
+
/**
* Resets query flags to false.
*
@@ -1387,6 +1407,7 @@ class WP_Query {
, 'tag'
, 'cat'
, 'tag_id'
+ , 'author'
, 'author_name'
, 'feed'
, 'tb'
@@ -1407,7 +1428,8 @@ class WP_Query {
}
$array_keys = array( 'category__in', 'category__not_in', 'category__and', 'post__in', 'post__not_in',
- 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'post_parent__in', 'post_parent__not_in' );
+ 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'post_parent__in', 'post_parent__not_in',
+ 'author__in', 'author__not_in' );
foreach ( $array_keys as $key ) {
if ( !isset($array[$key]) )
@@ -1445,9 +1467,10 @@ class WP_Query {
$qv['monthnum'] = absint($qv['monthnum']);
$qv['day'] = absint($qv['day']);
$qv['w'] = absint($qv['w']);
- $qv['m'] = absint($qv['m']);
+ $qv['m'] = preg_replace( '|[^0-9]|', '', $qv['m'] );
$qv['paged'] = absint($qv['paged']);
$qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // comma separated list of positive or negative integers
+ $qv['author'] = preg_replace( '|[^0-9,-]|', '', $qv['author'] ); // comma separated list of positive or negative integers
$qv['pagename'] = trim( $qv['pagename'] );
$qv['name'] = trim( $qv['name'] );
if ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']);
@@ -1455,6 +1478,10 @@ class WP_Query {
if ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']);
if ( '' !== $qv['menu_order'] ) $qv['menu_order'] = absint($qv['menu_order']);
+ // Fairly insane upper bound for search string lengths.
+ if ( ! empty( $qv['s'] ) && strlen( $qv['s'] ) > 1600 )
+ $qv['s'] = '';
+
// Compat. Map subpost to attachment.
if ( '' != $qv['subpost'] )
$qv['attachment'] = $qv['subpost'];
@@ -1501,15 +1528,24 @@ class WP_Query {
if ( $qv['day'] ) {
if ( ! $this->is_date ) {
- $this->is_day = true;
- $this->is_date = true;
+ $date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] );
+ if ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) {
+ $qv['error'] = '404';
+ } else {
+ $this->is_day = true;
+ $this->is_date = true;
+ }
}
}
if ( $qv['monthnum'] ) {
if ( ! $this->is_date ) {
- $this->is_month = true;
- $this->is_date = true;
+ if ( 12 < $qv['monthnum'] ) {
+ $qv['error'] = '404';
+ } else {
+ $this->is_month = true;
+ $this->is_date = true;
+ }
}
}
@@ -1699,7 +1735,7 @@ class WP_Query {
);
}
- foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
+ foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) {
if ( 'post_tag' == $taxonomy )
continue; // Handled further down in the $q['tag'] block
@@ -1753,8 +1789,16 @@ class WP_Query {
$q['cat'] = implode(',', $req_cats);
}
- if ( !empty($q['category__in']) ) {
- $q['category__in'] = array_map('absint', array_unique( (array) $q['category__in'] ) );
+ if ( ! empty( $q['category__and'] ) && 1 === count( (array) $q['category__and'] ) ) {
+ $q['category__and'] = (array) $q['category__and'];
+ if ( ! isset( $q['category__in'] ) )
+ $q['category__in'] = array();
+ $q['category__in'][] = absint( reset( $q['category__and'] ) );
+ unset( $q['category__and'] );
+ }
+
+ if ( ! empty( $q['category__in'] ) ) {
+ $q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) );
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $q['category__in'],
@@ -1763,8 +1807,8 @@ class WP_Query {
);
}
- if ( !empty($q['category__not_in']) ) {
- $q['category__not_in'] = array_map('absint', array_unique( (array) $q['category__not_in'] ) );
+ if ( ! empty($q['category__not_in']) ) {
+ $q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) );
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $q['category__not_in'],
@@ -1773,8 +1817,8 @@ class WP_Query {
);
}
- if ( !empty($q['category__and']) ) {
- $q['category__and'] = array_map('absint', array_unique( (array) $q['category__and'] ) );
+ if ( ! empty($q['category__and']) ) {
+ $q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) );
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $q['category__and'],
@@ -1858,6 +1902,177 @@ class WP_Query {
}
$this->tax_query = new WP_Tax_Query( $tax_query );
+
+ do_action( 'parse_tax_query', $this );
+ }
+
+ /**
+ * Generate SQL for the WHERE clause based on passed search terms.
+ *
+ * @since 3.7.0
+ *
+ * @global type $wpdb
+ * @param array $q Query variables.
+ */
+ protected function parse_search( &$q ) {
+ global $wpdb;
+
+ $search = '';
+
+ // added slashes screw with quote grouping when done early, so done later
+ $q['s'] = stripslashes( $q['s'] );
+ if ( empty( $_GET['s'] ) && $this->is_main_query() )
+ $q['s'] = urldecode( $q['s'] );
+ // there are no line breaks in fields
+ $q['s'] = str_replace( array( "\r", "\n" ), '', $q['s'] );
+ $q['search_terms_count'] = 1;
+ if ( ! empty( $q['sentence'] ) ) {
+ $q['search_terms'] = array( $q['s'] );
+ } else {
+ if ( preg_match_all( '/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches ) ) {
+ $q['search_terms_count'] = count( $matches[0] );
+ $q['search_terms'] = $this->parse_search_terms( $matches[0] );
+ // if the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence
+ if ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 )
+ $q['search_terms'] = array( $q['s'] );
+ } else {
+ $q['search_terms'] = array( $q['s'] );
+ }
+ }
+
+ $n = ! empty( $q['exact'] ) ? '' : '%';
+ $searchand = '';
+ $q['search_orderby_title'] = array();
+ foreach ( $q['search_terms'] as $term ) {
+ $term = like_escape( esc_sql( $term ) );
+ if ( $n )
+ $q['search_orderby_title'][] = "$wpdb->posts.post_title LIKE '%$term%'";
+
+ $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
+ $searchand = ' AND ';
+ }
+
+ if ( ! empty( $search ) ) {
+ $search = " AND ({$search}) ";
+ if ( ! is_user_logged_in() )
+ $search .= " AND ($wpdb->posts.post_password = '') ";
+ }
+
+ return $search;
+ }
+
+ /**
+ * Check if the terms are suitable for searching.
+ *
+ * Uses an array of stopwords (terms) that are excluded from the separate
+ * term matching when searching for posts. The list of English stopwords is
+ * the approximate search engines list, and is translatable.
+ *
+ * @since 3.7.0
+ *
+ * @param array Terms to check.
+ * @return array Terms that are not stopwords.
+ */
+ protected function parse_search_terms( $terms ) {
+ $strtolower = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower';
+ $checked = array();
+
+ $stopwords = $this->get_search_stopwords();
+
+ foreach ( $terms as $term ) {
+ // keep before/after spaces when term is for exact match
+ if ( preg_match( '/^".+"$/', $term ) )
+ $term = trim( $term, "\"'" );
+ else
+ $term = trim( $term, "\"' " );
+
+ // \p{L} matches a single letter that is not a Chinese, Japanese, etc. char
+ if ( ! $term || preg_match( '/^\p{L}$/u', $term ) )
+ continue;
+
+ if ( in_array( call_user_func( $strtolower, $term ), $stopwords, true ) )
+ continue;
+
+ $checked[] = $term;
+ }
+
+ return $checked;
+ }
+
+ /**
+ * Retrieve stopwords used when parsing search terms.
+ *
+ * @since 3.7.0
+ *
+ * @return array Stopwords.
+ */
+ protected function get_search_stopwords() {
+ if ( isset( $this->stopwords ) )
+ return $this->stopwords;
+
+ /* translators: This is a comma-separated list of very common words that should be excluded from a search,
+ * like a, an, and the. These are usually called "stopwords". You should not simply translate these individual
+ * words into your language. Instead, look for and provide commonly accepted stopwords in your language.
+ */
+ $words = explode( ',', _x( 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www',
+ 'Comma-separated list of search stopwords in your language' ) );
+
+ foreach( $words as $word ) {
+ $word = trim( $word, "\r\n\t " );
+ if ( $word )
+ $stopwords[] = $word;
+ }
+
+ /**
+ * Filter stopwords used when parsing search terms.
+ *
+ * @since 3.7.0
+ *
+ * @param array $stopwords Stopwords.
+ */
+ $this->stopwords = apply_filters( 'wp_search_stopwords', $stopwords );
+ return $this->stopwords;
+ }
+
+ /**
+ * Generate SQL for the ORDER BY condition based on passed search terms.
+ *
+ * @global wpdb $wpdb
+ * @param array $q Query variables.
+ * @return string ORDER BY clause.
+ */
+ protected function parse_search_order( &$q ) {
+ global $wpdb;
+
+ $search_orderby = '';
+
+ if ( $q['search_terms_count'] > 1 ) {
+ $num_terms = count( $q['search_orderby_title'] );
+ $search_orderby_s = like_escape( esc_sql( $q['s'] ) );
+
+ $search_orderby = '(CASE ';
+ // sentence match in 'post_title'
+ $search_orderby .= "WHEN $wpdb->posts.post_title LIKE '%{$search_orderby_s}%' THEN 1 ";
+
+ // sanity limit, sort as sentence when more than 6 terms
+ // (few searches are longer than 6 terms and most titles are not)
+ if ( $num_terms < 7 ) {
+ // all words in title
+ $search_orderby .= 'WHEN ' . implode( ' AND ', $q['search_orderby_title'] ) . ' THEN 2 ';
+ // any word in title, not needed when $num_terms == 1
+ if ( $num_terms > 1 )
+ $search_orderby .= 'WHEN ' . implode( ' OR ', $q['search_orderby_title'] ) . ' THEN 3 ';
+ }
+
+ // sentence match in 'post_content'
+ $search_orderby .= "WHEN $wpdb->posts.post_content LIKE '%{$search_orderby_s}%' THEN 4 ";
+ $search_orderby .= 'ELSE 5 END)';
+ } else {
+ // single word or sentence search
+ $search_orderby = reset( $q['search_orderby_title'] ) . ' DESC';
+ }
+
+ return $search_orderby;
}
/**
@@ -1917,7 +2132,7 @@ class WP_Query {
* @return array List of posts.
*/
function get_posts() {
- global $wpdb, $user_ID, $_wp_using_ext_object_cache;
+ global $wpdb;
$this->parse_query();
@@ -1967,7 +2182,7 @@ class WP_Query {
$q['suppress_filters'] = false;
if ( !isset($q['cache_results']) ) {
- if ( $_wp_using_ext_object_cache )
+ if ( wp_using_ext_object_cache() )
$q['cache_results'] = false;
else
$q['cache_results'] = true;
@@ -2045,9 +2260,8 @@ class WP_Query {
if ( '' !== $q['menu_order'] )
$where .= " AND $wpdb->posts.menu_order = " . $q['menu_order'];
- // If a month is specified in the querystring, load that month
+ // The "m" parameter is meant for months but accepts datetimes of varying specificity
if ( $q['m'] ) {
- $q['m'] = '' . preg_replace('|[^0-9]|', '', $q['m']);
$where .= " AND YEAR($wpdb->posts.post_date)=" . substr($q['m'], 0, 4);
if ( strlen($q['m']) > 5 )
$where .= " AND MONTH($wpdb->posts.post_date)=" . substr($q['m'], 4, 2);
@@ -2061,23 +2275,42 @@ class WP_Query {
$where .= " AND SECOND($wpdb->posts.post_date)=" . substr($q['m'], 12, 2);
}
+ // Handle the other individual date parameters
+ $date_parameters = array();
+
if ( '' !== $q['hour'] )
- $where .= " AND HOUR($wpdb->posts.post_date)='" . $q['hour'] . "'";
+ $date_parameters['hour'] = $q['hour'];
if ( '' !== $q['minute'] )
- $where .= " AND MINUTE($wpdb->posts.post_date)='" . $q['minute'] . "'";
+ $date_parameters['minute'] = $q['minute'];
if ( '' !== $q['second'] )
- $where .= " AND SECOND($wpdb->posts.post_date)='" . $q['second'] . "'";
+ $date_parameters['second'] = $q['second'];
if ( $q['year'] )
- $where .= " AND YEAR($wpdb->posts.post_date)='" . $q['year'] . "'";
+ $date_parameters['year'] = $q['year'];
if ( $q['monthnum'] )
- $where .= " AND MONTH($wpdb->posts.post_date)='" . $q['monthnum'] . "'";
+ $date_parameters['monthnum'] = $q['monthnum'];
+
+ if ( $q['w'] )
+ $date_parameters['week'] = $q['w'];
if ( $q['day'] )
- $where .= " AND DAYOFMONTH($wpdb->posts.post_date)='" . $q['day'] . "'";
+ $date_parameters['day'] = $q['day'];
+
+ if ( $date_parameters ) {
+ $date_query = new WP_Date_Query( array( $date_parameters ) );
+ $where .= $date_query->get_sql();
+ }
+ unset( $date_parameters, $date_query );
+
+ // Handle complex date queries
+ if ( ! empty( $q['date_query'] ) ) {
+ $this->date_query = new WP_Date_Query( $q['date_query'] );
+ $where .= $this->date_query->get_sql();
+ }
+
// If we've got a post_type AND it's not "any" post_type.
if ( !empty($q['post_type']) && 'any' != $q['post_type'] ) {
@@ -2147,8 +2380,6 @@ class WP_Query {
$where .= " AND $wpdb->posts.post_name = '" . $q['attachment'] . "'";
}
- if ( $q['w'] )
- $where .= ' AND ' . _wp_mysql_week( "`$wpdb->posts`.`post_date`" ) . " = '" . $q['w'] . "'";
if ( intval($q['comments_popup']) )
$q['p'] = absint($q['comments_popup']);
@@ -2185,35 +2416,19 @@ class WP_Query {
}
}
- // If a search pattern is specified, load the posts that match
- if ( !empty($q['s']) ) {
- // added slashes screw with quote grouping when done early, so done later
- $q['s'] = stripslashes($q['s']);
- if ( empty( $_GET['s'] ) && $this->is_main_query() )
- $q['s'] = urldecode($q['s']);
- if ( !empty($q['sentence']) ) {
- $q['search_terms'] = array($q['s']);
- } else {
- preg_match_all('/".*?("|$)|((?<=[\r\n\t ",+])|^)[^\r\n\t ",+]+/', $q['s'], $matches);
- $q['search_terms'] = array_map('_search_terms_tidy', $matches[0]);
- }
- $n = !empty($q['exact']) ? '' : '%';
- $searchand = '';
- foreach( (array) $q['search_terms'] as $term ) {
- $term = esc_sql( like_escape( $term ) );
- $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
- $searchand = ' AND ';
- }
-
- if ( !empty($search) ) {
- $search = " AND ({$search}) ";
- if ( !is_user_logged_in() )
- $search .= " AND ($wpdb->posts.post_password = '') ";
- }
- }
+ // If a search pattern is specified, load the posts that match.
+ if ( ! empty( $q['s'] ) )
+ $search = $this->parse_search( $q );
- // Allow plugins to contextually add/remove/modify the search section of the database query
- $search = apply_filters_ref_array('posts_search', array( $search, &$this ) );
+ /**
+ * Filter the search SQL that is used in the WHERE clause of WP_Query.
+ *
+ * @since 3.0.0
+ *
+ * @param string $search Search SQL for WHERE clause.
+ * @param WP_Query $this The current WP_Query object.
+ */
+ $search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) );
// Taxonomies
if ( !$this->is_singular ) {
@@ -2300,26 +2515,22 @@ class WP_Query {
// Author/user stuff
- if ( empty($q['author']) || ($q['author'] == '0') ) {
- $whichauthor = '';
- } else {
- $q['author'] = (string)urldecode($q['author']);
- $q['author'] = addslashes_gpc($q['author']);
- if ( strpos($q['author'], '-') !== false ) {
- $eq = '!=';
- $andor = 'AND';
- $q['author'] = explode('-', $q['author']);
- $q['author'] = (string)absint($q['author'][1]);
- } else {
- $eq = '=';
- $andor = 'OR';
+ if ( ! empty( $q['author'] ) && $q['author'] != '0' ) {
+ $q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) );
+ $authors = array_unique( array_map( 'intval', preg_split( '/[,\s]+/', $q['author'] ) ) );
+ foreach ( $authors as $author ) {
+ $key = $author > 0 ? 'author__in' : 'author__not_in';
+ $q[$key][] = abs( $author );
}
- $author_array = preg_split('/[,\s]+/', $q['author']);
- $_author_array = array();
- foreach ( $author_array as $key => $_author )
- $_author_array[] = "$wpdb->posts.post_author " . $eq . ' ' . absint($_author);
- $whichauthor .= ' AND (' . implode(" $andor ", $_author_array) . ')';
- unset($author_array, $_author_array);
+ $q['author'] = implode( ',', $authors );
+ }
+
+ if ( ! empty( $q['author__not_in'] ) ) {
+ $author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) );
+ $where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
+ } elseif ( ! empty( $q['author__in'] ) ) {
+ $author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) );
+ $where .= " AND {$wpdb->posts}.post_author IN ($author__in) ";
}
// Author stuff for nice URLs
@@ -2388,7 +2599,12 @@ class WP_Query {
break;
case $q['meta_key']:
case 'meta_value':
- $orderby = "$wpdb->postmeta.meta_value";
+ if ( isset( $q['meta_type'] ) ) {
+ $meta_type = $this->meta_query->get_cast_for_type( $q['meta_type'] );
+ $orderby = "CAST($wpdb->postmeta.meta_value AS {$meta_type})";
+ } else {
+ $orderby = "$wpdb->postmeta.meta_value";
+ }
break;
case 'meta_value_num':
$orderby = "$wpdb->postmeta.meta_value+0";
@@ -2410,6 +2626,25 @@ class WP_Query {
$orderby .= " {$q['order']}";
}
+ // Order search results by relevance only when another "orderby" is not specified in the query.
+ if ( ! empty( $q['s'] ) ) {
+ $search_orderby = '';
+ if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) )
+ $search_orderby = $this->parse_search_order( $q );
+
+ /**
+ * Filter the ORDER BY used when ordering search results.
+ *
+ * @since 3.7.0
+ *
+ * @param string $search_orderby The ORDER BY clause.
+ * @param WP_Query $this The current WP_Query instance.
+ */
+ $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this );
+ if ( $search_orderby )
+ $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby;
+ }
+
if ( is_array( $post_type ) && count( $post_type ) > 1 ) {
$post_type_cap = 'multiple_post_type';
} else {
@@ -2422,7 +2657,9 @@ class WP_Query {
if ( 'any' == $post_type ) {
$in_search_post_types = get_post_types( array('exclude_from_search' => false) );
- if ( ! empty( $in_search_post_types ) )
+ if ( empty( $in_search_post_types ) )
+ $where .= ' AND 1=0 ';
+ else
$where .= " AND $wpdb->posts.post_type IN ('" . join("', '", $in_search_post_types ) . "')";
} elseif ( !empty( $post_type ) && is_array( $post_type ) ) {
$where .= " AND $wpdb->posts.post_type IN ('" . join("', '", $post_type) . "')";
@@ -2451,6 +2688,8 @@ class WP_Query {
$read_private_cap = 'read_private_' . $post_type_cap . 's';
}
+ $user_id = get_current_user_id();
+
if ( ! empty( $q['post_status'] ) ) {
$statuswheres = array();
$q_status = $q['post_status'];
@@ -2483,13 +2722,13 @@ class WP_Query {
}
if ( !empty($r_status) ) {
if ( !empty($q['perm'] ) && 'editable' == $q['perm'] && !current_user_can($edit_others_cap) )
- $statuswheres[] = "($wpdb->posts.post_author = $user_ID " . "AND (" . join( ' OR ', $r_status ) . "))";
+ $statuswheres[] = "($wpdb->posts.post_author = $user_id " . "AND (" . join( ' OR ', $r_status ) . "))";
else
$statuswheres[] = "(" . join( ' OR ', $r_status ) . ")";
}
if ( !empty($p_status) ) {
if ( !empty($q['perm'] ) && 'readable' == $q['perm'] && !current_user_can($read_private_cap) )
- $statuswheres[] = "($wpdb->posts.post_author = $user_ID " . "AND (" . join( ' OR ', $p_status ) . "))";
+ $statuswheres[] = "($wpdb->posts.post_author = $user_id " . "AND (" . join( ' OR ', $p_status ) . "))";
else
$statuswheres[] = "(" . join( ' OR ', $p_status ) . ")";
}
@@ -2522,7 +2761,7 @@ class WP_Query {
// Add private states that are limited to viewing by the author of a post or someone who has caps to read private states.
$private_states = get_post_stati( array('private' => true) );
foreach ( (array) $private_states as $state )
- $where .= current_user_can( $read_private_cap ) ? " OR $wpdb->posts.post_status = '$state'" : " OR $wpdb->posts.post_author = $user_ID AND $wpdb->posts.post_status = '$state'";
+ $where .= current_user_can( $read_private_cap ) ? " OR $wpdb->posts.post_status = '$state'" : " OR $wpdb->posts.post_author = $user_id AND $wpdb->posts.post_status = '$state'";
}
$where .= ')';
@@ -3026,7 +3265,10 @@ class WP_Query {
_make_cat_compat( $this->queried_object );
}
} elseif ( $this->is_post_type_archive ) {
- $this->queried_object = get_post_type_object( $this->get('post_type') );
+ $post_type = $this->get( 'post_type' );
+ if ( is_array( $post_type ) )
+ $post_type = reset( $post_type );
+ $this->queried_object = get_post_type_object( $post_type );
} elseif ( $this->is_posts_page ) {
$page_for_posts = get_option('page_for_posts');
$this->queried_object = get_post( $page_for_posts );
@@ -3099,10 +3341,13 @@ class WP_Query {
* @return bool
*/
function is_post_type_archive( $post_types = '' ) {
- if ( empty( $post_types ) || !$this->is_post_type_archive )
+ if ( empty( $post_types ) || ! $this->is_post_type_archive )
return (bool) $this->is_post_type_archive;
- $post_type_object = $this->get_queried_object();
+ $post_type = $this->get( 'post_type' );
+ if ( is_array( $post_type ) )
+ $post_type = reset( $post_type );
+ $post_type_object = get_post_type_object( $post_type );
return in_array( $post_type_object->name, (array) $post_types );
}
@@ -3190,21 +3435,25 @@ class WP_Query {
*
* @since 3.1.0
*
- * @param mixed $slug Optional. Tag slug or array of slugs.
+ * @param mixed $tag Optional. Tag ID, name, slug, or array of Tag IDs, names, and slugs.
* @return bool
*/
- function is_tag( $slug = '' ) {
- if ( !$this->is_tag )
+ function is_tag( $tag = '' ) {
+ if ( ! $this->is_tag )
return false;
- if ( empty( $slug ) )
+ if ( empty( $tag ) )
return true;
$tag_obj = $this->get_queried_object();
- $slug = (array) $slug;
+ $tag = (array) $tag;
- if ( in_array( $tag_obj->slug, $slug ) )
+ if ( in_array( $tag_obj->term_id, $tag ) )
+ return true;
+ elseif ( in_array( $tag_obj->name, $tag ) )
+ return true;
+ elseif ( in_array( $tag_obj->slug, $tag ) )
return true;
return false;
@@ -3568,6 +3817,21 @@ class WP_Query {
global $wp_the_query;
return $wp_the_query === $this;
}
+
+ /**
+ * After looping through a nested query, this function
+ * restores the $post global to the current post in this query.
+ *
+ * @since 3.7.0
+ *
+ * @return bool
+ */
+ function reset_postdata() {
+ if ( ! empty( $this->post ) ) {
+ $GLOBALS['post'] = $this->post;
+ setup_postdata( $this->post );
+ }
+ }
}
/**