WordPress.org

Make WordPress Core

Ticket #12405: 12405.diff

File 12405.diff, 3.7 KB (added by mdawaffe, 5 years ago)
  • wp-includes/classes.php

     
    193193                                $request = $req_uri; 
    194194                        } 
    195195 
     196                        if ( false !== strpos( $wp_rewrite->permalink_structure, '?' ) && !empty( $_SERVER['QUERY_STRING'] ) ) { 
     197                                list( $qs ) = explode( '&', $_SERVER['QUERY_STRING'], 2 ); // only want the first piece 
     198                                if ( false === strpos( $qs, '=' ) ) { // otherwise it's some non-permalink query arg 
     199                                        $request_no_qs = $request; 
     200                                        $request .= '?' . $qs; 
     201                                } 
     202                        } else { 
     203                                $request_no_qs = false; 
     204                        } 
     205 
    196206                        $this->request = $request; 
     207                        $fallback = false; 
     208                        $fallback_query = false; 
    197209 
    198210                        // Look for matches. 
    199211                        $request_match = $request; 
     212                        $request_match_no_qs = $request_no_qs; 
     213 
    200214                        foreach ( (array) $rewrite as $match => $query) { 
     215                                $match = preg_replace( '#\[\^([^\]])+\]#', '[^\\1?]', $match ); 
     216                                $match = str_replace( array( '.*', '.+' ), array( '[^?]*', '[^?]+' ), $match ); 
    201217                                // Don't try to match against AtomPub calls 
    202218                                if ( $req_uri == 'wp-app.php' ) 
    203219                                        break; 
    204220 
    205221                                // If the requesting file is the anchor of the match, prepend it 
    206222                                // to the path info. 
    207                                 if ( (! empty($req_uri)) && (strpos($match, $req_uri) === 0) && ($req_uri != $request) ) 
     223                                if ( (! empty($req_uri)) && (strpos($match, $req_uri) === 0) && ($req_uri != $request) ) { 
    208224                                        $request_match = $req_uri . '/' . $request; 
     225                                        if ( $request_match_no_qs ) 
     226                                                $request_match_no_qs = $req_uri . '/' . $request_no_qs; 
     227                                } 
    209228 
    210229                                if ( preg_match("#^$match#", $request_match, $matches) || 
    211230                                        preg_match("#^$match#", urldecode($request_match), $matches) ) { 
    212231                                        // Got a match. 
    213232                                        $this->matched_rule = $match; 
     233                                        break; 
     234                                } elseif ( $request_match_no_qs && !$fallback && ( preg_match("#^$match#", $request_match, $matches) || 
     235                                        preg_match("#^$match#", urldecode($request_match), $matches) ) ) { 
     236                                        // Got a match, but there might be a better one in the other branch 
     237                                        $fallback = $match; 
     238                                        $fallback_query = $query; 
     239                                        continue; 
     240                                } 
     241                        } 
    214242 
    215                                         // Trim the query of everything up to the '?'. 
    216                                         $query = preg_replace("!^.+\?!", '', $query); 
     243                        if ( !$this->matched_rule && $fallback ) { // 2nd branch had the only match 
     244                                $this->matched_rule = $fallback; 
     245                                $query = $fallback_query; 
     246                        } 
    217247 
    218                                         // Substitute the substring matches into the query. 
    219                                         $query = addslashes(WP_MatchesMapRegex::apply($query, $matches)); 
     248                        if ( $this->matched_rule ) { 
     249                                // Trim the query of everything up to the '?'. 
     250                                $query = preg_replace("!^.+\?!", '', $query); 
    220251 
    221                                         $this->matched_query = $query; 
     252                                // Substitute the substring matches into the query. 
     253                                $query = addslashes(WP_MatchesMapRegex::apply($query, $matches)); 
    222254 
    223                                         // Parse the query. 
    224                                         parse_str($query, $perma_query_vars); 
     255                                $this->matched_query = $query; 
    225256 
    226                                         // If we're processing a 404 request, clear the error var 
    227                                         // since we found something. 
    228                                         if ( isset($_GET['error']) ) 
    229                                                 unset($_GET['error']); 
     257                                // Parse the query. 
     258                                parse_str($query, $perma_query_vars); 
    230259 
    231                                         if ( isset($error) ) 
    232                                                 unset($error); 
     260                                // If we're processing a 404 request, clear the error var 
     261                                // since we found something. 
     262                                if ( isset($_GET['error']) ) 
     263                                        unset($_GET['error']); 
    233264 
    234                                         break; 
    235                                 } 
     265                                if ( isset($error) ) 
     266                                        unset($error); 
    236267                        } 
    237268 
    238269                        // If req_uri is empty or if it is a request for ourself, unset error. 
    239                         if ( empty($request) || $req_uri == $self || strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) { 
     270                        if ( empty($request_no_qs) || $req_uri == $self || strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) { 
    240271                                if ( isset($_GET['error']) ) 
    241272                                        unset($_GET['error']); 
    242273