diff --git a/wp-includes/comment-template.php b/wp-includes/comment-template.php index 75cf57c229..1e2e4a27b8 100644 --- a/wp-includes/comment-template.php +++ b/wp-includes/comment-template.php @@ -441,21 +441,40 @@ function comment_ID() { * @uses $comment * * @param object|string|int $comment Comment to retrieve. - * @param string|int $page The comment's page if known. Optional. Avoids extra database query. + * @param array $args Optional args. * @return string The permalink to the current comment */ -function get_comment_link( $comment = null, $page = null ) { - global $wp_rewrite; +function get_comment_link( $comment = null, $args = array() ) { + global $wp_rewrite, $in_comment_loop; $comment = get_comment($comment); - if ( get_option('page_comments') ) { - $page = ( null !== $page ) ? (int) $page : get_page_of_comment( $comment->comment_ID ); + // Backwards compat + if ( !is_array($args) ) { + $page = $args; + $args = array(); + $args['page'] = $page; + } + + $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '' ); + $args = wp_parse_args( $args, $defaults ); + + if ( '' === $args['per_page'] && get_option('page_comments') ) + $args['per_page'] = get_query_var('comments_per_page'); + + if ( empty($args['per_page']) ) { + $args['per_page'] = 0; + $args['page'] = 0; + } + + if ( $args['per_page'] ) { + if ( '' == $args['page'] ) + $args['page'] = ( !empty($in_comment_loop) ) ? get_query_var('cpage') : get_page_of_comment( $comment->comment_ID, $args ); if ( $wp_rewrite->using_permalinks() ) - return user_trailingslashit( trailingslashit( get_permalink( $comment->comment_post_ID ) ) . "comment-page-$page", 'comment' ) . '#comment-' . $comment->comment_ID; + return user_trailingslashit( trailingslashit( get_permalink( $comment->comment_post_ID ) ) . 'comment-page-' . $args['page'], 'comment' ) . '#comment-' . $comment->comment_ID; else - return add_query_arg( 'cpage', $page, get_permalink( $comment->comment_post_ID ) ) . '#comment-' . $comment->comment_ID; + return add_query_arg( 'cpage', $args['page'], get_permalink( $comment->comment_post_ID ) ) . '#comment-' . $comment->comment_ID; } else { return get_permalink( $comment->comment_post_ID ) . '#comment-' . $comment->comment_ID; } @@ -1162,7 +1181,7 @@ class Walker_Comment extends Walker {
-
+
@@ -1209,7 +1228,9 @@ class Walker_Comment extends Walker { * @param array $comments Optional array of comment objects. Defaults to $wp_query->comments */ function wp_list_comments($args = array(), $comments = null ) { - global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage; + global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop; + + $in_comment_loop = true; $comment_alt = $comment_thread_alt = 0; $comment_depth = 1; @@ -1285,6 +1306,8 @@ function wp_list_comments($args = array(), $comments = null ) { $walker->paged_walk($_comments, $max_depth, $page, $per_page, $r); $wp_query->max_num_comment_pages = $walker->max_pages; + + $in_comment_loop = false; } -?> +?> \ No newline at end of file diff --git a/wp-includes/comment.php b/wp-includes/comment.php index 7c8c2a3033..561da2402c 100644 --- a/wp-includes/comment.php +++ b/wp-includes/comment.php @@ -548,37 +548,55 @@ function get_comment_pages_count( $comments = null, $per_page = null, $threaded * @uses get_page_of_comment() Used to loop up to top level comment. * * @param int $comment_ID Comment ID. - * @param int $per_page Optional comments per page. + * @param array $args Optional args. * @return int|null Comment page number or null on error. */ -function get_page_of_comment( $comment_ID, $per_page = null, $threaded = null ) { +function get_page_of_comment( $comment_ID, $args = array() ) { global $wpdb; if ( !$comment = get_comment( $comment_ID ) ) return; - if ( !get_option('page_comments') ) + $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '' ); + $args = wp_parse_args( $args, $defaults ); + + if ( '' === $args['per_page'] && get_option('page_comments') ) + $args['per_page'] = get_query_var('comments_per_page'); + if ( empty($args['per_page']) ) { + $args['per_page'] = 0; + $args['page'] = 0; + } + if ( $args['per_page'] < 1 ) return 1; - if ( null === $per_page ) - $per_page = get_option('comments_per_page'); - - if ( null === $threaded ) - $threaded = get_option('thread_comments'); + if ( '' === $args['max_depth'] ) { + if ( get_option('thread_comments') ) + $args['max_depth'] = get_option('thread_comments_depth'); + else + $args['max_depth'] = -1; + } // Find this comment's top level parent if threading is enabled - if ( $threaded && 0 != $comment->comment_parent ) - return get_page_of_comment( $comment->comment_parent, $per_page, $threaded ); + if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent ) + return get_page_of_comment( $comment->comment_parent, $args ); + + $allowedtypes = array( + 'comment' => '', + 'pingback' => 'pingback', + 'trackback' => 'trackback', + ); + + $comtypewhere = ( 'all' != $args['type'] && isset($allowedtypes[$args['type']]) ) ? " AND comment_type = '" . $allowedtypes[$args['type']] . "'" : ''; // Count comments older than this one - $oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_date_gmt < '%s'", $comment->comment_post_ID, $comment->comment_date_gmt ) ); + $oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_date_gmt < '%s'" . $comtypewhere, $comment->comment_post_ID, $comment->comment_date_gmt ) ); // No older comments? Then it's page #1. if ( 0 == $oldercoms ) return 1; // Divide comments older than this one by comments per page to get this comment's page number - return ceil( ( $oldercoms + 1 ) / $per_page ); + return ceil( ( $oldercoms + 1 ) / $args['per_page'] ); } /**