Make WordPress Core


Ignore:
Timestamp:
12/03/2004 02:38:11 AM (20 years ago)
Author:
rboren
Message:

Move rewrite and permalink functions into WP_Rewrite class.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/functions.php

    r1900 r1908  
    13061306}
    13071307
    1308 function using_index_permalinks($permalink_structure = '') {
    1309     if (empty($permalink_structure)) {
    1310         $permalink_structure = get_settings('permalink_structure');
    1311    
    1312         if (empty($permalink_structure)) {
    1313             return false;
    1314         }
    1315     }
    1316 
    1317     // If the index is not in the permalink, we're using mod_rewrite.
    1318     if (preg_match('#^/*index.php#', $permalink_structure)) {
    1319       return true;
    1320     }
    1321    
    1322     return false;
    1323 }
    1324 
    1325 function preg_index($number, $matches = '') {
    1326     $match_prefix = '$';
    1327     $match_suffix = '';
    1328    
    1329     if (! empty($matches)) {
    1330         $match_prefix = '$' . $matches . '[';
    1331         $match_suffix = ']';
    1332     }       
    1333    
    1334     return "$match_prefix$number$match_suffix";       
    1335 }
    1336 
    1337 
    13381308function get_page_uri($page) {
    13391309    global $wpdb;
     
    13531323
    13541324    return $uri;
    1355 }
    1356 
    1357 function page_rewrite_rules() {
    1358     $uris = get_settings('page_uris');
    1359 
    1360     $rewrite_rules = array();
    1361         if( is_array( $uris ) )
    1362         {
    1363             foreach ($uris as $uri => $pagename) {
    1364                             $rewrite_rules += array($uri . '/?$' => "index.php?pagename=" . urldecode($pagename));
    1365             }
    1366         }
    1367 
    1368     return $rewrite_rules;
    1369 }
    1370 
    1371 function get_date_permastruct($permalink_structure = '') {
    1372     if (empty($permalink_structure)) {
    1373         $permalink_structure = get_settings('permalink_structure');
    1374    
    1375         if (empty($permalink_structure)) {
    1376             return false;
    1377         }
    1378     }
    1379        
    1380     $front = substr($permalink_structure, 0, strpos($permalink_structure, '%'));   
    1381         // The date permalink must have year, month, and day separated by slashes.
    1382         $endians = array('%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%');
    1383 
    1384         $date_structure = '';
    1385 
    1386         foreach ($endians as $endian) {
    1387             if (false !== strpos($permalink_structure, $endian)) {
    1388                 $date_structure = $front . $endian;
    1389                 break;
    1390             }
    1391         }
    1392 
    1393         if (empty($date_structure)) {
    1394                 $date_structure = $front . '%year%/%monthnum%/%day%';
    1395         }
    1396 
    1397         return $date_structure;
    1398 }
    1399 
    1400 function get_year_permastruct($permalink_structure = '') {
    1401     $structure = get_date_permastruct($permalink_structure);
    1402 
    1403     if (empty($structure)) {
    1404         return false;
    1405     }
    1406 
    1407     $structure = str_replace('%monthnum%', '', $structure);
    1408     $structure = str_replace('%day%', '', $structure);
    1409 
    1410     $structure = preg_replace('#/+#', '/', $structure);
    1411 
    1412     return $structure;
    1413 }
    1414 
    1415 function get_month_permastruct($permalink_structure = '') {
    1416     $structure = get_date_permastruct($permalink_structure);
    1417 
    1418     if (empty($structure)) {
    1419         return false;
    1420     }
    1421 
    1422     $structure = str_replace('%day%', '', $structure);
    1423 
    1424     $structure = preg_replace('#/+#', '/', $structure);
    1425 
    1426     return $structure;
    1427 }
    1428 
    1429 function get_day_permastruct($permalink_structure = '') {
    1430     return get_date_permastruct($permalink_structure);
    1431 }
    1432 
    1433 function generate_rewrite_rules($permalink_structure = '', $matches = '', $forcomments = false) {
    1434     $rewritecode =
    1435         array(
    1436                     '%year%',
    1437                     '%monthnum%',
    1438                     '%day%',
    1439                     '%hour%',
    1440                     '%minute%',
    1441                     '%second%',
    1442                     '%postname%',
    1443                     '%post_id%',
    1444                     '%category%',
    1445                     '%author%',
    1446                     '%pagename%',
    1447                     '%search%'
    1448                     );
    1449 
    1450     $rewritereplace =
    1451         array(
    1452                     '([0-9]{4})',
    1453                     '([0-9]{1,2})',
    1454                     '([0-9]{1,2})',
    1455                     '([0-9]{1,2})',
    1456                     '([0-9]{1,2})',
    1457                     '([0-9]{1,2})',
    1458                     '([^/]+)',
    1459                     '([0-9]+)',
    1460                     '(.+?)',
    1461                     '([^/]+)',
    1462                     '([^/]+)',
    1463                     '(.+)'
    1464                     );
    1465 
    1466     $queryreplace =
    1467         array (
    1468                      'year=',
    1469                      'monthnum=',
    1470                      'day=',
    1471                      'hour=',
    1472                      'minute=',
    1473                      'second=',
    1474                      'name=',
    1475                      'p=',
    1476                      'category_name=',
    1477                      'author_name=',
    1478                      'pagename=',
    1479                      's='
    1480                      );
    1481 
    1482     $feedregex2 = '(feed|rdf|rss|rss2|atom)/?$';
    1483     $feedregex = 'feed/' . $feedregex2;
    1484 
    1485     $trackbackregex = 'trackback/?$';
    1486     $pageregex = 'page/?([0-9]{1,})/?$';
    1487 
    1488     $front = substr($permalink_structure, 0, strpos($permalink_structure, '%'));   
    1489     preg_match_all('/%.+?%/', $permalink_structure, $tokens);
    1490 
    1491     $num_tokens = count($tokens[0]);
    1492 
    1493     $index = 'index.php';
    1494     $feedindex = $index;
    1495     $trackbackindex = $index;
    1496     for ($i = 0; $i < $num_tokens; ++$i) {
    1497         if (0 < $i) {
    1498             $queries[$i] = $queries[$i - 1] . '&';
    1499         }
    1500              
    1501         $query_token = str_replace($rewritecode, $queryreplace, $tokens[0][$i]) . preg_index($i+1, $matches);
    1502         $queries[$i] .= $query_token;
    1503     }
    1504 
    1505     $structure = $permalink_structure;
    1506     if ($front != '/') {
    1507         $structure = str_replace($front, '', $structure);
    1508     }
    1509     $structure = trim($structure, '/');
    1510     $dirs = explode('/', $structure);
    1511     $num_dirs = count($dirs);
    1512 
    1513     $front = preg_replace('|^/+|', '', $front);
    1514 
    1515     $post_rewrite = array();
    1516     $struct = $front;
    1517     for ($j = 0; $j < $num_dirs; ++$j) {
    1518         $struct .= $dirs[$j] . '/';
    1519         $struct = ltrim($struct, '/');
    1520         $match = str_replace($rewritecode, $rewritereplace, $struct);
    1521         $num_toks = preg_match_all('/%.+?%/', $struct, $toks);
    1522         $query = $queries[$num_toks - 1];
    1523 
    1524         $pagematch = $match . $pageregex;
    1525         $pagequery = $index . '?' . $query . '&paged=' . preg_index($num_toks + 1, $matches);
    1526 
    1527         $feedmatch = $match . $feedregex;
    1528         $feedquery = $feedindex . '?' . $query . '&feed=' . preg_index($num_toks + 1, $matches);
    1529 
    1530         $feedmatch2 = $match . $feedregex2;
    1531         $feedquery2 = $feedindex . '?' . $query . '&feed=' . preg_index($num_toks + 1, $matches);
    1532 
    1533         if ($forcomments) {
    1534             $feedquery .= '&withcomments=1';
    1535             $feedquery2 .= '&withcomments=1';
    1536         }
    1537                
    1538         $rewrite = array($feedmatch => $feedquery, $feedmatch2 => $feedquery2, $pagematch => $pagequery);
    1539 
    1540         if ($num_toks) {
    1541             $post = 0;
    1542             if (strstr($struct, '%postname%') || strstr($struct, '%post_id%')
    1543                     || (strstr($struct, '%year%') &&  strstr($struct, '%monthnum%') && strstr($struct, '%day%') && strstr($struct, '%hour%') && strstr($struct, '%minute') && strstr($struct, '%second%'))) {
    1544                 $post = 1;
    1545                 $trackbackmatch = $match . $trackbackregex;
    1546                 $trackbackquery = $trackbackindex . '?' . $query . '&tb=1';
    1547                 $match = $match . '?([0-9]+)?/?$';
    1548                 $query = $index . '?' . $query . '&page=' . preg_index($num_toks + 1, $matches);
    1549             } else {
    1550                 $match .= '?$';
    1551                 $query = $index . '?' . $query;
    1552             }
    1553                        
    1554             $rewrite = $rewrite + array($match => $query);
    1555 
    1556             if ($post) {
    1557                 $rewrite = array($trackbackmatch => $trackbackquery) + $rewrite;
    1558             }
    1559         }
    1560 
    1561         $post_rewrite = $rewrite + $post_rewrite;
    1562     }
    1563 
    1564     return $post_rewrite;
    1565 }
    1566 
    1567 /* rewrite_rules
    1568  * Construct rewrite matches and queries from permalink structure.
    1569  * matches - The name of the match array to use in the query strings.
    1570  *           If empty, $1, $2, $3, etc. are used.
    1571  * Returns an associate array of matches and queries.
    1572  */
    1573 function rewrite_rules($matches = '', $permalink_structure = '') {
    1574     $rewrite = array();
    1575 
    1576     if (empty($permalink_structure)) {
    1577         $permalink_structure = get_settings('permalink_structure');
    1578        
    1579         if (empty($permalink_structure)) {
    1580             return $rewrite;
    1581         }
    1582     }
    1583 
    1584     $front = substr($permalink_structure, 0, strpos($permalink_structure, '%'));
    1585     $index = 'index.php';
    1586     $prefix = '';
    1587     if (using_index_permalinks($permalink_structure)) {
    1588         $prefix = $index . '/';
    1589     }
    1590 
    1591     // Post
    1592     $post_rewrite = generate_rewrite_rules($permalink_structure, $matches);
    1593 
    1594     // Date
    1595     $date_rewrite = generate_rewrite_rules(get_date_permastruct($permalink_structure), $matches);
    1596        
    1597     // Root
    1598     $root_rewrite = generate_rewrite_rules($prefix . '/', $matches);
    1599 
    1600     // Comments
    1601     $comments_rewrite = generate_rewrite_rules($prefix . 'comments', $matches, true);
    1602 
    1603     // Search
    1604     $search_structure = $prefix . "search/%search%";
    1605     $search_rewrite = generate_rewrite_rules($search_structure, $matches);
    1606 
    1607     // Categories
    1608     if ( '' == get_settings('category_base') )
    1609         $category_structure = $front . 'category/';
    1610     else
    1611         $category_structure = get_settings('category_base') . '/';
    1612 
    1613     $category_structure = $category_structure . '%category%';
    1614     $category_rewrite = generate_rewrite_rules($category_structure, $matches);
    1615 
    1616     // Authors
    1617     $author_structure = $front . 'author/%author%';
    1618     $author_rewrite = generate_rewrite_rules($author_structure, $matches);
    1619 
    1620     // Pages
    1621     $page_rewrite = page_rewrite_rules();
    1622 
    1623     // Deprecated style static pages
    1624     $page_structure = $prefix . 'site/%pagename%';
    1625     $old_page_rewrite = generate_rewrite_rules($page_structure, $matches);
    1626 
    1627     // Put them together.
    1628     $rewrite = $page_rewrite + $root_rewrite + $comments_rewrite + $old_page_rewrite + $search_rewrite + $category_rewrite + $author_rewrite + $date_rewrite + $post_rewrite;
    1629 
    1630     $rewrite = apply_filters('rewrite_rules_array', $rewrite);
    1631     return $rewrite;
    1632 }
    1633 
    1634 function mod_rewrite_rules ($permalink_structure) {
    1635     $site_root = str_replace('http://', '', trim(get_settings('siteurl')));
    1636     $site_root = preg_replace('|([^/]*)(.*)|i', '$2', $site_root);
    1637     if ('/' != substr($site_root, -1)) $site_root = $site_root . '/';
    1638    
    1639     $home_root = str_replace('http://', '', trim(get_settings('home')));
    1640     $home_root = preg_replace('|([^/]*)(.*)|i', '$2', $home_root);
    1641     if ('/' != substr($home_root, -1)) $home_root = $home_root . '/';
    1642 
    1643     $rules = "<IfModule mod_rewrite.c>\n";
    1644     $rules .= "RewriteEngine On\n";
    1645     $rules .= "RewriteBase $home_root\n";
    1646     $rewrite = rewrite_rules('', $permalink_structure);
    1647 
    1648     $num_rules = count($rewrite);
    1649     $rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" .
    1650         "RewriteCond %{REQUEST_FILENAME} -d\n" .
    1651         "RewriteRule ^.*$ - [S=$num_rules]\n";
    1652 
    1653     foreach ($rewrite as $match => $query) {
    1654         // Apache 1.3 does not support the reluctant (non-greedy) modifier.
    1655         $match = str_replace('.+?', '.+', $match);
    1656 
    1657         // If the match is unanchored and greedy, prepend rewrite conditions
    1658         // to avoid infinite redirects and eclipsing of real files.
    1659         if ($match == '(.+)/?$' || $match == '([^/]+)/?$' ) {
    1660             //nada.
    1661         }
    1662 
    1663         if (strstr($query, 'index.php')) {
    1664             $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
    1665         } else {
    1666             $rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n";
    1667         }
    1668     }
    1669     $rules .= "</IfModule>\n";
    1670 
    1671     $rules = apply_filters('rewrite_rules', $rules);
    1672 
    1673     return $rules;
    16741325}
    16751326
Note: See TracChangeset for help on using the changeset viewer.