From 093de0f0bec07c7fc69e10dd0097454ee2f3054b Mon Sep 17 00:00:00 2001 From: Boone Gorges Date: Sun, 14 Dec 2014 19:00:31 +0000 Subject: [PATCH] In `WP_Meta_Query`, interpret 'value' correctly when used with EXISTS/NOT EXISTS. As in earlier versions, EXISTS with a value is equivalent to '=', while NOT EXISTS should always ignore 'value'. Props barrykooij. Fixes #30681 for trunk. git-svn-id: https://develop.svn.wordpress.org/trunk@30846 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/meta.php | 11 +++++ tests/phpunit/tests/post/query.php | 65 ++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php index 44fb7d2ddf..1637413d78 100644 --- a/src/wp-includes/meta.php +++ b/src/wp-includes/meta.php @@ -1419,6 +1419,17 @@ class WP_Meta_Query { $where = $wpdb->prepare( '%s', $meta_value ); break; + // EXISTS with a value is interpreted as '='. + case 'EXISTS' : + $meta_compare = '='; + $where = $wpdb->prepare( '%s', $meta_value ); + break; + + // 'value' is ignored for NOT EXISTS. + case 'NOT EXISTS' : + $where = ''; + break; + default : $where = $wpdb->prepare( '%s', $meta_value ); break; diff --git a/tests/phpunit/tests/post/query.php b/tests/phpunit/tests/post/query.php index 723d0613fa..722cad77ef 100644 --- a/tests/phpunit/tests/post/query.php +++ b/tests/phpunit/tests/post/query.php @@ -537,6 +537,71 @@ class Tests_Post_Query extends WP_UnitTestCase { $this->assertEqualSets( $expected, $query->posts ); } + /** + * @ticket 30681 + */ + public function test_meta_query_compare_exists() { + $posts = $this->factory->post->create_many( 3 ); + add_post_meta( $posts[0], 'foo', 'bar' ); + add_post_meta( $posts[2], 'foo', 'baz' ); + + $query = new WP_Query( array( + 'fields' => 'ids', + 'meta_query' => array( + array( + 'compare' => 'EXISTS', + 'key' => 'foo', + ), + ), + ) ); + + $this->assertEqualSets( array( $posts[0], $posts[2] ), $query->posts ); + } + + /** + * @ticket 30681 + */ + public function test_meta_query_compare_exists_with_value_should_convert_to_equals() { + $posts = $this->factory->post->create_many( 3 ); + add_post_meta( $posts[0], 'foo', 'bar' ); + add_post_meta( $posts[2], 'foo', 'baz' ); + + $query = new WP_Query( array( + 'fields' => 'ids', + 'meta_query' => array( + array( + 'compare' => 'EXISTS', + 'value' => 'baz', + 'key' => 'foo', + ), + ), + ) ); + + $this->assertEqualSets( array( $posts[2] ), $query->posts ); + } + + /** + * @ticket 30681 + */ + public function test_meta_query_compare_not_exists_should_ignore_value() { + $posts = $this->factory->post->create_many( 3 ); + add_post_meta( $posts[0], 'foo', 'bar' ); + add_post_meta( $posts[2], 'foo', 'baz' ); + + $query = new WP_Query( array( + 'fields' => 'ids', + 'meta_query' => array( + array( + 'compare' => 'NOT EXISTS', + 'value' => 'bar', + 'key' => 'foo', + ), + ), + ) ); + + $this->assertEqualSets( array( $posts[1] ), $query->posts ); + } + /** * @ticket 18158 * @group meta