Skip to content

Commit dbac896

Browse files
committed
Allow comment query results to be limited to comments with comment_post_ID = 0.
Previously, this was not possible due to an overly broad `empty()` check. Passing `null`, `false`, or `''` to 'post_id', or omitting 'post_id' altogether, will continue to return comments regardless of `comment_post_ID`, as before. Passing `0` or `'0'` will limit results to comments with no associated post. Props danielbachhuber. Fixes #35090. git-svn-id: https://develop.svn.wordpress.org/trunk@36381 602fd350-edb4-49c9-b593-d223f7449a82
1 parent ad00fff commit dbac896

2 files changed

Lines changed: 74 additions & 7 deletions

File tree

src/wp-includes/class-wp-comment-query.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public function __call( $name, $arguments ) {
214214
* Default empty.
215215
* @type int $post_ID Currently unused.
216216
* @type int $post_id Limit results to those affiliated with a given post ID.
217-
* Default 0.
217+
* Default null.
218218
* @type array $post__in Array of post IDs to include affiliated comments for.
219219
* Default empty.
220220
* @type array $post__not_in Array of post IDs to exclude affiliated comments for.
@@ -276,7 +276,7 @@ public function __construct( $query = '' ) {
276276
'post_author__in' => '',
277277
'post_author__not_in' => '',
278278
'post_ID' => '',
279-
'post_id' => 0,
279+
'post_id' => null,
280280
'post__in' => '',
281281
'post__not_in' => '',
282282
'post_author' => '',
@@ -645,9 +645,8 @@ protected function get_comment_ids() {
645645
$fields = "$wpdb->comments.comment_ID";
646646
}
647647

648-
$post_id = absint( $this->query_vars['post_id'] );
649-
if ( ! empty( $post_id ) ) {
650-
$this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $post_id );
648+
if ( strlen( $this->query_vars['post_id'] ) ) {
649+
$this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $this->query_vars['post_id'] );
651650
}
652651

653652
// Parse comment IDs for an IN clause.

tests/phpunit/tests/comment/query.php

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,84 @@ public function test_query() {
3636
$this->assertEqualSets( array( $c1, $c2, $c3, $c4, $c5 ), $found );
3737
}
3838

39-
public function test_query_post_id_0() {
39+
/**
40+
* @ticket 35090
41+
*/
42+
public function test_post_id_0_should_return_comments_with_no_parent() {
4043
$c1 = self::factory()->comment->create( array( 'comment_post_ID' => self::$post_id, 'comment_approved' => '1' ) );
44+
$c2 = self::factory()->comment->create( array( 'comment_post_ID' => 0, 'comment_approved' => '1' ) );
4145

4246
$q = new WP_Comment_Query();
4347
$found = $q->query( array(
4448
'post_id' => 0,
4549
'fields' => 'ids',
4650
) );
4751

48-
$this->assertEqualSets( array( $c1 ), $found );
52+
$this->assertEqualSets( array( $c2 ), $found );
53+
}
54+
55+
/**
56+
* @ticket 35090
57+
*/
58+
public function test_post_id_string_0_should_return_comments_with_no_parent() {
59+
$c1 = self::factory()->comment->create( array( 'comment_post_ID' => self::$post_id, 'comment_approved' => '1' ) );
60+
$c2 = self::factory()->comment->create( array( 'comment_post_ID' => 0, 'comment_approved' => '1' ) );
61+
62+
$q = new WP_Comment_Query();
63+
$found = $q->query( array(
64+
'post_id' => '0',
65+
'fields' => 'ids',
66+
) );
67+
68+
$this->assertEqualSets( array( $c2 ), $found );
69+
}
70+
71+
/**
72+
* @ticket 35090
73+
*/
74+
public function test_post_id_null_should_be_ignored() {
75+
$c1 = self::factory()->comment->create( array( 'comment_post_ID' => self::$post_id, 'comment_approved' => '1' ) );
76+
$c2 = self::factory()->comment->create( array( 'comment_post_ID' => 0, 'comment_approved' => '1' ) );
77+
78+
$q = new WP_Comment_Query();
79+
$found = $q->query( array(
80+
'post_id' => null,
81+
'fields' => 'ids',
82+
) );
83+
84+
$this->assertEqualSets( array( $c1, $c2 ), $found );
85+
}
86+
87+
/**
88+
* @ticket 35090
89+
*/
90+
public function test_post_id_false_should_be_ignored() {
91+
$c1 = self::factory()->comment->create( array( 'comment_post_ID' => self::$post_id, 'comment_approved' => '1' ) );
92+
$c2 = self::factory()->comment->create( array( 'comment_post_ID' => 0, 'comment_approved' => '1' ) );
93+
94+
$q = new WP_Comment_Query();
95+
$found = $q->query( array(
96+
'post_id' => false,
97+
'fields' => 'ids',
98+
) );
99+
100+
$this->assertEqualSets( array( $c1, $c2 ), $found );
101+
}
102+
103+
/**
104+
* @ticket 35090
105+
*/
106+
public function test_post_id_empty_string_should_be_ignored() {
107+
$c1 = self::factory()->comment->create( array( 'comment_post_ID' => self::$post_id, 'comment_approved' => '1' ) );
108+
$c2 = self::factory()->comment->create( array( 'comment_post_ID' => 0, 'comment_approved' => '1' ) );
109+
110+
$q = new WP_Comment_Query();
111+
$found = $q->query( array(
112+
'post_id' => '',
113+
'fields' => 'ids',
114+
) );
115+
116+
$this->assertEqualSets( array( $c1, $c2 ), $found );
49117
}
50118

51119
/**

0 commit comments

Comments
 (0)