diff --git a/wp-includes/comment-template.php b/wp-includes/comment-template.php
index d57aff5f72..0782f33eb4 100644
--- a/wp-includes/comment-template.php
+++ b/wp-includes/comment-template.php
@@ -290,7 +290,9 @@ function comments_template( $file = '/comments.php' ) {
$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND ( comment_approved = '1' OR ( comment_author = '$author_db' AND comment_author_email = '$email_db' AND comment_approved = '0' ) ) ORDER BY comment_date");
}
- $comments = apply_filters( 'comments_array', $comments, $post->ID );
+ // keep $comments for legacy's sake (remember $table*? ;) )
+ $comments = $wp_query->comments = apply_filters( 'comments_array', $comments, $post->ID );
+ $wp_query->comment_count = count($wp_query->comments);
define('COMMENTS_TEMPLATE', true);
$include = apply_filters('comments_template', TEMPLATEPATH . $file );
diff --git a/wp-includes/feed-atom-comments.php b/wp-includes/feed-atom-comments.php
index 460b8e5b93..7687a8c09a 100644
--- a/wp-includes/feed-atom-comments.php
+++ b/wp-includes/feed-atom-comments.php
@@ -8,11 +8,12 @@ echo ''
>
query_vars['s']));
+ else
+ printf(__('Comments for %s'), get_bloginfo_rss( 'name' ) . get_wp_title_rss());
?>
@@ -24,39 +25,14 @@ echo ''
get_results("SELECT comment_ID, comment_author, comment_author_email,
- comment_author_url, comment_date, comment_date_gmt, comment_content, comment_post_ID,
- $wpdb->posts.ID, $wpdb->posts.post_password FROM $wpdb->comments
- LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE comment_post_ID = '" . get_the_ID() . "'
- AND $wpdb->comments.comment_approved = '1' AND $wpdb->posts.post_status = 'publish'
- AND post_date_gmt < '" . gmdate("Y-m-d H:i:59") . "'
- ORDER BY comment_date_gmt ASC" );
- } else { // if no post id passed in, we'll just use the last posts_per_rss comments.
- $comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_author_email,
- comment_author_url, comment_date, comment_date_gmt, comment_content, comment_post_ID,
- $wpdb->posts.ID, $wpdb->posts.post_password FROM $wpdb->comments
- LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE $wpdb->posts.post_status = 'publish'
- AND $wpdb->comments.comment_approved = '1' AND post_date_gmt < '" . gmdate("Y-m-d H:i:s") . "'
- ORDER BY comment_date_gmt DESC LIMIT " . get_option('posts_per_rss') );
- }
-
- if ($comments) {
- foreach ($comments as $comment) {
- $GLOBALS['comment'] =& $comment;
- get_post_custom($comment->comment_post_ID);
+if ( have_comments() ) : while ( have_comments() ) : the_comment();
+ $comment_post = get_post($comment->comment_post_ID);
+ get_post_custom($comment_post->ID);
?>
comment_post_ID);
+ if ( !is_singular() ) {
+ $title = get_the_title($comment_post->ID);
$title = apply_filters('the_title', $title);
$title = apply_filters('the_title_rss', $title);
printf(__('Comment on %1$s by %2$s'), $title, get_comment_author_rss());
@@ -69,23 +45,19 @@ if (have_posts()) :
' . get_comment_author_url() . ''; ?>
+
-
- post_password) && $_COOKIE['wp-postpass'] != $comment->post_password) { ?>
+post_password) && $_COOKIE['wp-postpass'] != $comment_post->post_password) : ?>
]]>
-
+
]]>
-
-
-comment_ID, $comment_post->ID);
?>
-
\ No newline at end of file
+
+
+
diff --git a/wp-includes/feed-rss2-comments.php b/wp-includes/feed-rss2-comments.php
index 4e49898492..50f5e3dae8 100644
--- a/wp-includes/feed-rss2-comments.php
+++ b/wp-includes/feed-rss2-comments.php
@@ -7,77 +7,49 @@ echo '';
-
-
+ query_vars['s']));
+ else
+ printf(__('Comments for %s'), get_bloginfo_rss( 'name' ) . get_wp_title_rss());
+ ?>
http://wordpress.org/?v=
get_results("SELECT comment_ID, comment_author, comment_author_email,
- comment_author_url, comment_date, comment_date_gmt, comment_content, comment_post_ID,
- $wpdb->posts.ID, $wpdb->posts.post_password FROM $wpdb->comments
- LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE comment_post_ID = '" . get_the_ID() . "'
- AND $wpdb->comments.comment_approved = '1' AND $wpdb->posts.post_status = 'publish'
- AND post_date_gmt < '" . gmdate("Y-m-d H:i:59") . "'
- ORDER BY comment_date_gmt ASC" );
- } else { // if no post id passed in, we'll just ue the last 10 comments.
- $comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_author_email,
- comment_author_url, comment_date, comment_date_gmt, comment_content, comment_post_ID,
- $wpdb->posts.ID, $wpdb->posts.post_password FROM $wpdb->comments
- LEFT JOIN $wpdb->posts ON comment_post_id = id WHERE $wpdb->posts.post_status = 'publish'
- AND $wpdb->comments.comment_approved = '1' AND post_date_gmt < '" . gmdate("Y-m-d H:i:s") . "'
- ORDER BY comment_date_gmt DESC LIMIT " . get_option('posts_per_rss') );
- }
- // this line is WordPress' motor, do not delete it.
- if ($comments) {
- foreach ($comments as $comment) {
- $GLOBALS['comment'] =& $comment;
- // Some plugins may need to know the metadata
- // associated with this comment's post:
- get_post_custom($comment->comment_post_ID);
+if ( have_comments() ) : while ( have_comments() ) : the_comment();
+ $comment_post = get_post($comment->comment_post_ID);
+ get_post_custom($comment_post->ID);
?>
-
- comment_post_ID);
- $title = apply_filters('the_title', $title);
- $title = apply_filters('the_title_rss', $title);
- printf(__('Comment on %1$s by %2$s'), $title, get_comment_author_rss());
- } else {
- printf(__('By: %s'), get_comment_author_rss());
- } ?>
+ ID);
+ $title = apply_filters('the_title', $title);
+ $title = apply_filters('the_title_rss', $title);
+ printf(__('Comment on %1$s by %2$s'), $title, get_comment_author_rss());
+ } else {
+ printf(__('By: %s'), get_comment_author_rss());
+ }
+ ?>
- post_password) && $_COOKIE['wp-postpass'] != $comment->post_password) {
- ?>
+post_password) && $_COOKIE['wp-postpass'] != $comment_post->post_password) : ?>
]]>
-
+
]]>
- comment_ID, $comment->comment_post_ID);
- ?>
-
-comment_ID, $comment_post->ID);
?>
+
+
diff --git a/wp-includes/feed.php b/wp-includes/feed.php
index d2efe7cf14..125ae7766e 100644
--- a/wp-includes/feed.php
+++ b/wp-includes/feed.php
@@ -10,6 +10,11 @@ function bloginfo_rss($show = '') {
echo get_bloginfo_rss($show);
}
+function get_wp_title_rss($sep = '»') {
+ $title = wp_title($sep, false);
+ $title = apply_filters('get_wp_title_rss', $title);
+ return $title;
+}
function get_the_title_rss() {
$title = get_the_title();
diff --git a/wp-includes/functions.php b/wp-includes/functions.php
index 027c28c6be..8179b93596 100644
--- a/wp-includes/functions.php
+++ b/wp-includes/functions.php
@@ -939,29 +939,18 @@ function bool_from_yn($yn) {
}
function do_feed() {
+ global $wp_query;
+
$feed = get_query_var('feed');
// Remove the pad, if present.
$feed = preg_replace('/^_+/', '', $feed);
if ( $feed == '' || $feed == 'feed' )
- $feed = 'rss2';
-
- $for_comments = false;
-
- if ( is_singular() || get_query_var('withcomments') == 1 )
- $for_comments = true;
-
- if ( false !== strpos($feed, 'comments-') ) {
- $for_comments = true;
- $feed = str_replace('comments-', '', $feed);
- }
-
- if ( get_query_var('withoutcomments') == 1 )
- $for_comments = false;
+ $feed = 'rss2';
$hook = 'do_feed_' . $feed;
- do_action($hook, $for_comments);
+ do_action($hook, $wp_query->is_comment_feed);
}
function do_feed_rdf() {
diff --git a/wp-includes/query.php b/wp-includes/query.php
index dbb028537e..16eb543f99 100644
--- a/wp-includes/query.php
+++ b/wp-includes/query.php
@@ -10,6 +10,12 @@ function get_query_var($var) {
return $wp_query->get($var);
}
+function set_query_var($var, $value) {
+ global $wp_query;
+
+ return $wp_query->set($var, $value);
+}
+
function &query_posts($query) {
unset($GLOBALS['wp_query']);
$GLOBALS['wp_query'] =& new WP_Query();
@@ -249,6 +255,20 @@ function the_post() {
$wp_query->the_post();
}
+/*
+ * Comments loop.
+ */
+
+function have_comments() {
+ global $wp_query;
+ return $wp_query->have_comments();
+}
+
+function the_comment() {
+ global $wp_query;
+ return $wp_query->the_comment();
+}
+
/*
* WP_Query
*/
@@ -265,6 +285,11 @@ class WP_Query {
var $current_post = -1;
var $in_the_loop = false;
var $post;
+
+ var $comments;
+ var $comment_count = 0;
+ var $current_comment = -1;
+ var $comment;
var $found_posts = 0;
var $max_num_pages = 0;
@@ -282,6 +307,7 @@ class WP_Query {
var $is_category = false;
var $is_search = false;
var $is_feed = false;
+ var $is_comment_feed = false;
var $is_trackback = false;
var $is_home = false;
var $is_404 = false;
@@ -305,6 +331,7 @@ class WP_Query {
$this->is_category = false;
$this->is_search = false;
$this->is_feed = false;
+ $this->is_comment_feed = false;
$this->is_trackback = false;
$this->is_home = false;
$this->is_404 = false;
@@ -537,6 +564,14 @@ class WP_Query {
if ( $this->is_single || $this->is_page || $this->is_attachment )
$this->is_singular = true;
+ if ( false !== strpos($qv['feed'], 'comments-') ) {
+ $this->query_vars['feed'] = $qv['feed'] = str_replace('comments-', '', $qv['feed']);
+ $qv['withcomments'] = 1;
+ }
+
+ if ( $this->is_feed && (!empty($qv['withcomments']) || ( empty($qv['withoutcomments']) && $this->is_singular ) ) )
+ $this->is_comment_feed = true;
+
if ( ! ($this->is_singular || $this->is_archive || $this->is_search || $this->is_feed || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup)) {
$this->is_home = true;
}
@@ -966,6 +1001,38 @@ class WP_Query {
$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];
}
}
+
+ // Comments feeds
+ if ( $this->is_comment_feed && ( $this->is_archive || $this->is_search || !$this->is_singular ) ) {
+ if ( $this->is_archive || $this->is_search ) {
+ $cjoin = "LEFT JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) $join ";
+ $cwhere = "WHERE comment_approved = '1' $where";
+ $cgroupby = "GROUP BY $wpdb->comments.comment_id";
+ } else { // Other non singular e.g. front
+ $cjoin = "LEFT JOIN $wpdb->posts ON ( $wpdb->comments.comment_post_ID = $wpdb->posts.ID )";
+ $cwhere = "WHERE post_status = 'publish' AND comment_approved = '1'";
+ $cgroupby = '';
+ }
+
+ $cjoin = apply_filters('comment_feed_join', $cjoin);
+ $cwhere = apply_filters('comment_feed_where', $cwhere);
+ $cgroupby = apply_filters('comment_feed_groupby', $cgroupby);
+
+ $this->comments = (array) $wpdb->get_results("SELECT $distinct $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere $cgroupby ORDER BY comment_date_gmt DESC LIMIT " . get_settings('posts_per_rss'));
+ $this->comment_count = count($this->comments);
+
+ $post_ids = array();
+
+ foreach ($this->comments as $comment)
+ $post_ids[] = (int) $comment->comment_post_ID;
+
+ $post_ids = join(',', $post_ids);
+ $join = '';
+ if ( $post_ids )
+ $where = "AND $wpdb->posts.ID IN ($post_ids) ";
+ else
+ $where = "AND 0";
+ }
// Apply post-paging filters on where and join. Only plugins that
// manipulate paging queries should use these hooks.
@@ -986,12 +1053,22 @@ class WP_Query {
$this->request = apply_filters('posts_request', $request);
$this->posts = $wpdb->get_results($this->request);
+
+ if ( $this->is_comment_feed && $this->is_singular ) {
+ $cjoin = apply_filters('comment_feed_join', '');
+ $cwhere = apply_filters('comment_feed_where', "WHERE comment_post_ID = {$this->posts[0]->ID} AND comment_approved = '1'");
+ $comments_request = "SELECT $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere ORDER BY comment_date_gmt DESC LIMIT " . get_settings('posts_per_rss');
+ $this->comments = $wpdb->get_results($comments_request);
+ $this->comment_count = count($this->comments);
+ }
+
if ( !empty($limits) ) {
$found_posts_query = apply_filters( 'found_posts_query', 'SELECT FOUND_ROWS()' );
$this->found_posts = $wpdb->get_var( $found_posts_query );
$this->found_posts = apply_filters( 'found_posts', $this->found_posts );
$this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']);
}
+
// Check post status to determine if post should be displayed.
if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
$status = get_post_status($this->posts[0]);
@@ -1071,6 +1148,40 @@ class WP_Query {
$this->post = $this->posts[0];
}
}
+
+ function next_comment() {
+ $this->current_comment++;
+
+ $this->comment = $this->comments[$this->current_comment];
+ return $this->comment;
+ }
+
+ function the_comment() {
+ global $comment;
+
+ $comment = $this->next_comment();
+
+ if ($this->current_comment == 0) {
+ do_action('comment_loop_start');
+ }
+ }
+
+ function have_comments() {
+ if ($this->current_comment + 1 < $this->comment_count) {
+ return true;
+ } elseif ($this->current_comment + 1 == $this->comment_count) {
+ $this->rewind_comments();
+ }
+
+ return false;
+ }
+
+ function rewind_comments() {
+ $this->current_comment = -1;
+ if ($this->comment_count > 0) {
+ $this->comment = $this->comments[0];
+ }
+ }
function &query($query) {
$this->parse_query($query);