term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } public function test_tax_query_single_query_single_term_field_name() { $t = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'Foo' ), 'field' => 'name', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } /** * @ticket 27810 */ public function test_field_name_should_work_for_names_with_spaces() { register_taxonomy( 'wptests_tax', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax', 'slug' => 'foo', 'name' => 'Foo Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_object_terms( $p1, $t, 'wptests_tax' ); $q = new WP_Query( array( 'fields' => 'ids', 'tax_query' => array( array( 'taxonomy' => 'wptests_tax', 'terms' => array( 'Foo Bar' ), 'field' => 'name', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } public function test_tax_query_single_query_single_term_field_term_taxonomy_id() { $t = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $tt_ids = wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => $tt_ids, 'field' => 'term_taxonomy_id', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } public function test_tax_query_single_query_single_term_field_term_id() { $t = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( $t ), 'field' => 'term_id', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } public function test_tax_query_single_query_single_term_operator_in() { $t = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', 'operator' => 'IN', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } public function test_tax_query_single_query_single_term_operator_not_in() { $t = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', 'operator' => 'NOT IN', ), ), ) ); $this->assertEquals( array( $p2 ), $q->posts ); } public function test_tax_query_single_query_single_term_operator_and() { $t = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); wp_set_post_terms( $p1, $t, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', 'operator' => 'AND', ), ), ) ); $this->assertEquals( array( $p1 ), $q->posts ); } public function test_tax_query_single_query_multiple_terms_operator_in() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_post_terms( $p1, $t1, 'category' ); wp_set_post_terms( $p2, $t2, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo', 'bar' ), 'field' => 'slug', 'operator' => 'IN', ), ), ) ); $this->assertEqualSets( array( $p1, $p2 ), $q->posts ); } public function test_tax_query_single_query_multiple_terms_operator_not_in() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_post_terms( $p1, $t1, 'category' ); wp_set_post_terms( $p2, $t2, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo', 'bar' ), 'field' => 'slug', 'operator' => 'NOT IN', ), ), ) ); $this->assertEquals( array( $p3 ), $q->posts ); } /** * @ticket 18105 */ public function test_tax_query_single_query_multiple_queries_operator_not_in() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_post_terms( $p1, $t1, 'category' ); wp_set_post_terms( $p2, $t2, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', 'operator' => 'NOT IN', ), array( 'taxonomy' => 'category', 'terms' => array( 'bar' ), 'field' => 'slug', 'operator' => 'NOT IN', ), ), ) ); $this->assertEquals( array( $p3 ), $q->posts ); } public function test_tax_query_single_query_multiple_terms_operator_and() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, $t1, 'category' ); wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( 'foo', 'bar' ), 'field' => 'slug', 'operator' => 'AND', ), ), ) ); $this->assertEquals( array( $p2 ), $q->posts ); } /** * @ticket 29181 */ public function test_tax_query_operator_not_exists() { register_taxonomy( 'wptests_tax1', 'post' ); register_taxonomy( 'wptests_tax2', 'post' ); $t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax2' ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' ); wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' ); $q = new WP_Query( array( 'fields' => 'ids', 'orderby' => 'ID', 'order' => 'ASC', 'tax_query' => array( array( 'taxonomy' => 'wptests_tax2', 'operator' => 'NOT EXISTS', ), ), ) ); $this->assertEqualSets( array( $p1, $p3 ), $q->posts ); } /** * @ticket 36343 */ public function test_tax_query_operator_not_exists_combined() { register_post_type( 'wptests_cpt1' ); register_taxonomy( 'wptests_tax1', 'wptests_cpt1' ); register_taxonomy( 'wptests_tax2', 'wptests_cpt1' ); $t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) ); $t3 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax2' ) ); $p1 = self::factory()->post->create( array( 'post_type' => 'wptests_cpt1' ) ); $p2 = self::factory()->post->create( array( 'post_type' => 'wptests_cpt1' ) ); $p3 = self::factory()->post->create( array( 'post_type' => 'wptests_cpt1' ) ); $p4 = self::factory()->post->create( array( 'post_type' => 'wptests_cpt1' ) ); wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' ); wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax1' ); wp_set_object_terms( $p3, array( $t3 ), 'wptests_tax2' ); $q = new WP_Query( array( 'post_type' => 'wptests_cpt1', 'fields' => 'ids', 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'wptests_tax1', 'operator' => 'NOT EXISTS', ), array( 'taxonomy' => 'wptests_tax1', 'field' => 'slug', 'terms' => get_term_field( 'slug', $t1 ), ), ), ) ); unregister_post_type( 'wptests_cpt1' ); unregister_taxonomy( 'wptests_tax1' ); unregister_taxonomy( 'wptests_tax2' ); $this->assertEqualSets( array( $p1, $p3, $p4 ), $q->posts ); } /** * @ticket 29181 */ public function test_tax_query_operator_exists() { register_taxonomy( 'wptests_tax1', 'post' ); register_taxonomy( 'wptests_tax2', 'post' ); $t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax2' ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' ); wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' ); $q = new WP_Query( array( 'fields' => 'ids', 'orderby' => 'ID', 'order' => 'ASC', 'tax_query' => array( array( 'taxonomy' => 'wptests_tax2', 'operator' => 'EXISTS', ), ), ) ); $this->assertEqualSets( array( $p2 ), $q->posts ); } /** * @ticket 29181 */ public function test_tax_query_operator_exists_should_ignore_terms() { register_taxonomy( 'wptests_tax1', 'post' ); register_taxonomy( 'wptests_tax2', 'post' ); $t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax2' ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' ); wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' ); $q = new WP_Query( array( 'fields' => 'ids', 'orderby' => 'ID', 'order' => 'ASC', 'tax_query' => array( array( 'taxonomy' => 'wptests_tax2', 'operator' => 'EXISTS', 'terms' => array( 'foo', 'bar' ), ), ), ) ); $this->assertEqualSets( array( $p2 ), $q->posts ); } /** * @ticket 29181 */ public function test_tax_query_operator_exists_with_no_taxonomy() { register_taxonomy( 'wptests_tax1', 'post' ); register_taxonomy( 'wptests_tax2', 'post' ); $t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax1' ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax2' ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $t1 ), 'wptests_tax1' ); wp_set_object_terms( $p2, array( $t2 ), 'wptests_tax2' ); $q = new WP_Query( array( 'fields' => 'ids', 'orderby' => 'ID', 'order' => 'ASC', 'tax_query' => array( array( 'operator' => 'EXISTS', ), ), ) ); $this->assertEmpty( $q->posts ); } public function test_tax_query_multiple_queries_relation_and() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, $t1, 'category' ); wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', ), array( 'taxonomy' => 'category', 'terms' => array( 'bar' ), 'field' => 'slug', ), ), ) ); $this->assertEquals( array( $p2 ), $q->posts ); } public function test_tax_query_multiple_queries_relation_or() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, $t1, 'category' ); wp_set_object_terms( $p2, array( $t1, $t2 ), 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'category', 'terms' => array( 'foo' ), 'field' => 'slug', ), array( 'taxonomy' => 'category', 'terms' => array( 'bar' ), 'field' => 'slug', ), ), ) ); $this->assertEqualSets( array( $p1, $p2 ), $q->posts ); } public function test_tax_query_multiple_queries_different_taxonomies() { $t1 = self::factory()->term->create( array( 'taxonomy' => 'post_tag', 'slug' => 'foo', 'name' => 'Foo', ) ); $t2 = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', 'name' => 'Bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, $t1, 'post_tag' ); wp_set_object_terms( $p2, $t2, 'category' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'post_tag', 'terms' => array( 'foo' ), 'field' => 'slug', ), array( 'taxonomy' => 'category', 'terms' => array( 'bar' ), 'field' => 'slug', ), ), ) ); $this->assertEqualSets( array( $p1, $p2 ), $q->posts ); } /** * @ticket 29738 */ public function test_tax_query_two_nested_queries() { register_taxonomy( 'foo', 'post' ); register_taxonomy( 'bar', 'post' ); $foo_term_1 = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $foo_term_2 = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $bar_term_1 = self::factory()->term->create( array( 'taxonomy' => 'bar', ) ); $bar_term_2 = self::factory()->term->create( array( 'taxonomy' => 'bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' ); wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' ); wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' ); wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' ); wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' ); wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'taxonomy' => 'foo', 'terms' => array( $foo_term_1 ), 'field' => 'term_id', ), array( 'taxonomy' => 'bar', 'terms' => array( $bar_term_1 ), 'field' => 'term_id', ), ), array( 'relation' => 'AND', array( 'taxonomy' => 'foo', 'terms' => array( $foo_term_2 ), 'field' => 'term_id', ), array( 'taxonomy' => 'bar', 'terms' => array( $bar_term_2 ), 'field' => 'term_id', ), ), ), ) ); _unregister_taxonomy( 'foo' ); _unregister_taxonomy( 'bar' ); $this->assertEqualSets( array( $p1, $p2 ), $q->posts ); } /** * @ticket 29738 */ public function test_tax_query_one_nested_query_one_first_order_query() { register_taxonomy( 'foo', 'post' ); register_taxonomy( 'bar', 'post' ); $foo_term_1 = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $foo_term_2 = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $bar_term_1 = self::factory()->term->create( array( 'taxonomy' => 'bar', ) ); $bar_term_2 = self::factory()->term->create( array( 'taxonomy' => 'bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' ); wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' ); wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' ); wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' ); wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' ); wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'foo', 'terms' => array( $foo_term_2 ), 'field' => 'term_id', ), array( 'relation' => 'AND', array( 'taxonomy' => 'foo', 'terms' => array( $foo_term_1 ), 'field' => 'term_id', ), array( 'taxonomy' => 'bar', 'terms' => array( $bar_term_1 ), 'field' => 'term_id', ), ), ), ) ); _unregister_taxonomy( 'foo' ); _unregister_taxonomy( 'bar' ); $this->assertEqualSets( array( $p1, $p2 ), $q->posts ); } /** * @ticket 29738 */ public function test_tax_query_one_double_nested_query_one_first_order_query() { register_taxonomy( 'foo', 'post' ); register_taxonomy( 'bar', 'post' ); $foo_term_1 = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $foo_term_2 = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $bar_term_1 = self::factory()->term->create( array( 'taxonomy' => 'bar', ) ); $bar_term_2 = self::factory()->term->create( array( 'taxonomy' => 'bar', ) ); $p1 = self::factory()->post->create(); $p2 = self::factory()->post->create(); $p3 = self::factory()->post->create(); $p4 = self::factory()->post->create(); wp_set_object_terms( $p1, array( $foo_term_1 ), 'foo' ); wp_set_object_terms( $p1, array( $bar_term_1 ), 'bar' ); wp_set_object_terms( $p2, array( $foo_term_2 ), 'foo' ); wp_set_object_terms( $p2, array( $bar_term_2 ), 'bar' ); wp_set_object_terms( $p3, array( $foo_term_1 ), 'foo' ); wp_set_object_terms( $p3, array( $bar_term_2 ), 'bar' ); $q = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'foo', 'terms' => array( $foo_term_2 ), 'field' => 'term_id', ), array( 'relation' => 'AND', array( 'taxonomy' => 'foo', 'terms' => array( $foo_term_1 ), 'field' => 'term_id', ), array( 'relation' => 'OR', array( 'taxonomy' => 'bar', 'terms' => array( $bar_term_1 ), 'field' => 'term_id', ), array( 'taxonomy' => 'bar', 'terms' => array( $bar_term_2 ), 'field' => 'term_id', ), ), ), ), ) ); _unregister_taxonomy( 'foo' ); _unregister_taxonomy( 'bar' ); $this->assertEqualSets( array( $p1, $p2, $p3 ), $q->posts ); } /** * @ticket 20604 */ public function test_tax_query_relation_or_both_clauses_empty_terms() { // An empty tax query should return an empty array, not all posts. self::factory()->post->create_many( 2 ); $query = new WP_Query( array( 'fields' => 'ids', 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'post_tag', 'field' => 'id', 'terms' => false, 'operator' => 'IN' ), array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => false, 'operator' => 'IN' ), ) ) ); $posts = $query->get_posts(); $this->assertEquals( 0 , count( $posts ) ); } /** * @ticket 20604 */ public function test_tax_query_relation_or_one_clause_empty_terms() { // An empty tax query should return an empty array, not all posts. self::factory()->post->create_many( 2 ); $query = new WP_Query( array( 'fields' => 'ids', 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'post_tag', 'field' => 'id', 'terms' => array( 'foo' ), 'operator' => 'IN' ), array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => false, 'operator' => 'IN' ), ) ) ); $posts = $query->get_posts(); $this->assertEquals( 0 , count( $posts ) ); } public function test_tax_query_include_children() { $cat_a = self::factory()->term->create( array( 'taxonomy' => 'category', 'name' => 'Australia' ) ); $cat_b = self::factory()->term->create( array( 'taxonomy' => 'category', 'name' => 'Sydney', 'parent' => $cat_a ) ); $cat_c = self::factory()->term->create( array( 'taxonomy' => 'category', 'name' => 'East Syndney', 'parent' => $cat_b ) ); $cat_d = self::factory()->term->create( array( 'taxonomy' => 'category', 'name' => 'West Syndney', 'parent' => $cat_b ) ); $post_a = self::factory()->post->create( array( 'post_category' => array( $cat_a ) ) ); $post_b = self::factory()->post->create( array( 'post_category' => array( $cat_b ) ) ); $post_c = self::factory()->post->create( array( 'post_category' => array( $cat_c ) ) ); $post_d = self::factory()->post->create( array( 'post_category' => array( $cat_d ) ) ); $posts = get_posts( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => array( $cat_a ), ) ) ) ); $this->assertEquals( 4 , count( $posts ) ); $posts = get_posts( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => array( $cat_a ), 'include_children' => false ) ) ) ); $this->assertEquals( 1 , count( $posts ) ); $posts = get_posts( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => array( $cat_b ), ) ) ) ); $this->assertEquals( 3 , count( $posts ) ); $posts = get_posts( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => array( $cat_b ), 'include_children' => false ) ) ) ); $this->assertEquals( 1 , count( $posts ) ); $posts = get_posts( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => array( $cat_c ), ) ) ) ); $this->assertEquals( 1 , count( $posts ) ); $posts = get_posts( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => array( $cat_c ), 'include_children' => false ) ) ) ); $this->assertEquals( 1 , count( $posts ) ); } public function test_tax_query_taxonomy_with_attachments() { $q = new WP_Query(); register_taxonomy_for_object_type( 'post_tag', 'attachment:image' ); $tag_id = self::factory()->term->create( array( 'slug' => rand_str(), 'name' => rand_str() ) ); $image_id = self::factory()->attachment->create_object( 'image.jpg', 0, array( 'post_mime_type' => 'image/jpeg', 'post_type' => 'attachment' ) ); wp_set_object_terms( $image_id, $tag_id, 'post_tag' ); $posts = $q->query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'post_type' => 'attachment', 'post_status' => 'inherit', 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'field' => 'term_id', 'terms' => array( $tag_id ) ) ) ) ); $this->assertEquals( array( $image_id ), $posts ); } public function test_tax_query_no_taxonomy() { $cat_id = self::factory()->category->create( array( 'name' => 'alpha' ) ); self::factory()->post->create( array( 'post_title' => 'alpha', 'post_category' => array( $cat_id ) ) ); $response1 = new WP_Query( array( 'tax_query' => array( array( 'terms' => array( $cat_id ) ) ) ) ); $this->assertEmpty( $response1->posts ); $response2 = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'taxonomy' => 'category', 'terms' => array( $cat_id ) ) ) ) ); $this->assertNotEmpty( $response2->posts ); $term = get_category( $cat_id ); $response3 = new WP_Query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'tax_query' => array( array( 'field' => 'term_taxonomy_id', 'terms' => array( $term->term_taxonomy_id ) ) ) ) ); $this->assertNotEmpty( $response3->posts ); } public function test_term_taxonomy_id_field_no_taxonomy() { $q = new WP_Query(); $posts = self::factory()->post->create_many( 5 ); $cats = $tags = array(); // need term_taxonomy_ids in addition to term_ids, so no factory for ( $i = 0; $i < 5; $i++ ) { $cats[$i] = wp_insert_term( 'category-' . $i , 'category' ); $tags[$i] = wp_insert_term( 'tag-' . $i, 'post_tag' ); // post 0 gets all terms wp_set_object_terms( $posts[0], array( $cats[$i]['term_id'] ), 'category', true ); wp_set_object_terms( $posts[0], array( $tags[$i]['term_id'] ), 'post_tag', true ); } wp_set_object_terms( $posts[1], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' ); wp_set_object_terms( $posts[1], array( $tags[0]['term_id'], $tags[2]['term_id'], $cats[4]['term_id'] ), 'post_tag' ); wp_set_object_terms( $posts[2], array( $cats[1]['term_id'], $cats[3]['term_id'] ), 'category' ); wp_set_object_terms( $posts[2], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' ); wp_set_object_terms( $posts[3], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' ); wp_set_object_terms( $posts[3], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' ); $results1 = $q->query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'orderby' => 'ID', 'order' => 'ASC', 'tax_query' => array( 'relation' => 'OR', array( 'field' => 'term_taxonomy_id', 'terms' => array( $cats[0]['term_taxonomy_id'], $cats[2]['term_taxonomy_id'], $cats[4]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'], $tags[2]['term_taxonomy_id'], $cats[4]['term_taxonomy_id'] ), 'operator' => 'AND', 'include_children' => false, ), array( 'field' => 'term_taxonomy_id', 'terms' => array( $cats[1]['term_taxonomy_id'], $cats[3]['term_taxonomy_id'], $tags[1]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ), 'operator' => 'AND', 'include_children' => false, ) ) ) ); $this->assertEquals( array( $posts[0], $posts[1], $posts[2] ), $results1, 'Relation: OR; Operator: AND' ); $results2 = $q->query( array( 'fields' => 'ids', 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'orderby' => 'ID', 'order' => 'ASC', 'tax_query' => array( 'relation' => 'AND', array( 'field' => 'term_taxonomy_id', 'terms' => array( $cats[0]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'] ), 'operator' => 'IN', 'include_children' => false, ), array( 'field' => 'term_taxonomy_id', 'terms' => array( $cats[3]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ), 'operator' => 'IN', 'include_children' => false, ) ) ) ); $this->assertEquals( array( $posts[0], $posts[3] ), $results2, 'Relation: AND; Operator: IN' ); } /** * @ticket 29738 */ public function test_populate_taxonomy_query_var_from_tax_query() { register_taxonomy( 'foo', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $c = self::factory()->term->create( array( 'taxonomy' => 'category', ) ); $q = new WP_Query( array( 'tax_query' => array( // Empty terms mean that this one should be skipped array( 'taxonomy' => 'bar', 'terms' => array(), ), // Category and post tags should be skipped array( 'taxonomy' => 'category', 'terms' => array( $c ), ), array( 'taxonomy' => 'foo', 'terms' => array( $t ), ), ), ) ); $this->assertSame( 'foo', $q->get( 'taxonomy' ) ); _unregister_taxonomy( 'foo' ); } public function test_populate_taxonomy_query_var_from_tax_query_taxonomy_already_set() { register_taxonomy( 'foo', 'post' ); register_taxonomy( 'foo1', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $q = new WP_Query( array( 'taxonomy' => 'bar', 'tax_query' => array( array( 'taxonomy' => 'foo', 'terms' => array( $t ), ), ), ) ); $this->assertSame( 'bar', $q->get( 'taxonomy' ) ); _unregister_taxonomy( 'foo' ); _unregister_taxonomy( 'foo1' ); } public function test_populate_term_query_var_from_tax_query() { register_taxonomy( 'foo', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'foo', 'slug' => 'bar', ) ); $q = new WP_Query( array( 'tax_query' => array( array( 'taxonomy' => 'foo', 'terms' => array( 'bar' ), 'field' => 'slug', ), ), ) ); $this->assertSame( 'bar', $q->get( 'term' ) ); _unregister_taxonomy( 'foo' ); } public function test_populate_term_id_query_var_from_tax_query() { register_taxonomy( 'foo', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'foo', 'slug' => 'bar', ) ); $q = new WP_Query( array( 'tax_query' => array( array( 'taxonomy' => 'foo', 'terms' => array( $t ), 'field' => 'term_id', ), ), ) ); $this->assertEquals( $t, $q->get( 'term_id' ) ); _unregister_taxonomy( 'foo' ); } /** * @ticket 29738 */ public function test_populate_cat_category_name_query_var_from_tax_query() { register_taxonomy( 'foo', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $c = self::factory()->term->create( array( 'taxonomy' => 'category', 'slug' => 'bar', ) ); $q = new WP_Query( array( 'tax_query' => array( // Non-category should be skipped array( 'taxonomy' => 'foo', 'terms' => array( $t ), ), // Empty terms mean that this one should be skipped array( 'taxonomy' => 'category', 'terms' => array(), ), // Category and post tags should be skipped array( 'taxonomy' => 'category', 'terms' => array( $c ), ), ), ) ); $this->assertEquals( $c, $q->get( 'cat' ) ); $this->assertEquals( 'bar', $q->get( 'category_name' ) ); _unregister_taxonomy( 'foo' ); } /** * @ticket 29738 */ public function test_populate_tag_id_query_var_from_tax_query() { register_taxonomy( 'foo', 'post' ); $t = self::factory()->term->create( array( 'taxonomy' => 'foo', ) ); $tag = self::factory()->term->create( array( 'taxonomy' => 'post_tag', 'slug' => 'bar', ) ); $q = new WP_Query( array( 'tax_query' => array( // Non-tag should be skipped array( 'taxonomy' => 'foo', 'terms' => array( $t ), ), // Empty terms mean that this one should be skipped array( 'taxonomy' => 'post_tag', 'terms' => array(), ), // Category and post tags should be skipped array( 'taxonomy' => 'post_tag', 'terms' => array( $tag ), ), ), ) ); $this->assertEquals( $tag, $q->get( 'tag_id' ) ); _unregister_taxonomy( 'foo' ); } }