WordPress.org

Make WordPress Core

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

File rewrite-archives-by-endianness.diff, 5.6 KB (added by wonderboymusic, 6 years 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