WordPress.org

Make WordPress Core

Ticket #25284: 25284.2.diff

File 25284.2.diff, 4.7 KB (added by helen, 4 years ago)
  • src/wp-includes/taxonomy.php

     
    626626 
    627627        /** 
    628628         * List of taxonomy queries. A single taxonomy query is an associative array: 
    629          * - 'taxonomy' string The taxonomy being queried 
     629         * - 'taxonomy' string The taxonomy being queried. Optional when using the term_taxonomy_id field. 
    630630         * - 'terms' string|array The list of terms 
    631631         * - 'field' string (optional) Which term field is being used. 
    632          *              Possible values: 'term_id', 'slug' or 'name' 
     632         *              Possible values: 'term_id', 'slug', 'name', or 'term_taxonomy_id' 
    633633         *              Default: 'term_id' 
    634634         * - 'operator' string (optional) 
    635635         *              Possible values: 'AND', 'IN' or 'NOT IN'. 
    636636         *              Default: 'IN' 
    637          * - 'include_children' bool (optional) Whether to include child terms. 
     637         * - 'include_children' bool (optional) Whether to include child terms. Requires that a taxonomy be specified. 
    638638         *              Default: true 
    639639         * 
    640640         * @since 3.1.0 
     
    807807         * @param array &$query The single query 
    808808         */ 
    809809        private function clean_query( &$query ) { 
    810                 if ( ! taxonomy_exists( $query['taxonomy'] ) ) { 
     810                if ( empty( $query['taxonomy'] ) ) { 
     811                        if ( 'term_taxonomy_id' !== $query['field'] ) { 
     812                                $query = new WP_Error( 'Invalid taxonomy' ); 
     813                                return; 
     814                        } 
     815 
     816                        // so long as there are shared terms, include_children requires that a taxonomy is set 
     817                        $query['include_children'] = false; 
     818                } elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) { 
    811819                        $query = new WP_Error( 'Invalid taxonomy' ); 
    812820                        return; 
    813821                } 
  • tests/phpunit/tests/term/query.php

     
    6262 
    6363                $this->assertEquals( array( $image_id ), $posts ); 
    6464        } 
    65 } 
    66  No newline at end of file 
     65 
     66        /** 
     67         * @ticket 25284 
     68         */ 
     69        function test_term_taxonomy_id_field_no_taxonomy() { 
     70                $posts = $this->factory->post->create_many( 5 ); 
     71 
     72                $cats = $tags = array(); 
     73 
     74                // need term_taxonomy_ids in addition to term_ids, so no factory 
     75                for ( $i = 0; $i < 5; $i++ ) { 
     76                        $cats[$i] = wp_insert_term( 'category-' . $i , 'category' ); 
     77                        $tags[$i] = wp_insert_term( 'tag-' . $i, 'post_tag' ); 
     78 
     79                        // post 0 gets all terms 
     80                        wp_set_object_terms( $posts[0], array( $cats[$i]['term_id'] ), 'category', true ); 
     81                        wp_set_object_terms( $posts[0], array( $tags[$i]['term_id'] ), 'post_tag', true ); 
     82                } 
     83 
     84                wp_set_object_terms( $posts[1], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' ); 
     85                wp_set_object_terms( $posts[1], array( $tags[0]['term_id'], $tags[2]['term_id'], $cats[4]['term_id'] ), 'post_tag' ); 
     86 
     87                wp_set_object_terms( $posts[2], array( $cats[1]['term_id'], $cats[3]['term_id'] ), 'category' ); 
     88                wp_set_object_terms( $posts[2], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' ); 
     89 
     90                wp_set_object_terms( $posts[3], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' ); 
     91                wp_set_object_terms( $posts[3], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' ); 
     92 
     93                $results = $this->q->query( array( 
     94                        'fields' => 'ids', 
     95                        'orderby' => 'id', 
     96                        'order' => 'ASC', 
     97                        'tax_query' => array( 
     98                                'relation' => 'OR', 
     99                                array( 
     100                                        'field' => 'term_taxonomy_id', 
     101                                        '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'] ), 
     102                                        'operator' => 'AND', 
     103                                        'include_children' => false, 
     104                                ), 
     105                                array( 
     106                                        'field' => 'term_taxonomy_id', 
     107                                        'terms' => array( $cats[1]['term_taxonomy_id'], $cats[3]['term_taxonomy_id'], $tags[1]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ), 
     108                                        'operator' => 'AND', 
     109                                        'include_children' => false, 
     110                                ) 
     111                        ) 
     112                ) ); 
     113 
     114                $this->assertEquals( array( $posts[0], $posts[1], $posts[2] ), $results, 'Relation: OR; Operator: AND' ); 
     115 
     116                $results = $this->q->query( array( 
     117                        'fields' => 'ids', 
     118                        'orderby' => 'id', 
     119                        'order' => 'ASC', 
     120                        'tax_query' => array( 
     121                                'relation' => 'AND', 
     122                                array( 
     123                                        'field' => 'term_taxonomy_id', 
     124                                        'terms' => array( $cats[0]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'] ), 
     125                                        'operator' => 'IN', 
     126                                        'include_children' => false, 
     127                                ), 
     128                                array( 
     129                                        'field' => 'term_taxonomy_id', 
     130                                        'terms' => array( $cats[3]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ), 
     131                                        'operator' => 'IN', 
     132                                        'include_children' => false, 
     133                                ) 
     134                        ) 
     135                ) ); 
     136 
     137                $this->assertEquals( array( $posts[0], $posts[3] ), $results, 'Relation: AND; Operator: IN' ); 
     138        } 
     139}