+ if ( $this->query_vars['count'] ) {
+ $fields = 'COUNT(*)';
+ } else {
+ switch ( strtolower( $this->query_vars['fields'] ) ) {
+ case 'ids':
+ $fields = "$wpdb->comments.comment_ID";
+ break;
+ default:
+ $fields = "*";
+ break;
+ }
+ }
+
+ $join = '';
+ $where = $approved;
+
+ $post_id = absint( $this->query_vars['post_id'] );
+ if ( ! empty( $post_id ) ) {
+ $where .= $wpdb->prepare( ' AND comment_post_ID = %d', $post_id );
+ }
+
+ if ( '' !== $this->query_vars['author_email'] ) {
+ $where .= $wpdb->prepare( ' AND comment_author_email = %s', $this->query_vars['author_email'] );
+ }
+
+ if ( '' !== $this->query_vars['karma'] ) {
+ $where .= $wpdb->prepare( ' AND comment_karma = %d', $this->query_vars['karma'] );
+ }
+
+ if ( 'comment' == $this->query_vars['type'] ) {
+ $where .= " AND comment_type = ''";
+ } elseif( 'pings' == $this->query_vars['type'] ) {
+ $where .= ' AND comment_type IN ("pingback", "trackback")';
+ } elseif ( ! empty( $this->query_vars['type'] ) ) {
+ $where .= $wpdb->prepare( ' AND comment_type = %s', $this->query_vars['type'] );
+ }
+
+ if ( '' !== $this->query_vars['parent'] ) {
+ $where .= $wpdb->prepare( ' AND comment_parent = %d', $this->query_vars['parent'] );
+ }
+
+ if ( is_array( $this->query_vars['user_id'] ) ) {
+ $where .= ' AND user_id IN (' . implode( ',', array_map( 'absint', $this->query_vars['user_id'] ) ) . ')';
+ } elseif ( '' !== $this->query_vars['user_id'] ) {
+ $where .= $wpdb->prepare( ' AND user_id = %d', $this->query_vars['user_id'] );
+ }
+
+ if ( '' !== $this->query_vars['search'] ) {
+ $where .= $this->get_search_sql(
+ $this->query_vars['search'],
+ array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' )
+ );
+ }
+
+ $plucked = wp_array_slice_assoc( $this->query_vars, array( 'post_author', 'post_name', 'post_parent', 'post_status', 'post_type' ) );
+ $post_fields = array_filter( $plucked );
+
+ if ( ! empty( $post_fields ) ) {
+ $join = "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID";
+ foreach( $post_fields as $field_name => $field_value )
+ $where .= $wpdb->prepare( " AND {$wpdb->posts}.{$field_name} = %s", $field_value );
+ }
+
+ if ( ! empty( $this->meta_query->queries ) ) {
+ $clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this );
+ $join .= $clauses['join'];
+ $where .= $clauses['where'];
+ $groupby = "{$wpdb->comments}.comment_ID";
+ }
+
+ $date_query = $this->query_vars['date_query'];
+ if ( ! empty( $date_query ) && is_array( $date_query ) ) {
+ $date_query_object = new WP_Date_Query( $date_query, 'comment_date' );
+ $where .= $date_query_object->get_sql();
+ }
+
+ $pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits', 'groupby' );
+ /**
+ * Filter the comment query clauses.
+ *
+ * @since 3.1.0
+ *
+ * @param array $pieces A compacted array of comment query clauses.
+ * @param WP_Comment_Query &$this Current instance of WP_Comment_Query, passed by reference.
+ */
+ $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) );
+
+ $fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';
+ $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';
+ $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';
+ $orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : '';
+ $order = isset( $clauses[ 'order' ] ) ? $clauses[ 'order' ] : '';
+ $limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';
+ $groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : '';
+
+ if ( $groupby ) {
+ $groupby = 'GROUP BY ' . $groupby;
+ }
+ $query = "SELECT $fields FROM $wpdb->comments $join WHERE $where $groupby ORDER BY $orderby $order $limits";
+
+ if ( $this->query_vars['count'] ) {
+ return $wpdb->get_var( $query );
+ }
+
+ if ( 'ids' == $this->query_vars['fields'] ) {
+ $this->comments = $wpdb->get_col( $query );
+ return array_map( 'intval', $this->comments );
+ }
+
+ $results = $wpdb->get_results( $query );
+ /**
+ * Filter the comment query results.
+ *
+ * @since 3.1.0
+ *
+ * @param array $results An array of comments.
+ * @param WP_Comment_Query &$this Current instance of WP_Comment_Query, passed by reference.
+ */
+ $comments = apply_filters_ref_array( 'the_comments', array( $results, &$this ) );
+
+ wp_cache_add( $cache_key, $comments, 'comment' );
+
+ return $comments;