WordPress.org

Make WordPress Core

Ticket #35983: 35983.diff

File 35983.diff, 11.9 KB (added by dd32, 4 years ago)
  • wp-includes/class-wp-rewrite.php

    class WP_Rewrite { 
    900900
    901901                /*
    902902                 * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom
    903903                 * and <permalink>/atom are both possible
    904904                 */
    905905                $feedregex = $this->feed_base . '/' . $feedregex2;
    906906
    907907                // Build a regex to match the trackback and page/xx parts of URLs.
    908908                $trackbackregex = 'trackback/?$';
    909909                $pageregex = $this->pagination_base . '/?([0-9]{1,})/?$';
    910910                $commentregex = $this->comments_pagination_base . '-([0-9]{1,})/?$';
    911911                $embedregex = 'embed/?$';
    912912
    913913                // Build up an array of endpoint regexes to append => queries to append.
    914914                if ( $endpoints ) {
    915                         $ep_query_append = array ();
    916                         foreach ( (array) $this->endpoints as $endpoint) {
    917                                 // Match everything after the endpoint name, but allow for nothing to appear there.
    918                                 $epmatch = $endpoint[1] . '(/(.*))?/?$';
     915                        $ep_query_append = array();
     916                        foreach ( (array) $this->endpoints as $endpoint ) {
     917                                if ( $endpoint['with_parameter'] ) {
     918                                        // Match everything after the endpoint name, but allow for nothing to appear there.
     919                                        $endpoint['regex'] = $endpoint['name'] . '(/(.*))?/?$';
     920                                        // Capture the inner group
     921                                        $endpoint['regex_capture_offset'] = 2;
     922                                } else {
     923                                        // Match the endpoint itself
     924                                        $endpoint['regex'] = '(' . $endpoint['name'] . ')/?$';
     925                                        $endpoint['regex_capture_offset'] = 1;
     926                                }
    919927
    920928                                // This will be appended on to the rest of the query for each dir.
    921                                 $epquery = '&' . $endpoint[2] . '=';
    922                                 $ep_query_append[$epmatch] = array ( $endpoint[0], $epquery );
     929                                $endpoint['query'] = '&' . $endpoint['query_var'] . '=';
     930
     931                                $ep_query_append[] = $endpoint;
    923932                        }
    924933                }
    925934
    926935                // Get everything up to the first rewrite tag.
    927936                $front = substr($permalink_structure, 0, strpos($permalink_structure, '%'));
    928937
    929938                // Build an array of the tags (note that said array ends up being in $tokens[0]).
    930939                preg_match_all('/%.+?%/', $permalink_structure, $tokens);
    931940
    932941                $num_tokens = count($tokens[0]);
    933942
    934943                $index = $this->index; //probably 'index.php'
    935944                $feedindex = $index;
    936945                $trackbackindex = $index;
    937946                $embedindex = $index;
    class WP_Rewrite { 
    10421051
    10431052                        //...and /page/xx ones
    10441053                        if ( $paged ) {
    10451054                                $rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) );
    10461055                        }
    10471056
    10481057                        // Only on pages with comments add ../comment-page-xx/.
    10491058                        if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) {
    10501059                                $rewrite = array_merge($rewrite, array($commentmatch => $commentquery));
    10511060                        } elseif ( EP_ROOT & $ep_mask && get_option('page_on_front') ) {
    10521061                                $rewrite = array_merge($rewrite, array($rootcommentmatch => $rootcommentquery));
    10531062                        }
    10541063
    10551064                        // Do endpoints.
    10561065                        if ( $endpoints ) {
    1057                                 foreach ( (array) $ep_query_append as $regex => $ep) {
     1066                                foreach ( (array) $ep_query_append as $endpoint ) {
    10581067                                        // Add the endpoints on if the mask fits.
    1059                                         if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific )
    1060                                                 $rewrite[$match . $regex] = $index . '?' . $query . $ep[1] . $this->preg_index($num_toks + 2);
     1068                                        if ( $endpoint['mask'] & $ep_mask || $endpoint['mask'] & $ep_mask_specific  ) {;
     1069                                                $rewrite[ $match . $endpoint['regex'] ] = $index . '?' . $query . $endpoint['query'] . $this->preg_index( $num_toks + $endpoint['regex_capture_offset'] );
     1070                                        }
    10611071                                }
    10621072                        }
    10631073
    10641074                        // If we've got some tags in this dir.
    10651075                        if ( $num_toks ) {
    10661076                                $post = false;
    10671077                                $page = false;
    10681078
    10691079                                /*
    10701080                                 * Check to see if this dir is permalink-level: i.e. the structure specifies an
    10711081                                 * individual post. Do this by checking it contains at least one of 1) post name,
    10721082                                 * 2) post ID, 3) page name, 4) timestamp (year, month, day, hour, second and
    10731083                                 * minute all present). Set these flags now as we need them for the endpoints.
    10741084                                 */
    10751085                                if ( strpos($struct, '%postname%') !== false
    class WP_Rewrite { 
    11471157                                        // And <permalink>/comment-page-xx
    11481158                                        $sub2comment = $sub2 . $commentregex;
    11491159
    11501160                                        // And <permalink>/embed/...
    11511161                                        $sub2embed = $sub2 . $embedregex;
    11521162
    11531163                                        // Create queries for these extra tag-ons we've just dealt with.
    11541164                                        $subquery = $index . '?attachment=' . $this->preg_index(1);
    11551165                                        $subtbquery = $subquery . '&tb=1';
    11561166                                        $subfeedquery = $subquery . '&feed=' . $this->preg_index(2);
    11571167                                        $subcommentquery = $subquery . '&cpage=' . $this->preg_index(2);
    11581168                                        $subembedquery = $subquery . '&embed=true';
    11591169
    11601170                                        // Do endpoints for attachments.
    11611171                                        if ( !empty($endpoints) ) {
    1162                                                 foreach ( (array) $ep_query_append as $regex => $ep ) {
    1163                                                         if ( $ep[0] & EP_ATTACHMENT ) {
    1164                                                                 $rewrite[$sub1 . $regex] = $subquery . $ep[1] . $this->preg_index(3);
    1165                                                                 $rewrite[$sub2 . $regex] = $subquery . $ep[1] . $this->preg_index(3);
     1172                                                foreach ( (array) $ep_query_append as $endpoint ) {
     1173                                                        if ( $endpoint['mask'] & EP_ATTACHMENT ) {;
     1174                                                                $rewrite[ $sub1 . $endpoint['regex'] ] = $subquery . $endpoint['query'] . $this->preg_index( 1 + $endpoint['regex_capture_offset'] );
     1175                                                                $rewrite[ $sub2 . $endpoint['regex'] ] = $subquery . $endpoint['query'] . $this->preg_index( 1 + $endpoint['regex_capture_offset'] );
    11661176                                                        }
    11671177                                                }
    11681178                                        }
    11691179
    11701180                                        /*
    11711181                                         * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches
    11721182                                         * add a ? as we don't have to match that last slash, and finally a $ so we
    11731183                                         * match to the end of the URL
    11741184                                         */
    11751185                                        $sub1 .= '?$';
    11761186                                        $sub2 .= '?$';
    11771187
    11781188                                        /*
    11791189                                         * Post pagination, e.g. <permalink>/2/
    11801190                                         * Previously: '(/[0-9]+)?/?$', which produced '/2' for page.
    class WP_Rewrite { 
    16651675         * @since 2.1.0
    16661676         * @access public
    16671677         *
    16681678         * @param string $regex Regular expression to match request against.
    16691679         * @param string $query The corresponding query vars for this rewrite rule.
    16701680         */
    16711681        public function add_external_rule( $regex, $query ) {
    16721682                $this->non_wp_rules[ $regex ] = $query;
    16731683        }
    16741684
    16751685        /**
    16761686         * Adds an endpoint, like /trackback/.
    16771687         *
    16781688         * @since 2.1.0
    16791689         * @since 3.9.0 $query_var parameter added.
    1680          * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`.
     1690         * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$args[query_var]`.
     1691         * @since 4.x.0 Added support for registering a self-matching endpoint by passing `false` to `$args[with_parameter]`.
    16811692         * @access public
    16821693         *
    16831694         * @see add_rewrite_endpoint() for full documentation.
    16841695         * @global WP $wp
    16851696         *
    16861697         * @param string      $name      Name of the endpoint.
    16871698         * @param int         $places    Endpoint mask describing the places the endpoint should be added.
    1688          * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to
    1689          *                               skip registering a query_var for this endpoint. Defaults to the
    1690          *                               value of `$name`.
     1699         * @param array {
     1700         *   @type string|bool $query_var      Optional. Name of the corresponding query variable. Pass `false`
     1701         *                                     to skip registering a query_var for this endpoint. Defaults to the
     1702         *                                     value of `$name`.
     1703         *   @type bool        $with_parameter Optional. Specifies if the endpoint is self-matching or matching
     1704         *                                     a parameter. Pass false to match the endpoint name. Defaults to true.
     1705         * }
     1706         *
    16911707         */
    1692         public function add_endpoint( $name, $places, $query_var = true ) {
     1708        public function add_endpoint( $name, $places, $args = true ) {
    16931709                global $wp;
    16941710
    1695                 // For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`.
    1696                 if ( true === $query_var || null === func_get_arg( 2 ) ) {
    1697                         $query_var = $name;
     1711                $defaults = array(
     1712                        'query_var'      => $name,
     1713                        'with_parameter' => true,
     1714                );
     1715
     1716                if ( ! is_array( $args ) ) {
     1717                        // For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`.
     1718                        if ( true === $args || null === func_get_arg( 2 ) ) {
     1719                                $args = array( 'query_var' => $name );
     1720                        } elseif ( $args ) {
     1721                                $args = array( 'query_var' => $args );
     1722                        } else {
     1723                                $args = array();
     1724                        }
    16981725                }
    1699                 $this->endpoints[] = array( $places, $name, $query_var );
     1726                $args = wp_parse_args( $args, $defaults );
     1727
     1728                $args['name'] = $name;
     1729                $args['mask'] = $places;
     1730
     1731                $this->endpoints[] = $args;
    17001732
    1701                 if ( $query_var ) {
    1702                         $wp->add_query_var( $query_var );
     1733                if ( $args['query_var'] ) {
     1734                        $wp->add_query_var( $args['query_var'] );
    17031735                }
    17041736        }
    17051737
    17061738        /**
    17071739         * Adds a new permalink structure.
    17081740         *
    17091741         * A permalink structure (permastruct) is an abstract definition of a set of rewrite rules;
    17101742         * it is an easy way of expressing a set of regular expressions that rewrite to a set of
    17111743         * query strings. The new permastruct is added to the WP_Rewrite::$extra_permastructs array.
    17121744         *
    17131745         * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra
    17141746         * permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them
    17151747         * into the regular expressions that many love to hate.
    17161748         *
    17171749         * The `$args` parameter gives you control over how WP_Rewrite::generate_rewrite_rules()
  • wp-includes/rewrite.php

    function flush_rewrite_rules( $hard = tr 
    284284 * will add a new rewrite rule ending with "json(/(.*))?/?$" for every permastruct
    285285 * that describes a permalink (post) or page. This is rewritten to "json=$match"
    286286 * where $match is the part of the URL matched by the endpoint regex (e.g. "foo" in
    287287 * "[permalink]/json/foo/").
    288288 *
    289289 * A new query var with the same name as the endpoint will also be created.
    290290 *
    291291 * When specifying $places ensure that you are using the EP_* constants (or a
    292292 * combination of them using the bitwise OR operator) as their values are not
    293293 * guaranteed to remain static (especially `EP_ALL`).
    294294 *
    295295 * Be sure to flush the rewrite rules - see flush_rewrite_rules() - when your plugin gets
    296296 * activated and deactivated.
    297297 *
    298298 * @since 2.1.0
    299  * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`.
     299 * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$args[query_var]`.
     300 * @since 4.x.0 Added support for registering a self-matching endpoint by passing `false` to `$args[with_parameter]`.
    300301 *
    301302 * @global WP_Rewrite $wp_rewrite
    302303 *
    303304 * @param string      $name      Name of the endpoint.
    304305 * @param int         $places    Endpoint mask describing the places the endpoint should be added.
    305  * @param string|bool $query_var Name of the corresponding query variable. Pass `false` to skip registering a query_var
    306  *                               for this endpoint. Defaults to the value of `$name`.
     306 * @param array {
     307 *   @type string|bool $query_var      Optional. Name of the corresponding query variable. Pass `false`
     308 *                                     to skip registering a query_var for this endpoint. Defaults to the
     309 *                                     value of `$name`.
     310 *   @type bool        $with_parameter Optional. Specifies if the endpoint is self-matching or matching
     311 *                                     a parameter. Pass false to match the endpoint name. Defaults to true.
     312 * }
    307313 */
    308 function add_rewrite_endpoint( $name, $places, $query_var = true ) {
     314function add_rewrite_endpoint( $name, $places, $args = array() ) {
    309315        global $wp_rewrite;
    310         $wp_rewrite->add_endpoint( $name, $places, $query_var );
     316        $wp_rewrite->add_endpoint( $name, $places, $args );
    311317}
    312318
    313319/**
    314320 * Filter the URL base for taxonomies.
    315321 *
    316322 * To remove any manually prepended /index.php/.
    317323 *
    318324 * @access private
    319325 * @since 2.6.0
    320326 *
    321327 * @param string $base The taxonomy base that we're going to filter
    322328 * @return string
    323329 */
    324330function _wp_filter_taxonomy_base( $base ) {
    325331        if ( !empty( $base ) ) {