WordPress.org

Make WordPress Core

Ticket #13701: rewrite-archives-by-endianness.diff

File rewrite-archives-by-endianness.diff, 5.6 KB (added by wonderboymusic, 20 months ago)
  • wp-includes/rewrite.php

     
    728728        var $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' ); 
    729729 
    730730        /** 
     731         * Default date endianness 
     732         * 
     733         * @since 3.5.0 
     734         * @access private 
     735         * @var string 
     736         */ 
     737        var $default_date_endian = '%year%/%monthnum%/%day%'; 
     738        /** 
    731739         * Whether permalinks are being used. 
    732740         * 
    733741         * This can be either rewrite module or permalink in the HTTP query string. 
     
    867875        } 
    868876 
    869877        /** 
     878         * Retrieve the date endian from the permalink structure 
     879         * 
     880         * @since 3.5.0 
     881         * @access public 
     882         * 
     883         * @return array 
     884         */      
     885        function get_date_endian() { 
     886                // The date permalink must have year, month, and day separated by slashes. 
     887                $alternative_endians = array( '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%' );            
     888                 
     889                $date_endian = ''; 
     890 
     891                foreach ( $alternative_endians as $endian ) { 
     892                        if ( false !== strpos( $this->permalink_structure, $endian ) ) { 
     893                                $date_endian = $endian; 
     894                                break; 
     895                        } 
     896                } 
     897                 
     898                if ( empty( $date_endian ) ) 
     899                        $date_endian = $this->default_date_endian; 
     900                 
     901                return $date_endian; 
     902        } 
     903         
     904        /** 
    870905         * Retrieve date permalink structure, with year, month, and day. 
    871906         * 
    872907         * The permalink structure for the date, if not set already depends on the 
     
    895930                        return false; 
    896931                } 
    897932 
    898                 // The date permalink must have year, month, and day separated by slashes. 
    899                 $endians = array('%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%'); 
    900  
    901                 $this->date_structure = ''; 
    902                 $date_endian = ''; 
    903  
    904                 foreach ( $endians as $endian ) { 
    905                         if ( false !== strpos($this->permalink_structure, $endian) ) { 
    906                                 $date_endian= $endian; 
    907                                 break; 
    908                         } 
    909                 } 
    910  
    911                 if ( empty($date_endian) ) 
    912                         $date_endian = '%year%/%monthnum%/%day%'; 
    913  
    914933                // Do not allow the date tags and %post_id% to overlap in the permalink 
    915934                // structure. If they do, move the date tags to $front/date/. 
    916935                $front = $this->front; 
     
    924943                        $tok_index++; 
    925944                } 
    926945 
    927                 $this->date_structure = $front . $date_endian; 
     946                $this->date_structure = $front . $this->get_date_endian(); 
    928947 
    929948                return $this->date_structure; 
    930949        } 
     
    12551274                $front = substr($permalink_structure, 0, strpos($permalink_structure, '%')); 
    12561275                //build an array of the tags (note that said array ends up being in $tokens[0]) 
    12571276                preg_match_all('/%.+?%/', $permalink_structure, $tokens); 
    1258  
    12591277                $num_tokens = count($tokens[0]); 
    12601278 
    12611279                $index = $this->index; //probably 'index.php' 
    12621280                $feedindex = $index; 
    12631281                $trackbackindex = $index; 
    1264                 //build a list from the rewritecode and queryreplace arrays, that will look something like 
    1265                 //tagname=$matches[i] where i is the current $i 
    1266                 for ( $i = 0; $i < $num_tokens; ++$i ) { 
    1267                         if ( 0 < $i ) 
    1268                                 $queries[$i] = $queries[$i - 1] . '&'; 
    1269                         else 
    1270                                 $queries[$i] = ''; 
     1282                 
     1283                if ( EP_DATE === $ep_mask && $this->default_date_endian !== $this->get_date_endian() ) { 
     1284                        $reformatted = array( '%year%', array( '%monthnum%', '%year%' ) ); 
     1285                        switch ( $this->get_date_endian() ) { 
     1286                                case '%day%/%monthnum%/%year%': 
     1287                                        $reformatted[] = array( '%day%', '%monthnum%', '%year%' ); 
     1288                                        break; 
     1289                                case '%monthnum%/%day%/%year%': 
     1290                                        $reformatted[] = array( '%monthnum%', '%day%', '%year%' ); 
     1291                                        break;                           
     1292                        } 
     1293                         
     1294                        foreach ( $reformatted as $tokens ) { 
     1295                                if ( ! is_array( $tokens ) ) 
     1296                                        $tokens = array( $tokens ); 
    12711297 
    1272                         $query_token = str_replace($this->rewritecode, $this->queryreplace, $tokens[0][$i]) . $this->preg_index($i+1); 
    1273                         $queries[$i] .= $query_token; 
     1298                                $query_parts = array(); 
     1299                                foreach ( $tokens as $i => $token ) 
     1300                                        $query_parts[] = str_replace( $this->rewritecode, $this->queryreplace, $token ) . $this->preg_index( $i + 1 ); 
     1301                                 
     1302                                $queries[] = join( '&', $query_parts ); 
     1303                        } 
     1304                } else { 
     1305                        //build a list from the rewritecode and queryreplace arrays, that will look something like 
     1306                        //tagname=$matches[i] where i is the current $i 
     1307                        for ( $i = 0; $i < $num_tokens; ++$i ) { 
     1308                                if ( 0 < $i ) 
     1309                                        $queries[$i] = $queries[$i - 1] . '&'; 
     1310                                else 
     1311                                        $queries[$i] = ''; 
     1312 
     1313                                $query_token = str_replace($this->rewritecode, $this->queryreplace, $tokens[0][$i]) . $this->preg_index($i+1); 
     1314                                $queries[$i] .= $query_token; 
     1315                        }                        
    12741316                } 
    1275  
    12761317                //get the structure, minus any cruft (stuff that isn't tags) at the front 
    12771318                $structure = $permalink_structure; 
    12781319                if ( $front != '/' ) 
     
    12851326                $dirs = $walk_dirs ? explode('/', $structure) : array( $structure ); 
    12861327                $num_dirs = count($dirs); 
    12871328 
     1329                if (EP_DATE === $ep_mask && $this->default_date_endian !== $this->get_date_endian() ) { 
     1330                        $dirs = array( '%year%', '%monthnum%/%year%' ); 
     1331                        switch ( $this->get_date_endian() ) { 
     1332                                case '%day%/%monthnum%/%year%': 
     1333                                        $dirs[] = '%day%/%monthnum%/%year%'; 
     1334                                        break; 
     1335                                case '%monthnum%/%day%/%year%': 
     1336                                        $dirs[] = '%monthnum%/%day%/%year%'; 
     1337                                        break;                           
     1338                        } 
     1339                } 
    12881340                //strip slashes from the front of $front 
    12891341                $front = preg_replace('|^/+|', '', $front); 
    12901342 
     
    12921344                $post_rewrite = array(); 
    12931345                $struct = $front; 
    12941346                for ( $j = 0; $j < $num_dirs; ++$j ) { 
    1295                         //get the struct for this dir, and trim slashes off the front 
    1296                         $struct .= $dirs[$j] . '/'; //accumulate. see comment near explode('/', $structure) above 
     1347                        if ( EP_DATE === $ep_mask && $this->default_date_endian !== $this->get_date_endian() ) { 
     1348                                $struct = $front . $dirs[$j]; 
     1349                        } else { 
     1350                                //get the struct for this dir, and trim slashes off the front 
     1351                                $struct .= $dirs[$j] . '/'; //accumulate. see comment near explode('/', $structure) above                                
     1352                        } 
     1353 
    12971354                        $struct = ltrim($struct, '/'); 
    12981355 
    12991356                        //replace tags with regexes