Parse the meta query again if query vars change. Set a global query_vars_changed flag instead of doing multiple hash creation calls. Props greuben. see #16742 for trunk
git-svn-id: http://svn.automattic.com/wordpress/trunk@17552 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
0e08826bbd
commit
1853efd70a
|
@ -1239,6 +1239,15 @@ class WP_Query {
|
||||||
*/
|
*/
|
||||||
var $query_vars_hash = false;
|
var $query_vars_hash = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made
|
||||||
|
* via pre_get_posts hooks.
|
||||||
|
*
|
||||||
|
* @since 3.1.1
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $query_vars_changed = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets query flags to false.
|
* Resets query flags to false.
|
||||||
*
|
*
|
||||||
|
@ -1395,6 +1404,7 @@ class WP_Query {
|
||||||
|
|
||||||
$this->query_vars = $this->fill_query_vars($this->query_vars);
|
$this->query_vars = $this->fill_query_vars($this->query_vars);
|
||||||
$qv = &$this->query_vars;
|
$qv = &$this->query_vars;
|
||||||
|
$this->query_vars_changed = true;
|
||||||
|
|
||||||
if ( ! empty($qv['robots']) )
|
if ( ! empty($qv['robots']) )
|
||||||
$this->is_robots = true;
|
$this->is_robots = true;
|
||||||
|
@ -1627,6 +1637,9 @@ class WP_Query {
|
||||||
if ( '404' == $qv['error'] )
|
if ( '404' == $qv['error'] )
|
||||||
$this->set_404();
|
$this->set_404();
|
||||||
|
|
||||||
|
$this->query_vars_hash = md5( serialize( $this->query_vars ) );
|
||||||
|
$this->query_vars_changed = false;
|
||||||
|
|
||||||
do_action_ref_array('parse_query', array(&$this));
|
do_action_ref_array('parse_query', array(&$this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1685,7 +1698,7 @@ class WP_Query {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Category stuff
|
// Category stuff
|
||||||
if ( !empty($q['cat']) && '0' != $q['cat'] && !$this->is_singular && md5(serialize( $this->query_vars ) ) != $this->query_vars_hash ) {
|
if ( !empty($q['cat']) && '0' != $q['cat'] && !$this->is_singular && $this->query_vars_changed ) {
|
||||||
$q['cat'] = ''.urldecode($q['cat']).'';
|
$q['cat'] = ''.urldecode($q['cat']).'';
|
||||||
$q['cat'] = addslashes_gpc($q['cat']);
|
$q['cat'] = addslashes_gpc($q['cat']);
|
||||||
$cat_array = preg_split('/[,\s]+/', $q['cat']);
|
$cat_array = preg_split('/[,\s]+/', $q['cat']);
|
||||||
|
@ -1739,7 +1752,7 @@ class WP_Query {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tag stuff
|
// Tag stuff
|
||||||
if ( '' != $q['tag'] && !$this->is_singular && md5(serialize( $this->query_vars ) ) != $this->query_vars_hash ) {
|
if ( '' != $q['tag'] && !$this->is_singular && $this->query_vars_changed ) {
|
||||||
if ( strpos($q['tag'], ',') !== false ) {
|
if ( strpos($q['tag'], ',') !== false ) {
|
||||||
$tags = preg_split('/[,\s]+/', $q['tag']);
|
$tags = preg_split('/[,\s]+/', $q['tag']);
|
||||||
foreach ( (array) $tags as $tag ) {
|
foreach ( (array) $tags as $tag ) {
|
||||||
|
@ -1811,8 +1824,6 @@ class WP_Query {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->query_vars_hash = md5(serialize( $this->query_vars ) );
|
|
||||||
|
|
||||||
$this->tax_query = new WP_Tax_Query( $tax_query );
|
$this->tax_query = new WP_Tax_Query( $tax_query );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1882,8 +1893,17 @@ class WP_Query {
|
||||||
// Shorthand.
|
// Shorthand.
|
||||||
$q = &$this->query_vars;
|
$q = &$this->query_vars;
|
||||||
|
|
||||||
|
// Fill again in case pre_get_posts unset some vars.
|
||||||
$q = $this->fill_query_vars($q);
|
$q = $this->fill_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 ) {
|
||||||
|
$this->query_vars_changed = true;
|
||||||
|
$this->query_vars_hash = $hash;
|
||||||
|
}
|
||||||
|
unset($hash);
|
||||||
|
|
||||||
// First let's clear some variables
|
// First let's clear some variables
|
||||||
$distinct = '';
|
$distinct = '';
|
||||||
$whichauthor = '';
|
$whichauthor = '';
|
||||||
|
@ -2444,6 +2464,16 @@ class WP_Query {
|
||||||
$where .= ')';
|
$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'] ) ) {
|
if ( !empty( $q['meta_query'] ) ) {
|
||||||
$clauses = call_user_func_array( '_get_meta_sql', array( $q['meta_query'], 'post', $wpdb->posts, 'ID', &$this) );
|
$clauses = call_user_func_array( '_get_meta_sql', array( $q['meta_query'], 'post', $wpdb->posts, 'ID', &$this) );
|
||||||
$join .= $clauses['join'];
|
$join .= $clauses['join'];
|
||||||
|
|
Loading…
Reference in New Issue