X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/wordpress.git/blobdiff_plain/a66f9e26487c560245ef9cd17d7e87c0cbb650af..177fd6fefd2e3d5a0ea6591c71d660cabdb3c1a4:/wp-includes/link-template.php diff --git a/wp-includes/link-template.php b/wp-includes/link-template.php index 6a0677b7..74da3e74 100644 --- a/wp-includes/link-template.php +++ b/wp-includes/link-template.php @@ -32,7 +32,7 @@ function permalink_anchor($mode = 'id') { global $post; switch ( strtolower($mode) ) { case 'title': - $title = sanitize_title($post->post_title) . '-' . $id; + $title = sanitize_title($post->post_title) . '-' . $post->ID; echo ''; break; case 'id': @@ -43,7 +43,7 @@ function permalink_anchor($mode = 'id') { } -function get_permalink($id = 0) { +function get_permalink($id = 0, $leavename=false) { $rewritecode = array( '%year%', '%monthnum%', @@ -51,11 +51,11 @@ function get_permalink($id = 0) { '%hour%', '%minute%', '%second%', - '%postname%', + $leavename? '' : '%postname%', '%post_id%', '%category%', '%author%', - '%pagename%' + $leavename? '' : '%pagename%', ); $post = &get_post($id); @@ -63,7 +63,7 @@ function get_permalink($id = 0) { if ( empty($post->ID) ) return FALSE; if ( $post->post_type == 'page' ) - return get_page_link($post->ID); + return get_page_link($post->ID, $leavename); elseif ($post->post_type == 'attachment') return get_attachment_link($post->ID); @@ -73,17 +73,28 @@ function get_permalink($id = 0) { $unixtime = strtotime($post->post_date); $category = ''; - if (strpos($permalink, '%category%') !== false) { + if ( strpos($permalink, '%category%') !== false ) { $cats = get_the_category($post->ID); if ( $cats ) usort($cats, '_usort_terms_by_ID'); // order by ID $category = $cats[0]->slug; if ( $parent=$cats[0]->parent ) $category = get_category_parents($parent, FALSE, '/', TRUE) . $category; + + // show default category in permalinks, without + // having to assign it explicitly + if ( empty($category) ) { + $default_category = get_category( get_option( 'default_category' ) ); + $category = is_wp_error( $default_category ) ? '' : $default_category->slug; + } + } + + $author = ''; + if ( strpos($permalink, '%author%') !== false ) { + $authordata = get_userdata($post->post_author); + $author = $authordata->user_nicename; } - $authordata = get_userdata($post->post_author); - $author = $authordata->user_nicename; $date = explode(" ",date('Y m d H i s', $unixtime)); $rewritereplace = array( @@ -114,7 +125,7 @@ function post_permalink($post_id = 0, $deprecated = '') { } // Respects page_on_front. Use this one. -function get_page_link($id = false) { +function get_page_link($id = false, $leavename = false) { global $post; $id = (int) $id; @@ -124,23 +135,25 @@ function get_page_link($id = false) { if ( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) $link = get_option('home'); else - $link = _get_page_link( $id ); + $link = _get_page_link( $id , $leavename ); return apply_filters('page_link', $link, $id); } // Ignores page_on_front. Internal use only. -function _get_page_link( $id = false ) { +function _get_page_link( $id = false, $leavename = false ) { global $post, $wp_rewrite; if ( !$id ) $id = (int) $post->ID; + else + $post = &get_post($id); $pagestruct = $wp_rewrite->get_page_permastruct(); - if ( '' != $pagestruct && 'draft' != $post->post_status ) { + if ( '' != $pagestruct && isset($post->post_status) && 'draft' != $post->post_status ) { $link = get_page_uri($id); - $link = str_replace('%pagename%', $link, $pagestruct); + $link = ( $leavename ) ? $pagestruct : str_replace('%pagename%', $link, $pagestruct); $link = get_option('home') . "/$link"; $link = user_trailingslashit($link, 'page'); } else { @@ -166,8 +179,12 @@ function get_attachment_link($id = false) { $parentlink = _get_page_link( $object->post_parent ); // Ignores page_on_front else $parentlink = get_permalink( $object->post_parent ); + if ( is_numeric($object->post_name) || false !== strpos(get_option('permalink_structure'), '%category%') ) + $name = 'attachment/' . $object->post_name; // // is paged so we use the explicit attachment marker + else + $name = $object->post_name; if (strpos($parentlink, '?') === false) - $link = trailingslashit($parentlink) . $object->post_name . '/'; + $link = trailingslashit($parentlink) . $name . '/'; } if (! $link ) { @@ -226,11 +243,8 @@ function get_day_link($year, $month, $day) { } } -function get_feed_link($feed='rss2') { +function get_feed_link($feed = '') { global $wp_rewrite; - $do_perma = 0; - $feed_url = get_option('siteurl'); - $comment_feed_url = $feed_url; $permalink = $wp_rewrite->get_feed_permastruct(); if ( '' != $permalink ) { @@ -239,13 +253,16 @@ function get_feed_link($feed='rss2') { $permalink = $wp_rewrite->get_comment_feed_permastruct(); } - if ( 'rss2' == $feed ) + if ( get_default_feed() == $feed ) $feed = ''; $permalink = str_replace('%feed%', $feed, $permalink); $permalink = preg_replace('#/+#', '/', "/$permalink"); $output = get_option('home') . user_trailingslashit($permalink, 'feed'); } else { + if ( empty($feed) ) + $feed = get_default_feed(); + if ( false !== strpos($feed, 'comments_') ) $feed = str_replace('comments_', 'comments-', $feed); @@ -255,15 +272,18 @@ function get_feed_link($feed='rss2') { return apply_filters('feed_link', $output, $feed); } -function get_post_comments_feed_link($post_id = '', $feed = 'rss2') { +function get_post_comments_feed_link($post_id = '', $feed = '') { global $id; if ( empty($post_id) ) $post_id = (int) $id; + if ( empty($feed) ) + $feed = get_default_feed(); + if ( '' != get_option('permalink_structure') ) { $url = trailingslashit( get_permalink($post_id) ) . 'feed'; - if ( 'rss2' != $feed ) + if ( $feed != get_default_feed() ) $url .= "/$feed"; $url = user_trailingslashit($url, 'single_feed'); } else { @@ -277,41 +297,188 @@ function get_post_comments_feed_link($post_id = '', $feed = 'rss2') { return apply_filters('post_comments_feed_link', $url); } -function get_edit_post_link( $id = 0 ) { - $post = &get_post( $id ); +/** post_comments_feed_link() - Output the comment feed link for a post. + * + * Prints out the comment feed link for a post. Link text is placed in the + * anchor. If no link text is specified, default text is used. If no post ID + * is specified, the current post is used. + * + * @package WordPress + * @subpackage Feed + * @since 2.5 + * + * @param string Descriptive text + * @param int Optional post ID. Default to current post. + * @return string Link to the comment feed for the current post +*/ +function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '' ) { + $url = get_post_comments_feed_link($post_id, $feed); + if ( empty($link_text) ) + $link_text = __('Comments Feed'); + + echo "$link_text"; +} - if ( $post->post_type == 'attachment' ) { +function get_author_feed_link( $author_id, $feed = '' ) { + $author_id = (int) $author_id; + $permalink_structure = get_option('permalink_structure'); + + if ( empty($feed) ) + $feed = get_default_feed(); + + if ( '' == $permalink_structure ) { + $link = get_option('home') . '?feed=rss2&author=' . $author_id; + } else { + $link = get_author_posts_url($author_id); + $link = trailingslashit($link) . user_trailingslashit('feed', 'feed'); + } + + $link = apply_filters('author_feed_link', $link); + + return $link; +} + +/** get_category_feed_link() - Get the feed link for a given category + * + * Returns a link to the feed for all post in a given category. A specific feed can be requested + * or left blank to get the default feed. + * + * @package WordPress + * @subpackage Feed + * @since 2.5 + * + * @param int $cat_id ID of a category + * @param string $feed Feed type + * @return string Link to the feed for the category specified by $cat_id +*/ +function get_category_feed_link($cat_id, $feed = '') { + $cat_id = (int) $cat_id; + + $category = get_category($cat_id); + + if ( empty($category) || is_wp_error($category) ) + return false; + + if ( empty($feed) ) + $feed = get_default_feed(); + + $permalink_structure = get_option('permalink_structure'); + + if ( '' == $permalink_structure ) { + $link = get_option('home') . "?feed=$feed&cat=" . $cat_id; + } else { + $link = get_category_link($cat_id); + if( $feed == get_default_feed() ) + $feed_link = 'feed'; + else + $feed_link = "feed/$feed"; + + $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); + } + + $link = apply_filters('category_feed_link', $link, $feed); + + return $link; +} + +function get_tag_feed_link($tag_id, $feed = '') { + $tag_id = (int) $tag_id; + + $tag = get_tag($tag_id); + + if ( empty($tag) || is_wp_error($tag) ) + return false; + + $permalink_structure = get_option('permalink_structure'); + + if ( empty($feed) ) + $feed = get_default_feed(); + + if ( '' == $permalink_structure ) { + $link = get_option('home') . "?feed=$feed&tag=" . $tag->slug; + } else { + $link = get_tag_link($tag->term_id); + if ( $feed == get_default_feed() ) + $feed_link = 'feed'; + else + $feed_link = "feed/$feed"; + $link = $link . user_trailingslashit($feed_link, 'feed'); + } + + $link = apply_filters('tag_feed_link', $link, $feed); + + return $link; +} + +function get_search_feed_link($search_query = '', $feed = '') { + if ( empty($search_query) ) + $search = attribute_escape(get_search_query()); + else + $search = attribute_escape(stripslashes($search_query)); + + if ( empty($feed) ) + $feed = get_default_feed(); + + $link = get_option('home') . "?s=$search&feed=$feed"; + + $link = apply_filters('search_feed_link', $link); + + return $link; +} + +function get_search_comments_feed_link($search_query = '', $feed = '') { + if ( empty($search_query) ) + $search = attribute_escape(get_search_query()); + else + $search = attribute_escape(stripslashes($search_query)); + + if ( empty($feed) ) + $feed = get_default_feed(); + + $link = get_option('home') . "?s=$search&feed=comments-$feed"; + + $link = apply_filters('search_feed_link', $link); + + return $link; +} + +function get_edit_post_link( $id = 0 ) { + if ( !$post = &get_post( $id ) ) return; - } elseif ( $post->post_type == 'page' ) { + + switch ( $post->post_type ) : + case 'page' : if ( !current_user_can( 'edit_page', $post->ID ) ) return; - $file = 'page'; - } else { + $var = 'post'; + break; + case 'attachment' : + if ( !current_user_can( 'edit_post', $post->ID ) ) + return; + $file = 'media'; + $var = 'attachment_id'; + break; + default : if ( !current_user_can( 'edit_post', $post->ID ) ) return; - $file = 'post'; - } - - return apply_filters( 'get_edit_post_link', get_bloginfo( 'wpurl' ) . '/wp-admin/' . $file . '.php?action=edit&post=' . $post->ID, $post->ID ); + $var = 'post'; + break; + endswitch; + + return apply_filters( 'get_edit_post_link', get_bloginfo( 'wpurl' ) . "/wp-admin/$file.php?action=edit&$var=$post->ID", $post->ID ); } function edit_post_link( $link = 'Edit This', $before = '', $after = '' ) { global $post; - if ( $post->post_type == 'attachment' ) { - return; - } elseif ( $post->post_type == 'page' ) { + if ( $post->post_type == 'page' ) { if ( !current_user_can( 'edit_page', $post->ID ) ) return; - - $file = 'page'; } else { if ( !current_user_can( 'edit_post', $post->ID ) ) return; - - $file = 'post'; } $link = '' . $link . ''; @@ -322,9 +489,7 @@ function get_edit_comment_link( $comment_id = 0 ) { $comment = &get_comment( $comment_id ); $post = &get_post( $comment->comment_post_ID ); - if ( $post->post_type == 'attachment' ) { - return; - } elseif ( $post->post_type == 'page' ) { + if ( $post->post_type == 'page' ) { if ( !current_user_can( 'edit_page', $post->ID ) ) return; } else { @@ -340,7 +505,6 @@ function edit_comment_link( $link = 'Edit This', $before = '', $after = '' ) { global $comment, $post; if ( $post->post_type == 'attachment' ) { - return; } elseif ( $post->post_type == 'page' ) { if ( !current_user_can( 'edit_page', $post->ID ) ) return; @@ -356,39 +520,14 @@ function edit_comment_link( $link = 'Edit This', $before = '', $after = '' ) { // Navigation links function get_previous_post($in_same_cat = false, $excluded_categories = '') { - global $post, $wpdb; - - if( empty($post) || !is_single() || is_attachment() ) - return null; - - $current_post_date = $post->post_date; - - $join = ''; - if ( $in_same_cat ) { - $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id "; - $cat_array = wp_get_object_terms($post->ID, 'category', 'fields=tt_ids'); - $join .= ' AND (tr.term_taxonomy_id = ' . intval($cat_array[0]); - for ( $i = 1; $i < (count($cat_array)); $i++ ) { - $join .= ' OR tr.term_taxonomy_id = ' . intval($cat_array[$i]); - } - $join .= ')'; - } - - $sql_exclude_cats = ''; - if ( !empty($excluded_categories) ) { - $blah = explode(' and ', $excluded_categories); - $posts_in_ex_cats = get_objects_in_term($blah, 'category'); - $posts_in_ex_cats_sql = 'AND p.ID NOT IN (' . implode($posts_in_ex_cats, ',') . ')'; - } - - $join = apply_filters( 'get_previous_post_join', $join, $in_same_cat, $excluded_categories ); - $where = apply_filters( 'get_previous_post_where', "WHERE p.post_date < '$current_post_date' AND p.post_type = 'post' AND p.post_status = 'publish' $posts_in_ex_cats_sql", $in_same_cat, $excluded_categories ); - $sort = apply_filters( 'get_previous_post_sort', 'ORDER BY p.post_date DESC LIMIT 1' ); - - return @$wpdb->get_row("SELECT p.ID, p.post_title FROM $wpdb->posts AS p $join $where $sort"); + return get_adjacent_post($in_same_cat, $excluded_categories); } function get_next_post($in_same_cat = false, $excluded_categories = '') { + return get_adjacent_post($in_same_cat, $excluded_categories, false); +} + +function get_adjacent_post($in_same_cat = false, $excluded_categories = '', $previous = true) { global $post, $wpdb; if( empty($post) || !is_single() || is_attachment() ) @@ -397,58 +536,53 @@ function get_next_post($in_same_cat = false, $excluded_categories = '') { $current_post_date = $post->post_date; $join = ''; - if ( $in_same_cat ) { - $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id "; - $cat_array = wp_get_object_terms($post->ID, 'category', 'fields=tt_ids'); - $join .= ' AND (tr.term_taxonomy_id = ' . intval($cat_array[0]); - for ( $i = 1; $i < (count($cat_array)); $i++ ) { - $join .= ' OR tr.term_taxonomy_id = ' . intval($cat_array[$i]); + $posts_in_ex_cats_sql = ''; + if ( $in_same_cat || !empty($excluded_categories) ) { + $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id"; + + if ( $in_same_cat ) { + $cat_array = wp_get_object_terms($post->ID, 'category', 'fields=ids'); + $join .= " AND tt.taxonomy = 'category' AND tt.term_id IN (" . implode($cat_array, ',') . ')'; } - $join .= ')'; - } - $sql_exclude_cats = ''; - if ( !empty($excluded_categories) ) { - $blah = explode(' and ', $excluded_categories); - $posts_in_ex_cats = get_objects_in_term($blah, 'category'); - $posts_in_ex_cats_sql = 'AND p.ID NOT IN (' . implode($posts_in_ex_cats, ',') . ')'; + $posts_in_ex_cats_sql = "AND tt.taxonomy = 'category'"; + if ( !empty($excluded_categories) ) { + $excluded_categories = array_map('intval', explode(' and ', $excluded_categories)); + if ( !empty($cat_array) ) { + $excluded_categories = array_diff($excluded_categories, $cat_array); + $posts_in_ex_cats_sql = ''; + } + + if ( !empty($excluded_categories) ) { + $posts_in_ex_cats_sql = " AND tt.taxonomy = 'category' AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')'; + } + } } - $join = apply_filters( 'get_next_post_join', $join, $in_same_cat, $excluded_categories ); - $where = apply_filters( 'get_next_post_where', "WHERE p.post_date > '$current_post_date' AND p.post_type = 'post' AND p.post_status = 'publish' $posts_in_ex_cats_sql AND p.ID != $post->ID", $in_same_cat, $excluded_categories ); - $sort = apply_filters( 'get_next_post_sort', 'ORDER BY p.post_date ASC LIMIT 1' ); + $adjacent = $previous ? 'previous' : 'next'; + $op = $previous ? '<' : '>'; + $order = $previous ? 'DESC' : 'ASC'; - return @$wpdb->get_row("SELECT p.ID, p.post_title FROM $wpdb->posts AS p $join $where $sort"); -} + $join = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories ); + $where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = 'post' AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date), $in_same_cat, $excluded_categories ); + $sort = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" ); + return $wpdb->get_row("SELECT p.* FROM $wpdb->posts AS p $join $where $sort"); +} function previous_post_link($format='« %link', $link='%title', $in_same_cat = false, $excluded_categories = '') { - - if ( is_attachment() ) - $post = & get_post($GLOBALS['post']->post_parent); - else - $post = get_previous_post($in_same_cat, $excluded_categories); - - if ( !$post ) - return; - - $title = $post->post_title; - - if ( empty($post->post_title) ) - $title = __('Previous Post'); - - $title = apply_filters('the_title', $title, $post); - $string = ''; - $link = str_replace('%title', $title, $link); - $link = $pre . $string . $link . ''; - - $format = str_replace('%link', $link, $format); - - echo $format; + adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true); } function next_post_link($format='%link »', $link='%title', $in_same_cat = false, $excluded_categories = '') { - $post = get_next_post($in_same_cat, $excluded_categories); + adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false); +} + +function adjacent_post_link($format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true) { + if ( $previous && is_attachment() ) + $post = & get_post($GLOBALS['post']->post_parent); + else + $post = get_adjacent_post($in_same_cat, $excluded_categories, $previous); if ( !$post ) return; @@ -456,12 +590,13 @@ function next_post_link($format='%link »', $link='%title', $in_same_cat = $title = $post->post_title; if ( empty($post->post_title) ) - $title = __('Next Post'); + $title = $previous ? __('Previous Post') : __('Next Post'); $title = apply_filters('the_title', $title, $post); - $string = ''; + $string = ''; $link = str_replace('%title', $title, $link); $link = $string . $link . ''; + $format = str_replace('%link', $link, $format); echo $format; @@ -475,7 +610,7 @@ function get_pagenum_link($pagenum = 1) { $request = remove_query_arg( 'paged' ); $home_root = parse_url(get_option('home')); - $home_root = $home_root['path']; + $home_root = ( isset($home_root['path']) ) ? $home_root['path'] : ''; $home_root = preg_quote( trailingslashit( $home_root ), '|' ); $request = preg_replace('|^'. $home_root . '|', '', $request); @@ -493,14 +628,14 @@ function get_pagenum_link($pagenum = 1) { $qs_regex = '|\?.*?$|'; preg_match( $qs_regex, $request, $qs_match ); - if ( $qs_match[0] ) { + if ( !empty( $qs_match[0] ) ) { $query_string = $qs_match[0]; $request = preg_replace( $qs_regex, '', $request ); } else { $query_string = ''; } - $request = preg_replace( '|page/(.+)/?$|', '', $request); + $request = preg_replace( '|page/\d+/?$|', '', $request); $request = preg_replace( '|^index\.php|', '', $request); $request = ltrim($request, '/'); @@ -516,11 +651,13 @@ function get_pagenum_link($pagenum = 1) { $result = $base . $request . $query_string; } + $result = apply_filters('get_pagenum_link', $result); + return $result; } function get_next_posts_page_link($max_page = 0) { - global $paged, $pagenow; + global $paged; if ( !is_single() ) { if ( !$paged ) @@ -536,7 +673,7 @@ function next_posts($max_page = 0) { } function next_posts_link($label='Next Page »', $max_page=0) { - global $paged, $wpdb, $wp_query; + global $paged, $wp_query; if ( !$max_page ) { $max_page = $wp_query->max_num_pages; } @@ -551,7 +688,7 @@ function next_posts_link($label='Next Page »', $max_page=0) { } function get_previous_posts_page_link() { - global $paged, $pagenow; + global $paged; if ( !is_single() ) { $nextpage = intval($paged) - 1;