If `post__in` or `post_parent__in` is passed to `WP_Query` as an empty array, nuke the query. Both vars are currently only checked for truthiness after which they are ignored. Setting these vars at all indicates explicit filtering being desired.

Adds unit test.

Fixes #28099.


git-svn-id: https://develop.svn.wordpress.org/trunk@28613 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Scott Taylor 2014-05-29 06:03:15 +00:00
parent 4d1e46231b
commit 8530693a51
2 changed files with 15 additions and 0 deletions

View File

@ -2448,6 +2448,9 @@ class WP_Query {
} elseif ( $q['post__in'] ) {
$post__in = implode(',', array_map( 'absint', $q['post__in'] ));
$where .= " AND {$wpdb->posts}.ID IN ($post__in)";
} elseif ( isset( $this->query['post__in'] ) ) {
$post__in = 0;
$where .= " AND 1=0 ";
} elseif ( $q['post__not_in'] ) {
$post__not_in = implode(',', array_map( 'absint', $q['post__not_in'] ));
$where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)";
@ -2458,6 +2461,9 @@ class WP_Query {
} elseif ( $q['post_parent__in'] ) {
$post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) );
$where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)";
} elseif ( isset( $this->query['post_parent__in'] ) ) {
$post_parent__in = 0;
$where .= " AND 1=0 ";
} elseif ( $q['post_parent__not_in'] ) {
$post_parent__not_in = implode( ',', array_map( 'absint', $q['post_parent__not_in'] ) );
$where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)";

View File

@ -402,6 +402,15 @@ class Tests_Query_Results extends WP_UnitTestCase {
}
function test_empty_post__in() {
$posts1 = $this->q->query( array() );
$this->assertNotEmpty( $posts1 );
$posts2 = $this->q->query( array( 'post__in' => array() ) );
$this->assertEmpty( $posts2 );
$posts3 = $this->q->query( array( 'post_parent__in' => array() ) );
$this->assertEmpty( $posts3 );
}
function test_exlude_from_search_empty() {
global $wp_post_types;
foreach ( array_keys( $wp_post_types ) as $slug )