WordPress.org

Make WordPress Core

Changeset 2609


Ignore:
Timestamp:
05/14/05 02:59:42 (9 years ago)
Author:
ryan
Message:

Rework url_to_postid() to handle all supported permalink structs. Helps resolve pingback URIs to posts. http://mosquito.wordpress.org/view.php?id=1324

File:
1 edited

Legend:

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

    r2606 r2609  
    174174// determine the post ID it represents. 
    175175function url_to_postid($url = '') { 
    176     global $wpdb; 
    177  
    178     $siteurl = get_settings('home'); 
    179     // Take a link like 'http://example.com/blog/something' 
    180     // and extract just the '/something': 
    181     $uri = preg_replace("#$siteurl#i", '', $url); 
    182  
    183     // on failure, preg_replace just returns the subject string 
    184     // so if $uri and $siteurl are the same, they didn't match: 
    185     if ($uri == $siteurl)  
     176    global $wp_rewrite; 
     177 
     178    // First, check to see if there is a 'p=N' or 'page_id=N' to match against: 
     179    preg_match('#[?&](p|page_id)=(\d+)#', $url, $values); 
     180    $id = intval($values[2]); 
     181    if ($id) return $id; 
     182 
     183    // URI is probably a permalink. 
     184    $rewrite = $wp_rewrite->wp_rewrite_rules(); 
     185 
     186    if ( empty($rewrite) ) 
    186187        return 0; 
    187          
    188     // First, check to see if there is a 'p=N' or 'page_id=N' to match against: 
    189     preg_match('#[?&](p|page_id)=(\d+)#', $uri, $values); 
    190     $p = intval($values[2]); 
    191     if ($p) return $p; 
     188 
     189    $req_uri = $url; 
     190    $home_path = parse_url(get_settings('home')); 
     191    $home_path = $home_path['path']; 
    192192     
    193     // Match $uri against our permalink structure 
    194     $permalink_structure = get_settings('permalink_structure'); 
     193    // Trim path info from the end and the leading home path from the 
     194    // front.  For path info requests, this leaves us with the requesting 
     195    // filename, if any.  For 404 requests, this leaves us with the 
     196    // requested permalink.  
     197    $req_uri = str_replace($pathinfo, '', $req_uri); 
     198    $req_uri = str_replace($home_path, '', $req_uri); 
     199    $req_uri = trim($req_uri, '/'); 
     200    $request = $req_uri; 
    195201     
    196     // Matt's tokenizer code 
    197     $rewritecode = array( 
    198         '%year%', 
    199         '%monthnum%', 
    200         '%day%', 
    201         '%hour%', 
    202         '%minute%', 
    203         '%second%', 
    204         '%postname%', 
    205         '%post_id%' 
    206     ); 
    207     $rewritereplace = array( 
    208         '([0-9]{4})?', 
    209         '([0-9]{1,2})?', 
    210         '([0-9]{1,2})?', 
    211         '([0-9]{1,2})?', 
    212         '([0-9]{1,2})?', 
    213         '([0-9]{1,2})?', 
    214         '([_0-9a-z-]+)?', 
    215         '([0-9]+)?' 
    216     ); 
    217  
    218     // Turn the structure into a regular expression 
    219     $matchre = str_replace('/', '/?', $permalink_structure); 
    220     $matchre = str_replace($rewritecode, $rewritereplace, $matchre); 
    221  
    222     // Extract the key values from the uri: 
    223     preg_match("#$matchre#",$uri,$values); 
    224  
    225     // Extract the token names from the structure: 
    226     preg_match_all("#%(.+?)%#", $permalink_structure, $tokens); 
    227  
    228     for($i = 0; $i < count($tokens[1]); $i++) { 
    229         $name = $tokens[1][$i]; 
    230         $value = $values[$i+1]; 
    231  
    232         // Create a variable named $year, $monthnum, $day, $postname, or $post_id: 
    233         $$name = $value; 
    234     } 
    235      
    236     // If using %post_id%, we're done: 
    237     if (intval($post_id)) return intval($post_id); 
    238      
    239     // Otherwise, build a WHERE clause, making the values safe along the way: 
    240     if ($year) $where .= " AND YEAR(post_date) = '" . intval($year) . "'"; 
    241     if ($monthnum) $where .= " AND MONTH(post_date) = '" . intval($monthnum) . "'"; 
    242     if ($day) $where .= " AND DAYOFMONTH(post_date) = '" . intval($day) . "'"; 
    243     if ($hour) $where .= " AND HOUR(post_date) = '" . intval($hour) . "'"; 
    244     if ($minute) $where .= " AND MINUTE(post_date) = '" . intval($minute) . "'"; 
    245     if ($second) $where .= " AND SECOND(post_date) = '" . intval($second) . "'"; 
    246     if ($postname) $where .= " AND post_name = '" . $wpdb->escape($postname) . "' "; 
    247  
    248     // We got no indication, so we return false: 
    249     if (!strlen($where)) { 
    250         return false; 
    251     } 
    252  
    253     // if all we got was a postname, it's probably a page, so we'll want to check for a possible subpage 
    254     if ($postname && !$year && !$monthnum && !$day && !$hour && !$minute && !$second) { 
    255     $postname = rtrim(strstr($uri, $postname), '/'); 
    256     $uri_array = explode('/', $postname); 
    257     $postname = $uri_array[count($uri_array) - 1]; 
    258     $where = " AND post_name = '" . $wpdb->escape($postname) . "' "; 
    259     } 
    260      
    261     // Run the query to get the post ID: 
    262     $id = intval($wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE 1 = 1 " . $where)); 
    263  
    264     return $id; 
     202    // Look for matches. 
     203    $request_match = $request; 
     204    foreach ($rewrite as $match => $query) { 
     205        // If the requesting file is the anchor of the match, prepend it 
     206        // to the path info. 
     207        if ((! empty($req_uri)) && (strpos($match, $req_uri) === 0)) { 
     208            $request_match = $req_uri . '/' . $request; 
     209        } 
     210 
     211        if (preg_match("!^$match!", $request_match, $matches)) { 
     212            // Got a match. 
     213            // Trim the query of everything up to the '?'. 
     214            $query = preg_replace("!^.+\?!", '', $query); 
     215             
     216            // Substitute the substring matches into the query. 
     217            eval("\$query = \"$query\";"); 
     218            $query = new WP_Query($query); 
     219            if ( !empty($query->post) ) 
     220                return $query->post->ID; 
     221            else 
     222                return 0; 
     223        } 
     224    } 
     225 
     226    return 0; 
    265227} 
    266228 
Note: See TracChangeset for help on using the changeset viewer.