Changeset 5454

Show
Ignore:
Timestamp:
05/12/07 00:17:34 (2 years ago)
Author:
rob1n
Message:

Bring get_pagenum_link() into this century. Props Mark Jaquith. fixes #3930

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/wp-includes/link-template.php

    r5340 r5454  
    465465function get_pagenum_link($pagenum = 1) { 
    466466    global $wp_rewrite; 
    467  
    468     $qstr = $_SERVER['REQUEST_URI']; 
    469  
    470     $page_querystring = "paged"; 
    471     $page_modstring = "page/"; 
    472     $page_modregex = "page/?"; 
    473     $permalink = 0; 
    474  
     467     
     468    $pagenum = (int) $pagenum; 
     469     
     470    $request = remove_query_arg( 'paged' ); 
     471     
    475472    $home_root = parse_url(get_option('home')); 
    476473    $home_root = $home_root['path']; 
    477     $home_root = trailingslashit($home_root); 
    478     $qstr = preg_replace('|^'. $home_root . '|', '', $qstr); 
    479     $qstr = preg_replace('|^/+|', '', $qstr); 
    480  
     474    $home_root = preg_quote( trailingslashit( $home_root ), '|' ); 
     475     
     476    $request = preg_replace('|^'. $home_root . '|', '', $qstr); 
     477    $request = preg_replace('|^/+|', '', $qstr); 
     478     
    481479    $index = $_SERVER['PHP_SELF']; 
    482480    $index = preg_replace('|^'. $home_root . '|', '', $index); 
    483481    $index = preg_replace('|^/+|', '', $index); 
    484  
    485     // if we already have a QUERY style page string 
    486     if ( stripos( $qstr, $page_querystring ) !== false ) { 
    487         $replacement = "$page_querystring=$pagenum"; 
    488         $qstr = preg_replace("/".$page_querystring."[^\d]+\d+/", $replacement, $qstr); 
    489         // if we already have a mod_rewrite style page string 
    490     } elseif ( preg_match( '|'.$page_modregex.'\d+|', $qstr ) ) { 
    491         $permalink = 1; 
    492         $qstr = preg_replace('|'.$page_modregex.'\d+|',"$page_modstring$pagenum",$qstr); 
    493  
    494         // if we don't have a page string at all ... 
    495         // lets see what sort of URL we have... 
    496     } else { 
    497         // we need to know the way queries are being written 
    498         // if there's a querystring_start (a "?" usually), it's definitely not mod_rewritten 
    499         if ( stripos( $qstr, '?' ) !== false ) { 
    500             // so append the query string (using &, since we already have ?) 
    501             $qstr .=    '&' . $page_querystring . '=' . $pagenum; 
    502             // otherwise, it could be rewritten, OR just the default index ... 
    503         } elseif( '' != get_option('permalink_structure') && ! is_admin() ) { 
    504             $permalink = 1; 
    505             $index = $wp_rewrite->index; 
    506             // If it's not a path info permalink structure, trim the index. 
    507             if ( !$wp_rewrite->using_index_permalinks() ) { 
    508                 $qstr = preg_replace("#/*" . $index . "/*#", '/', $qstr); 
    509             } else { 
    510                 // If using path info style permalinks, make sure the index is in 
    511                 // the URL. 
    512                 if ( strpos($qstr, $index) === false ) 
    513                     $qstr = '/' . $index . $qstr; 
    514             } 
    515  
    516             $qstr = trailingslashit($qstr) . $page_modstring . $pagenum; 
     482     
     483    if ( !$wp_rewrite->using_permalinks() ) { 
     484        $base = trailingslashit( get_bloginfo( 'home' ) ); 
     485         
     486        if ( $pagenum > 1 ) { 
     487            $result = add_query_arg( 'paged', $pagenum, $request ); 
    517488        } else { 
    518             $qstr = $index . '?' . $page_querystring . '=' . $pagenum; 
    519         } 
    520     } 
    521  
    522     $qstr = preg_replace('|^/+|', '', $qstr); 
    523     if ( $permalink ) 
    524         $qstr = user_trailingslashit($qstr, 'paged'); 
    525     $qstr = preg_replace('/&([^#])(?![a-z]{1,8};)/', '&$1', trailingslashit( get_option('home') ) . $qstr ); 
    526  
    527     // showing /page/1/ or ?paged=1 is redundant 
    528     if ( 1 === $pagenum ) { 
    529         $qstr = str_replace(user_trailingslashit('index.php/page/1', 'paged'), '', $qstr); // for PATHINFO style 
    530         $qstr = str_replace(user_trailingslashit('page/1', 'paged'), '', $qstr); // for mod_rewrite style 
    531         $qstr = remove_query_arg('paged', $qstr); // for query style 
    532     } 
    533     return $qstr; 
     489            $result = $base . $request; 
     490        } 
     491    } else { 
     492        $qs_regex = '|\?.*?$|'; 
     493        preg_match( $qs_regex, $request, $qs_match ); 
     494         
     495        if ( $qs_match[0] ) { 
     496            $query_string = $qs_match[0]; 
     497            $request = preg_replace( $qs_regex, '', $request ); 
     498        } else { 
     499            $query_string = ''; 
     500        } 
     501         
     502        $base = get_bloginfo( 'home' ) . '/'; 
     503         
     504        if ( $wp_rewrite->using_index_permalinks() && $pagenum > 1 ) { 
     505            $base .= 'index.php/'; 
     506        } 
     507         
     508        $request = ( $pagenum > 1 ) ? $request . user_trailingslashit( 'page/' . $pagenum, 'paged' ) : $request; 
     509        $result = $base . $request . $query_string; 
     510    } 
     511     
     512    return $result; 
    534513} 
    535514