WordPress.org

Make WordPress Core

Ticket #12779: 12779.diff

File 12779.diff, 12.0 KB (added by nacin, 5 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);