summaryrefslogtreecommitdiffstats
path: root/wp-includes/link-template.php
diff options
context:
space:
mode:
authordonncha <donncha@7be80a69-a1ef-0310-a953-fb0f7c49ff36>2008-04-04 16:44:15 +0000
committerdonncha <donncha@7be80a69-a1ef-0310-a953-fb0f7c49ff36>2008-04-04 16:44:15 +0000
commit7740e89de3e1bc0cc636120e3ca8ab9e97e4d3cc (patch)
treec6fd23b598f3994eddb18cb1c0f2e8d95ff054fa /wp-includes/link-template.php
parentf650f48c048bfbbb2ae702b6425d87e39358d748 (diff)
downloadwordpress-mu-7740e89de3e1bc0cc636120e3ca8ab9e97e4d3cc.tar.gz
wordpress-mu-7740e89de3e1bc0cc636120e3ca8ab9e97e4d3cc.tar.xz
wordpress-mu-7740e89de3e1bc0cc636120e3ca8ab9e97e4d3cc.zip
Merged with WordPress 2.5, unstable, only for testing
git-svn-id: http://svn.automattic.com/wordpress-mu/trunk@1218 7be80a69-a1ef-0310-a953-fb0f7c49ff36
Diffstat (limited to 'wp-includes/link-template.php')
-rw-r--r--wp-includes/link-template.php379
1 files changed, 258 insertions, 121 deletions
diff --git a/wp-includes/link-template.php b/wp-includes/link-template.php
index 6a0677b..23bfbf7 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 '<a id="'.$title.'"></a>';
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,7 +73,7 @@ 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
@@ -82,8 +82,19 @@ function get_permalink($id = 0) {
$category = get_category_parents($parent, FALSE, '/', TRUE) . $category;
}
- $authordata = get_userdata($post->post_author);
- $author = $authordata->user_nicename;
+ // 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;
+ }
+
$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 ( ctype_digit($object->post_name) || false !== strpos(get_option('permalink_structure'), '%category%') )
+ $name = 'attachment/' . $object->post_name; // <permalink>/<int>/ 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 "<a href='$url'>$link_text</a>";
+}
- 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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;$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 = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . __( 'Edit post' ) . '">' . $link . '</a>';
@@ -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.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='&laquo; %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 = '<a href="'.get_permalink($post->ID).'">';
- $link = str_replace('%title', $title, $link);
- $link = $pre . $string . $link . '</a>';
-
- $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 &raquo;', $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 &raquo;', $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 = '<a href="'.get_permalink($post->ID).'">';
+ $string = '<a href="'.get_permalink($post).'">';
$link = str_replace('%title', $title, $link);
$link = $string . $link . '</a>';
+
$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 &raquo;', $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 &raquo;', $max_page=0) {
}
function get_previous_posts_page_link() {
- global $paged, $pagenow;
+ global $paged;
if ( !is_single() ) {
$nextpage = intval($paged) - 1;