WordPress.org

Make WordPress Core

Ticket #12779: 12779.diff

File 12779.diff, 12.0 KB (added by nacin, 8 years ago)

Incomplete patch. Incomplete support. Hardly tested. Probably buggy. Probably a better way.

  • rewrite.php

     
    5454 * @param string $struct Permalink structure.
    5555 * @param bool $with_front Prepend front base to permalink structure.
    5656 */
    57 function add_permastruct( $name, $struct, $with_front = true, $ep_mask = EP_NONE ) {
     57function add_permastruct( $name, $struct, $with_front = true, $ep_mask = 'none' ) {
    5858        global $wp_rewrite;
    5959        return $wp_rewrite->add_permastruct( $name, $struct, $with_front, $ep_mask );
    6060}
     
    9393        $wp_rewrite->flush_rules( $hard );
    9494}
    9595
    96 //pseudo-places
     96// pseudo-places -- these are deprecated
     97
    9798/**
    9899 * Endpoint Mask for default, which is nothing.
    99100 *
    100101 * @since 2.1.0
     102 * @deprecated 3.0.0
    101103 */
    102104define('EP_NONE', 0);
    103105
     
    105107 * Endpoint Mask for Permalink.
    106108 *
    107109 * @since 2.1.0
     110 * @deprecated 3.0.0
    108111 */
    109112define('EP_PERMALINK', 1);
    110113
     
    112115 * Endpoint Mask for Attachment.
    113116 *
    114117 * @since 2.1.0
     118 * @deprecated 3.0.0
    115119 */
    116120define('EP_ATTACHMENT', 2);
    117121
     
    119123 * Endpoint Mask for date.
    120124 *
    121125 * @since 2.1.0
     126 * @deprecated 3.0.0
    122127 */
    123128define('EP_DATE', 4);
    124129
     
    126131 * Endpoint Mask for year
    127132 *
    128133 * @since 2.1.0
     134 * @deprecated 3.0.0
    129135 */
    130136define('EP_YEAR', 8);
    131137
     
    133139 * Endpoint Mask for month.
    134140 *
    135141 * @since 2.1.0
     142 * @deprecated 3.0.0
    136143 */
    137144define('EP_MONTH', 16);
    138145
     
    140147 * Endpoint Mask for day.
    141148 *
    142149 * @since 2.1.0
     150 * @deprecated 3.0.0
    143151 */
    144152define('EP_DAY', 32);
    145153
     
    147155 * Endpoint Mask for root.
    148156 *
    149157 * @since 2.1.0
     158 * @deprecated 3.0.0
    150159 */
    151160define('EP_ROOT', 64);
    152161
     
    154163 * Endpoint Mask for comments.
    155164 *
    156165 * @since 2.1.0
     166 * @deprecated 3.0.0
    157167 */
    158168define('EP_COMMENTS', 128);
    159169
     
    161171 * Endpoint Mask for searches.
    162172 *
    163173 * @since 2.1.0
     174 * @deprecated 3.0.0
    164175 */
    165176define('EP_SEARCH', 256);
    166177
     
    168179 * Endpoint Mask for categories.
    169180 *
    170181 * @since 2.1.0
     182 * @deprecated 3.0.0
    171183 */
    172184define('EP_CATEGORIES', 512);
    173185
     
    175187 * Endpoint Mask for tags.
    176188 *
    177189 * @since 2.3.0
     190 * @deprecated 3.0.0
    178191 */
    179192define('EP_TAGS', 1024);
    180193
     
    182195 * Endpoint Mask for authors.
    183196 *
    184197 * @since 2.1.0
     198 * @deprecated 3.0.0
    185199 */
    186200define('EP_AUTHORS', 2048);
    187201
     
    189203 * Endpoint Mask for pages.
    190204 *
    191205 * @since 2.1.0
     206 * @deprecated 3.0.0
    192207 */
    193208define('EP_PAGES', 4096);
    194209
     
    196211 * Endpoint Mask for everything.
    197212 *
    198213 * @since 2.1.0
     214 * @deprecated 3.0.0
    199215 */
    200216define('EP_ALL', 8191);
    201217
     
    712728         */
    713729        var $feeds = array ( 'feed', 'rdf', 'rss', 'rss2', 'atom' );
    714730
     731        // prolly will need one of these
     732
    715733        /**
     734         * @since 3.0.0
     735         * @access private
     736         * @var array
     737         */
     738        var $_endpoints = array( 'none', 'permalink', 'attachment', 'date', 'year', 'month', 'day',
     739                'root', 'comments', 'search', 'categories', 'tags', 'authors', 'pages' );
     740
     741        /**
     742         * @since 3.0.0
     743         * @access private
     744         * @var array
     745         */
     746        var $_bitmasks = array( 'EP_NONE' => 'none', 'EP_PERMALINK' => 'permalink', 'EP_attachment' => 'attachment',
     747                'EP_DATE' => 'date', 'EP_YEAR' => 'year', 'EP_MONTH' => 'month', 'EP_DAY' => 'day', 'EP_ROOT' => 'root',
     748                'EP_COMMENTS' => 'comments', 'EP_SEARCH' => 'search', 'EP_CATEGORIES' => 'categories', 'EP_TAGS' => 'tags',
     749                'EP_AUTHORS' => 'authors', 'EP_PAGES' => 'pages' );
     750
     751        /**
    716752         * Whether permalinks are being used.
    717753         *
    718754         * This can be either rewrite module or permalink in the HTTP query string.
     
    855891
    856892                if ( ! $this->use_verbose_page_rules ) {
    857893                        $this->add_rewrite_tag('%pagename%', "(.+?)", 'pagename=');
    858                         $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
     894                        $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, 'pages'));
    859895                        return $rewrite_rules;
    860896                }
    861897
     
    866902                if ( is_array( $attachment_uris ) ) {
    867903                        foreach ( $attachment_uris as $uri => $pagename ) {
    868904                                $this->add_rewrite_tag('%pagename%', "($uri)", 'attachment=');
    869                                 $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
     905                                $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, 'pages'));
    870906                        }
    871907                }
    872908                if ( is_array( $uris ) ) {
    873909                        foreach ( $uris as $uri => $pagename ) {
    874910                                $this->add_rewrite_tag('%pagename%', "($uri)", 'pagename=');
    875                                 $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
     911                                $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, 'pages'));
    876912                        }
    877913                }
    878914
     
    12581294         * @access public
    12591295         *
    12601296         * @param string $permalink_structure The permalink structure.
    1261          * @param int $ep_mask Optional, default is EP_NONE. Endpoint constant, see EP_* constants.
     1297         * @param int $ep_mask Optional, default is false, for none. Endpoint, see WP_Rewrite::add_endpoint().
    12621298         * @param bool $paged Optional, default is true. Whether permalink request is paged.
    12631299         * @param bool $feed Optional, default is true. Whether for feed.
    12641300         * @param bool $forcomments Optional, default is false. Whether for comments.
     
    12661302         * @param bool $endpoints Optional, default is true. Whether endpoints are enabled.
    12671303         * @return array Rewrite rule list.
    12681304         */
    1269         function generate_rewrite_rules($permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true) {
     1305        function generate_rewrite_rules($permalink_structure, $ep_mask = 'none', $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true) {
     1306                $this->_bitmasks_to_array( $ep_mask );
     1307
    12701308                //build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/?
    12711309                $feedregex2 = '';
    12721310                foreach ( (array) $this->feeds as $feed_name)
     
    13511389                        //set up $ep_mask_specific which is used to match more specific URL types
    13521390                        switch ( $dirs[$j] ) {
    13531391                                case '%year%':
    1354                                         $ep_mask_specific = EP_YEAR;
     1392                                        $ep_mask_specific = 'year';
    13551393                                        break;
    13561394                                case '%monthnum%':
    1357                                         $ep_mask_specific = EP_MONTH;
     1395                                        $ep_mask_specific = 'month';
    13581396                                        break;
    13591397                                case '%day%':
    1360                                         $ep_mask_specific = EP_DAY;
     1398                                        $ep_mask_specific = 'day';
    13611399                                        break;
    13621400                                default:
    1363                                         $ep_mask_specific = EP_NONE;
     1401                                        $ep_mask_specific = 'none';
    13641402                        }
    13651403
    13661404                        //create query for /page/xx
     
    13991437                                $rewrite = array_merge($rewrite, array($pagematch => $pagequery));
    14001438
    14011439                        //only on pages with comments add ../comment-page-xx/
    1402                         if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask || EP_NONE & $ep_mask )
     1440                        if ( array_intersect( $ep_mask, array ( 'pages', 'permalink', 'none' ) ) )
    14031441                                $rewrite = array_merge($rewrite, array($commentmatch => $commentquery));
    1404                         else if ( EP_ROOT & $ep_mask && get_option('page_on_front') )
     1442                        else if ( in_array( $ep_mask, 'root' ) && get_option('page_on_front') )
    14051443                                $rewrite = array_merge($rewrite, array($rootcommentmatch => $rootcommentquery));
    14061444
    14071445                        //do endpoints
    14081446                        if ( $endpoints ) {
    14091447                                foreach ( (array) $ep_query_append as $regex => $ep) {
    14101448                                        //add the endpoints on if the mask fits
    1411                                         if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific )
     1449                                        if ( array_intersect( $ep[0], array( $ep_mask, $ep_mask_specific ) ) )
    14121450                                                $rewrite[$match . $regex] = $index . '?' . $query . $ep[1] . $this->preg_index($num_toks + 2);
    14131451                                }
    14141452                        }
     
    14801518                                        //do endpoints for attachments
    14811519                                        if ( !empty($endpoints) ) {
    14821520                                                foreach ( (array) $ep_query_append as $regex => $ep ) {
    1483                                                         if ( $ep[0] & EP_ATTACHMENT ) {
     1521                                                        if ( in_array( 'attachment', $ep[0] ) ) {
    14841522                                                                $rewrite[$sub1 . $regex] = $subquery . $ep[1] . $this->preg_index(2);
    14851523                                                                $rewrite[$sub2 . $regex] = $subquery . $ep[1] . $this->preg_index(2);
    14861524                                                        }
     
    15381576         * @return array
    15391577         */
    15401578        function generate_rewrite_rule($permalink_structure, $walk_dirs = false) {
    1541                 return $this->generate_rewrite_rules($permalink_structure, EP_NONE, false, false, false, $walk_dirs);
     1579                return $this->generate_rewrite_rules($permalink_structure, false, false, false, false, $walk_dirs);
    15421580        }
    15431581
    15441582        /**
     
    15771615                                                                '.*wp-commentsrss2.php$'        =>      $this->index . '?feed=rss2&withcomments=1');
    15781616
    15791617                // Post
    1580                 $post_rewrite = $this->generate_rewrite_rules($this->permalink_structure, EP_PERMALINK);
     1618                $post_rewrite = $this->generate_rewrite_rules($this->permalink_structure, 'permalink');
    15811619                $post_rewrite = apply_filters('post_rewrite_rules', $post_rewrite);
    15821620
    15831621                // Date
    1584                 $date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), EP_DATE);
     1622                $date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), 'date');
    15851623                $date_rewrite = apply_filters('date_rewrite_rules', $date_rewrite);
    15861624
    15871625                // Root
    1588                 $root_rewrite = $this->generate_rewrite_rules($this->root . '/', EP_ROOT);
     1626                $root_rewrite = $this->generate_rewrite_rules($this->root . '/', 'root');
    15891627                $root_rewrite = apply_filters('root_rewrite_rules', $root_rewrite);
    15901628
    15911629                // Comments
    1592                 $comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, EP_COMMENTS, true, true, true, false);
     1630                $comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, 'comments', true, true, true, false);
    15931631                $comments_rewrite = apply_filters('comments_rewrite_rules', $comments_rewrite);
    15941632
    15951633                // Search
    15961634                $search_structure = $this->get_search_permastruct();
    1597                 $search_rewrite = $this->generate_rewrite_rules($search_structure, EP_SEARCH);
     1635                $search_rewrite = $this->generate_rewrite_rules($search_structure, 'search');
    15981636                $search_rewrite = apply_filters('search_rewrite_rules', $search_rewrite);
    15991637
    16001638                // Categories
    1601                 $category_rewrite = $this->generate_rewrite_rules($this->get_category_permastruct(), EP_CATEGORIES);
     1639                $category_rewrite = $this->generate_rewrite_rules($this->get_category_permastruct(), 'categories');
    16021640                $category_rewrite = apply_filters('category_rewrite_rules', $category_rewrite);
    16031641
    16041642                // Tags
    1605                 $tag_rewrite = $this->generate_rewrite_rules($this->get_tag_permastruct(), EP_TAGS);
     1643                $tag_rewrite = $this->generate_rewrite_rules($this->get_tag_permastruct(), 'tags');
    16061644                $tag_rewrite = apply_filters('tag_rewrite_rules', $tag_rewrite);
    16071645
    16081646                // Authors
    1609                 $author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);
     1647                $author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), 'authors');
    16101648                $author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite);
    16111649
    16121650                // Pages
     
    16181656                        if ( is_array($permastruct) )
    16191657                                $this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct[0], $permastruct[1]));
    16201658                        else
    1621                                 $this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct, EP_NONE));
     1659                                $this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct, false));
    16221660                }
    16231661
    16241662                // Put them together.
     
    18951933         * @param array $places URL types that endpoint can be used.
    18961934         */
    18971935        function add_endpoint($name, $places) {
     1936                $this->_bitmasks_to_array( $places );
     1937
    18981938                global $wp;
    18991939                $this->endpoints[] = array ( $places, $name );
    19001940                $wp->add_query_var($name);
    19011941        }
    19021942
     1943        function _bitmasks_to_array( &$places ) {
     1944                if ( is_int( $places ) ) {
     1945                        $_places = array();
     1946                        foreach ( $this->_bitmasks as $bit => $new ) {
     1947                                if ( constant( $bit ) & $places )
     1948                                        $_places[] = $new;
     1949                        }
     1950                        $places = $_places;
     1951                } elseif ( ! is_array( $places ) ) {
     1952                        $places = array( 'none' );
     1953                }
     1954        }
     1955
    19031956        /**
    19041957         * Add permalink structure.
    19051958         *
     
    19131966         * @param string $struct Permalink structure.
    19141967         * @param bool $with_front Prepend front base to permalink structure.
    19151968         */
    1916         function add_permastruct($name, $struct, $with_front = true, $ep_mask = EP_NONE) {
     1969        function add_permastruct($name, $struct, $with_front = true, $ep_mask = 'none' ) {
     1970                $this->_bitmasks_to_array( $ep_mask );
    19171971                if ( $with_front )
    19181972                        $struct = $this->front . $struct;
    19191973                $this->extra_permastructs[$name] = array($struct, $ep_mask);