WordPress.org

Make WordPress Core

Ticket #12405: 12405.diff

File 12405.diff, 3.7 KB (added by mdawaffe, 8 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