WordPress.org

Make WordPress Core


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.1/wp-includes/query.php

    r17456 r17553  
    12321232
    12331233    /**
    1234      * Whether the tax query has been parsed once.
     1234     * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know
     1235     * whether we have to re-parse because something has changed
    12351236     *
    12361237     * @since 3.1.0
    12371238     * @access private
    1238      * @var bool
    1239      */
    1240     var $parsed_tax_query = false;
     1239     */
     1240    var $query_vars_hash = false;
     1241
     1242    /**
     1243     * Whether query vars have changed since the initial parse_query() call.  Used to catch modifications to query vars made
     1244     * via pre_get_posts hooks.
     1245     *
     1246     * @since 3.1.1
     1247     * @access private
     1248     */
     1249    var $query_vars_changed = true;
    12411250
    12421251    /**
     
    13961405        $this->query_vars = $this->fill_query_vars($this->query_vars);
    13971406        $qv = &$this->query_vars;
     1407        $this->query_vars_changed = true;
    13981408
    13991409        if ( ! empty($qv['robots']) )
     
    14971507            }
    14981508
    1499             $this->parsed_tax_query = false;
     1509            $this->query_vars_hash = false;
    15001510            $this->parse_tax_query( $qv );
    15011511
     
    16281638            $this->set_404();
    16291639
     1640        $this->query_vars_hash = md5( serialize( $this->query_vars ) );
     1641        $this->query_vars_changed = false;
     1642
    16301643        do_action_ref_array('parse_query', array(&$this));
    16311644    }
     
    16551668
    16561669        foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
     1670            if ( 'post_tag' == $taxonomy )
     1671                continue;   // Handled further down in the $q['tag'] block
     1672
    16571673            if ( $t->query_var && !empty( $q[$t->query_var] ) ) {
    16581674                $tax_query_defaults = array(
     
    16831699
    16841700        // Category stuff
    1685         if ( !empty($q['cat']) && '0' != $q['cat'] && !$this->is_singular && !$this->parsed_tax_query ) {
     1701        if ( !empty($q['cat']) && '0' != $q['cat'] && !$this->is_singular && $this->query_vars_changed ) {
    16861702            $q['cat'] = ''.urldecode($q['cat']).'';
    16871703            $q['cat'] = addslashes_gpc($q['cat']);
     
    17371753
    17381754        // Tag stuff
    1739         if ( '' != $q['tag'] && !$this->is_singular && !$this->parsed_tax_query ) {
     1755        if ( '' != $q['tag'] && !$this->is_singular && $this->query_vars_changed ) {
    17401756            if ( strpos($q['tag'], ',') !== false ) {
    17411757                $tags = preg_split('/[,\s]+/', $q['tag']);
     
    17911807
    17921808        if ( !empty($q['tag_slug__in']) ) {
    1793             $q['tag_slug__in'] = array_map('sanitize_title', (array) $q['tag_slug__in']);
     1809            $q['tag_slug__in'] = array_map('sanitize_title', array_unique( (array) $q['tag_slug__in'] ) );
    17941810            $tax_query[] = array(
    17951811                'taxonomy' => 'post_tag',
     
    18001816
    18011817        if ( !empty($q['tag_slug__and']) ) {
    1802             $q['tag_slug__and'] = array_map('sanitize_title', (array) $q['tag_slug__and']);
     1818            $q['tag_slug__and'] = array_map('sanitize_title', array_unique( (array) $q['tag_slug__and'] ) );
    18031819            $tax_query[] = array(
    18041820                'taxonomy' => 'post_tag',
     
    18091825        }
    18101826
    1811         $this->parsed_tax_query = true;
    1812 
    18131827        $this->tax_query = new WP_Tax_Query( $tax_query );
    18141828    }
     
    18801894        $q = &$this->query_vars;
    18811895
     1896        // Fill again in case pre_get_posts unset some vars.
    18821897        $q = $this->fill_query_vars($q);
     1898
     1899        // Set a flag if a pre_get_posts hook changed the query vars.
     1900        $hash = md5( serialize( $this->query_vars ) );
     1901        if ( $hash != $this->query_vars_hash ) {
     1902            $this->query_vars_changed = true;
     1903            $this->query_vars_hash = $hash;
     1904        }
     1905        unset($hash);
    18831906
    18841907        // First let's clear some variables
     
    21482171
    21492172        // Taxonomies
    2150         $this->parse_tax_query( $q );
    2151 
    2152         $clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' );
    2153 
    2154         $join .= $clauses['join'];
    2155         $where .= $clauses['where'];
     2173        if ( !$this->is_singular ) {
     2174            $this->parse_tax_query( $q );
     2175
     2176            $clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' );
     2177
     2178            $join .= $clauses['join'];
     2179            $where .= $clauses['where'];
     2180        }
    21562181
    21572182        if ( $this->is_tax ) {
     
    24382463
    24392464            $where .= ')';
     2465        }
     2466
     2467        // Parse the meta query again if query vars have changed.
     2468        if ( $this->query_vars_changed ) {
     2469            $meta_query_hash = md5( serialize( $q['meta_query'] ) );
     2470            $_meta_query = $q['meta_query'];
     2471            unset( $q['meta_query'] );
     2472            _parse_meta_query( $q );
     2473            if ( md5( serialize( $q['meta_query'] ) ) != $meta_query_hash && is_array( $_meta_query ) )
     2474                $q['meta_query'] = array_merge( $_meta_query, $q['meta_query'] );
    24402475        }
    24412476
     
    28932928                $this->queried_object = $term;
    28942929                $this->queried_object_id = (int) $term->term_id;
     2930
     2931                if ( $this->is_category )
     2932                    _make_cat_compat( $this->queried_object );
    28952933            }
    28962934        } elseif ( $this->is_post_type_archive ) {
Note: See TracChangeset for help on using the changeset viewer.