WordPress.org

Make WordPress Core

Ticket #20767: 20767.3.diff

File 20767.3.diff, 6.2 KB (added by wonderboymusic, 5 years 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}