Make WordPress Core

Changeset 15795


Ignore:
Timestamp:
10/13/2010 04:37:01 PM (16 years ago)
Author:
scribu
Message:

Sacrifice DRY for readability in WP_Query. Props nacin for initial patch. See #14997

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/query.php

    r15794 r15795  
    21842184                $orderby = $q['orderby'];
    21852185
     2186                $pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' );
     2187
    21862188                // Apply post-paging filters on where and join.  Only plugins that
    21872189                // manipulate paging queries should use these hooks.
    21882190                if ( !$q['suppress_filters'] ) {
    2189                         $var_config = array(
    2190                                 'where'    => 'posts_where_paged',
    2191                                 'groupby'  => 'posts_groupby',
    2192                                 'join'     => 'posts_join_paged',
    2193                                 'orderby'  => 'posts_orderby',
    2194                                 'distinct' => 'posts_distinct',
    2195                                 'limits'   => 'post_limits',
    2196                                 'fields'   => 'posts_fields',
    2197                         );
    2198                         $var_values = compact( array_keys( $var_config ) );
    2199                         $result = $this->_filter_clause_variables( $var_config, $var_values, 'posts_clauses' );
    2200                         extract( $result );
     2191                        $where          = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) );
     2192                        $groupby        = apply_filters_ref_array( 'posts_groupby',             array( $groupby, &$this ) );
     2193                        $join           = apply_filters_ref_array( 'posts_join_paged',  array( $join, &$this ) );
     2194                        $orderby        = apply_filters_ref_array( 'posts_orderby',             array( $orderby, &$this ) );
     2195                        $distinct       = apply_filters_ref_array( 'posts_distinct',    array( $distinct, &$this ) );
     2196                        $limits         = apply_filters_ref_array( 'post_limits',               array( $limits, &$this ) );
     2197                        $fields         = apply_filters_ref_array( 'posts_fields',              array( $fields, &$this ) );
     2198
     2199                        // Filter all clauses at once, for convenience
     2200                        $clauses = apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) );
     2201                        foreach ( $pieces as $piece )
     2202                                $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
    22012203                }
    22022204
     
    22062208                // Filter again for the benefit of caching plugins.  Regular plugins should use the hooks above.
    22072209                if ( !$q['suppress_filters'] ) {
    2208                         $var_config = array(
    2209                                 'where'    => 'posts_where_request',
    2210                                 'groupby'  => 'posts_groupby_request',
    2211                                 'join'     => 'posts_join_request',
    2212                                 'orderby'  => 'posts_orderby_request',
    2213                                 'distinct' => 'posts_distinct_request',
    2214                                 'fields'   => 'posts_fields_request',
    2215                                 'limits'   => 'post_limits_request',
    2216                         );
    2217                         $var_values = compact( array_keys( $var_config ) );
    2218                         $result = $this->_filter_clause_variables( $var_config, $var_values, 'posts_clauses_request' );
    2219                         extract( $result );
     2210                        $where          = apply_filters_ref_array( 'posts_where_request',               array( $where, &$this ) );
     2211                        $groupby        = apply_filters_ref_array( 'posts_groupby_request',             array( $groupby, &$this ) );
     2212                        $join           = apply_filters_ref_array( 'posts_join_request',                array( $join, &$this ) );
     2213                        $orderby        = apply_filters_ref_array( 'posts_orderby_request',             array( $orderby, &$this ) );
     2214                        $distinct       = apply_filters_ref_array( 'posts_distinct_request',    array( $distinct, &$this ) );
     2215                        $fields         = apply_filters_ref_array( 'posts_fields_request',              array( $fields, &$this ) );
     2216                        $limits         = apply_filters_ref_array( 'post_limits_request',               array( $limits, &$this ) );
     2217
     2218                        // Filter all clauses at once, for convenience
     2219                        $clauses = apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) );
     2220                        foreach ( $pieces as $piece )
     2221                                $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
    22202222                }
    22212223
     
    23582360                return $this->posts;
    23592361        }
    2360        
    2361         /**
    2362          * Filter clause variables based on configuration. Once per clause and
    2363          * then all clauses at once.
    2364          *
    2365          * @access private
    2366          * @param array $config filternames keyed with their variable names
    2367          * @param array $values values keyed with their variable names
    2368          * @param string $all_filter_name for the "single filter"
    2369          * @return array filtered values keyed with their names
    2370          */
    2371         function _filter_clause_variables( $config, $values, $all_filter_name ) {
    2372                 $clauses = array();
    2373                 foreach ( $config as $variable_name => $filter ) {
    2374                         $clauses[$variable_name] = apply_filters_ref_array( $filter, array( $values[$variable_name], &$this ) );
    2375                 }
    2376                 // run filter for all clauses at once
    2377                 $clauses = apply_filters_ref_array( $all_filter_name, array( $clauses, &$this ) );
    2378                 $is_array = is_array( $clauses );
    2379                 $filtered = array();
    2380                 foreach ( $config as $variable_name => $filter ) {
    2381                         if ( $is_array && isset( $clauses[$variable_name] ) ) {
    2382                                 $filtered[$variable_name] = $clauses[$variable_name];
    2383                         } else {
    2384                                 $filtered[$variable_name] = '';
    2385                         }
    2386                 }
    2387                 return $filtered;
    2388         }
    23892362
    23902363        /**
Note: See TracChangeset for help on using the changeset viewer.