WordPress.org

Make WordPress Core

Ticket #20767: 20767.3.diff

File 20767.3.diff, 6.2 KB (added by wonderboymusic, 6 months ago)
  • src/wp-includes/query.php

     
    32483248                $this->queried_object_id = 0; 
    32493249 
    32503250                if ( $this->is_category || $this->is_tag || $this->is_tax ) { 
    3251                         $tax_query_in_and = wp_list_filter( $this->tax_query->queries, array( 'operator' => 'NOT IN' ), 'NOT' ); 
     3251                        if ( $this->is_category ) { 
     3252                                $term = get_term( $this->get( 'cat' ), 'category' ); 
     3253                        } elseif ( $this->is_tag ) { 
     3254                                $term = get_term( $this->get( 'tag_id' ), 'post_tag' ); 
     3255                        } else { 
     3256                                $tax_query_in_and = wp_list_filter( $this->tax_query->queries, array( 'operator' => 'NOT IN' ), 'NOT' ); 
     3257                                $query = reset( $tax_query_in_and ); 
    32523258 
    3253                         $query = reset( $tax_query_in_and ); 
     3259                                if ( 'term_id' == $query['field'] ) 
     3260                                        $term = get_term( reset( $query['terms'] ), $query['taxonomy'] ); 
     3261                                else 
     3262                                        $term = get_term_by( $query['field'], reset( $query['terms'] ), $query['taxonomy'] ); 
     3263                        } 
    32543264 
    3255                         if ( 'term_id' == $query['field'] ) 
    3256                                 $term = get_term( reset( $query['terms'] ), $query['taxonomy'] ); 
    3257                         elseif ( $query['terms'] ) 
    3258                                 $term = get_term_by( $query['field'], reset( $query['terms'] ), $query['taxonomy'] ); 
    3259  
    32603265                        if ( ! empty( $term ) && ! is_wp_error( $term ) )  { 
    32613266                                $this->queried_object = $term; 
    32623267                                $this->queried_object_id = (int) $term->term_id; 
    32633268 
    3264                                 if ( $this->is_category ) 
     3269                                if ( $this->is_category && 'category' === $this->queried_object->taxonomy ) 
    32653270                                        _make_cat_compat( $this->queried_object ); 
    32663271                        } 
    32673272                } elseif ( $this->is_post_type_archive ) { 
  • tests/phpunit/tests/query/conditionals.php

     
    652652        } 
    653653 
    654654        function test_post_type_archive_with_tax_query() { 
    655                 delete_option( 'rewrite_rules' ); 
    656  
    657655                $cpt_name = 'ptawtq'; 
    658656                register_post_type( $cpt_name, array( 
    659657                        'taxonomies' => array( 'post_tag', 'category' ), 
     
    662660                        'public' => true 
    663661                ) ); 
    664662 
     663                delete_option( 'rewrite_rules' ); 
     664 
    665665                $tag_id = $this->factory->tag->create( array( 'slug' => 'tag-slug' ) ); 
    666666                $post_id = $this->factory->post->create( array( 'post_type' => $cpt_name ) ); 
    667667                wp_set_object_terms( $post_id, $tag_id, 'post_tag' ); 
     
    677677                $this->assertEquals( get_queried_object(), get_post_type_object( $cpt_name ) ); 
    678678 
    679679                remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_with_tax_query' ) ); 
     680 
     681                _unregister_post_type( $cpt_name ); 
    680682        } 
    681683 
    682684        function pre_get_posts_with_tax_query( &$query ) { 
     
    709711                $this->assertEquals( get_queried_object(), get_post_type_object( 'post' ) ); 
    710712 
    711713                remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_with_type_array' ) ); 
     714                _unregister_post_type( $cpt_name ); 
    712715        } 
    713716 
    714717        function pre_get_posts_with_type_array( &$query ) { 
    715718                $query->set( 'post_type', array( 'post', 'thearray' ) ); 
    716719        } 
     720 
     721        function test_tax_category_tax_query() { 
     722                register_taxonomy( 'testtax', 'post', array( 'query_var' => true ) ); 
     723                delete_option( 'rewrite_rules' ); 
     724 
     725                $tag_id = $this->factory->tag->create( array( 'slug' => 'tag-slug' ) ); 
     726                $cat_id = $this->factory->category->create( array( 'slug' => 'cat-slug' ) ); 
     727                $tax_id = $this->factory->term->create( array( 'taxonomy' => 'testtax', 'slug' => 'tax-slug' ) ); 
     728                $tax_id2 = $this->factory->term->create( array( 'taxonomy' => 'testtax', 'slug' => 'tax-slug2' ) ); 
     729                $post_id = $this->factory->post->create(); 
     730                wp_set_object_terms( $post_id, $tag_id, 'post_tag' ); 
     731                wp_set_object_terms( $post_id, $cat_id, 'category' ); 
     732                wp_set_object_terms( $post_id, array( $tax_id, $tax_id2 ), 'testtax' ); 
     733 
     734                $cat = get_term( $cat_id, 'category' ); 
     735                _make_cat_compat( $cat ); 
     736 
     737                $tax = get_term( $tax_id, 'testtax' ); 
     738                $tag = get_term( $tag_id, 'post_tag' ); 
     739 
     740                add_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) ); 
     741 
     742                // tag with tax added 
     743                $this->go_to( "/tag/tag-slug/" ); 
     744                $this->assertQueryTrue( 'is_tag', 'is_archive' ); 
     745                $this->assertNotEmpty( get_query_var( 'tag_id' ) ); 
     746                $this->assertEquals( get_queried_object(), $tag ); 
     747 
     748                // tag + category with tax added 
     749                $this->go_to( "/tag/tag-slug/?cat=$cat_id" ); 
     750                $this->assertQueryTrue( 'is_category', 'is_tag', 'is_archive' ); 
     751                $this->assertNotEmpty( get_query_var( 'cat' ) ); 
     752                $this->assertNotEmpty( get_query_var( 'tag_id' ) ); 
     753                $this->assertEquals( get_queried_object(), $cat ); 
     754 
     755                // tag + category + tax with tax added 
     756                $this->go_to( "/tag/tag-slug/?cat=$cat_id&testtax=tax-slug2" ); 
     757                $this->assertQueryTrue( 'is_category', 'is_tag', 'is_archive' ); 
     758                $this->assertNotEmpty( get_query_var( 'cat' ) ); 
     759                $this->assertNotEmpty( get_query_var( 'tag_id' ) ); 
     760                $this->assertEquals( get_queried_object(), $cat ); 
     761 
     762                // category with tax added 
     763                $this->go_to( "/category/cat-slug/" ); 
     764                $this->assertQueryTrue( 'is_category', 'is_archive' ); 
     765                $this->assertNotEmpty( get_query_var( 'cat' ) ); 
     766                $this->assertEquals( get_queried_object(), $cat ); 
     767 
     768                // tag + category with tax added 
     769                $this->go_to( "/tag/tag-slug/?cat=$cat_id" ); 
     770                $this->assertQueryTrue( 'is_tag', 'is_category', 'is_archive' ); 
     771                $this->assertNotEmpty( get_query_var( 'tag_id' ) ); 
     772                $this->assertNotEmpty( get_query_var( 'cat' ) ); 
     773                $this->assertEquals( get_queried_object(), $cat ); 
     774 
     775                // tax + tag with tax added 
     776                $this->go_to( "/testtax/tax-slug2/?tag_id=$tag_id" ); 
     777                $this->assertQueryTrue( 'is_tag', 'is_archive' ); 
     778                $this->assertNotEmpty( get_query_var( 'tag_id' ) ); 
     779                $this->assertEquals( get_queried_object(), $tag ); 
     780 
     781                // tax + cat with tax added 
     782                $this->go_to( "/testtax/tax-slug2/?cat=$cat_id" ); 
     783                $this->assertQueryTrue( 'is_category', 'is_archive' ); 
     784                $this->assertNotEmpty( get_query_var( 'cat' ) ); 
     785                $this->assertEquals( get_queried_object(), $cat ); 
     786 
     787                remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_tax_category_tax_query' ) ); 
     788        } 
     789 
     790        function pre_get_posts_tax_category_tax_query( &$query ) { 
     791                $term = get_term_by( 'slug', 'tax-slug', 'testtax' ); 
     792                $query->set( 'tax_query', array( 
     793                        array( 'taxonomy' => 'testtax', 'field' => 'term_id', 'terms' => $term->term_id ) 
     794                ) ); 
     795        } 
    717796}