From dd9e9501c1a9c493791e4d6492c1058fe685b55f Mon Sep 17 00:00:00 2001 From: Boone Gorges Date: Thu, 2 Oct 2014 01:40:56 +0000 Subject: [PATCH] WP_Comment_Query: comment__in, comment__not_in, post__in, post__not_in. Props nofearinc, mordauk, boonebgorges Fixes #25386 git-svn-id: https://develop.svn.wordpress.org/trunk@29808 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment.php | 26 ++++++++++ tests/phpunit/tests/comment/query.php | 72 +++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php index 7c425744bd..57eaaada3f 100644 --- a/src/wp-includes/comment.php +++ b/src/wp-includes/comment.php @@ -257,6 +257,8 @@ class WP_Comment_Query { * Execute the query * * @since 3.1.0 + * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', + * 'post__in', and 'post__not_in' to $query_vars. * * @param string|array $query_vars * @return int|array @@ -268,6 +270,8 @@ class WP_Comment_Query { 'author_email' => '', 'fields' => '', 'ID' => '', + 'comment__in' => '', + 'comment__not_in' => '', 'karma' => '', 'number' => '', 'offset' => '', @@ -276,6 +280,8 @@ class WP_Comment_Query { 'parent' => '', 'post_ID' => '', 'post_id' => 0, + 'post__in' => '', + 'post__not_in' => '', 'post_author' => '', 'post_name' => '', 'post_parent' => '', @@ -408,6 +414,26 @@ class WP_Comment_Query { $where .= $wpdb->prepare( ' AND comment_post_ID = %d', $post_id ); } + // Parse comment IDs for an IN clause. + if ( ! empty( $this->query_vars['comment__in'] ) ) { + $where .= ' AND comment_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['comment__in'] ) ) . ' )'; + } + + // Parse comment IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['comment__not_in'] ) ) { + $where .= ' AND comment_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['comment__not_in'] ) ) . ' )'; + } + + // Parse comment post IDs for an IN clause. + if ( ! empty( $this->query_vars['post__in'] ) ) { + $where .= ' AND comment_post_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__in'] ) ) . ' )'; + } + + // Parse comment post IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['post__not_in'] ) ) { + $where .= ' AND comment_post_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__not_in'] ) ) . ' )'; + } + if ( '' !== $this->query_vars['author_email'] ) { $where .= $wpdb->prepare( ' AND comment_author_email = %s', $this->query_vars['author_email'] ); } diff --git a/tests/phpunit/tests/comment/query.php b/tests/phpunit/tests/comment/query.php index 51140a7cc3..17969a4fdc 100644 --- a/tests/phpunit/tests/comment/query.php +++ b/tests/phpunit/tests/comment/query.php @@ -198,4 +198,76 @@ class Tests_Comment_Query extends WP_UnitTestCase { $this->assertCount( 3, $comment_ids ); $this->assertEqualSets( array( $comment_1, $comment_2, $comment_3 ), $comment_ids ); } + + /** + * @ticket 29189 + */ + function test_fields_comment__in() { + $comment_1 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 7, 'comment_approved' => '1' ) ); + $comment_2 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '1' ) ); + $comment_3 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '1' ) ); + + $comment_ids = get_comments( array( + 'fields' => 'ids', + 'comment__in' => array( $comment_1, $comment_3 ), + ) ); + + $this->assertEqualSets( array( $comment_1, $comment_3 ), $comment_ids ); + } + + /** + * @ticket 29189 + */ + function test_fields_comment__not_in() { + $comment_1 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 7, 'comment_approved' => '1' ) ); + $comment_2 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '1' ) ); + $comment_3 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '1' ) ); + + $comment_ids = get_comments( array( + 'fields' => 'ids', + 'comment__not_in' => array( $comment_2, $comment_3 ), + ) ); + + $this->assertEqualSets( array( $comment_1 ), $comment_ids ); + } + + /** + * @ticket 29189 + */ + function test_fields_post__in() { + $p1 = $this->factory->post->create(); + $p2 = $this->factory->post->create(); + $p3 = $this->factory->post->create(); + + $c1 = $this->factory->comment->create( array( 'comment_post_ID' => $p1, 'user_id' => 7, 'comment_approved' => '1' ) ); + $c2 = $this->factory->comment->create( array( 'comment_post_ID' => $p2, 'user_id' => 1, 'comment_approved' => '1' ) ); + $c3 = $this->factory->comment->create( array( 'comment_post_ID' => $p3, 'user_id' => 1, 'comment_approved' => '1' ) ); + + $comment_ids = get_comments( array( + 'fields' => 'ids', + 'post__in' => array( $p1, $p2 ), + ) ); + + $this->assertEqualSets( array( $c1, $c2 ), $comment_ids ); + } + + /** + * @ticket 29189 + */ + function test_fields_post__not_in() { + $p1 = $this->factory->post->create(); + $p2 = $this->factory->post->create(); + $p3 = $this->factory->post->create(); + + $c1 = $this->factory->comment->create( array( 'comment_post_ID' => $p1, 'user_id' => 7, 'comment_approved' => '1' ) ); + $c2 = $this->factory->comment->create( array( 'comment_post_ID' => $p2, 'user_id' => 1, 'comment_approved' => '1' ) ); + $c3 = $this->factory->comment->create( array( 'comment_post_ID' => $p3, 'user_id' => 1, 'comment_approved' => '1' ) ); + + $comment_ids = get_comments( array( + 'fields' => 'ids', + 'post__not_in' => array( $p1, $p2 ), + ) ); + + $this->assertEqualSets( array( $c3 ), $comment_ids ); + } }