WordPress.org

Make WordPress Core

Changeset 28562


Ignore:
Timestamp:
05/23/14 19:58:52 (4 years ago)
Author:
wonderboymusic
Message:

When adding queries to tax_query: if the query's field is term_taxonomy_id, don't require taxonomy to be specified. In WP_Tax_Query::transform_query(), $query['taxonomy'] is never checked for the 'term_taxonomy_id' case because 'term_taxonomy_id' is the primary key being looked up.

Adds unit tests.

Props helen.
Fixes #25284.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/taxonomy.php

    r28539 r28562  
    633633    /** 
    634634     * List of taxonomy queries. A single taxonomy query is an associative array: 
    635      * - 'taxonomy' string The taxonomy being queried 
     635     * - 'taxonomy' string The taxonomy being queried. Optional when using the term_taxonomy_id field. 
    636636     * - 'terms' string|array The list of terms 
    637637     * - 'field' string (optional) Which term field is being used. 
    638      *      Possible values: 'term_id', 'slug' or 'name' 
     638     *      Possible values: 'term_id', 'slug', 'name', or 'term_taxonomy_id' 
    639639     *      Default: 'term_id' 
    640640     * - 'operator' string (optional) 
    641641     *      Possible values: 'AND', 'IN' or 'NOT IN'. 
    642642     *      Default: 'IN' 
    643      * - 'include_children' bool (optional) Whether to include child terms. 
     643     * - 'include_children' bool (optional) Whether to include child terms. Requires that a taxonomy be specified. 
    644644     *      Default: true 
    645645     * 
     
    819819     */ 
    820820    private function clean_query( &$query ) { 
    821         if ( ! taxonomy_exists( $query['taxonomy'] ) ) { 
     821        if ( empty( $query['taxonomy'] ) ) { 
     822            if ( 'term_taxonomy_id' !== $query['field'] ) { 
     823                $query = new WP_Error( 'Invalid taxonomy' ); 
     824                return; 
     825            } 
     826 
     827            // so long as there are shared terms, include_children requires that a taxonomy is set 
     828            $query['include_children'] = false; 
     829        } elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) { 
    822830            $query = new WP_Error( 'Invalid taxonomy' ); 
    823831            return; 
  • trunk/tests/phpunit/tests/term/query.php

    r28188 r28562  
    9999        $this->assertEquals( array( $post_id1, $post_id2 ), $ids ); 
    100100    } 
     101 
     102    function test_tax_query_no_taxonomy() { 
     103        $cat_id = $this->factory->category->create( array( 'name' => 'alpha' ) ); 
     104        $this->factory->post->create( array( 'post_title' => 'alpha', 'post_category' => array( $cat_id ) ) ); 
     105 
     106        $response1 = new WP_Query( array( 
     107            'tax_query' => array( 
     108                array( 'terms' => array( $cat_id ) ) 
     109            ) 
     110        ) ); 
     111        $this->assertEmpty( $response1->posts ); 
     112 
     113        $response2 = new WP_Query( array( 
     114            'tax_query' => array( 
     115                array( 
     116                    'taxonomy' => 'category', 
     117                    'terms' => array( $cat_id ) 
     118                ) 
     119            ) 
     120        ) ); 
     121        $this->assertNotEmpty( $response2->posts ); 
     122 
     123        $term = get_category( $cat_id ); 
     124        $response3 = new WP_Query( array( 
     125            'tax_query' => array( 
     126                array( 
     127                    'field' => 'term_taxonomy_id', 
     128                    'terms' => array( $term->term_taxonomy_id ) 
     129                ) 
     130            ) 
     131        ) ); 
     132        $this->assertNotEmpty( $response3->posts ); 
     133    } 
     134 
     135    function test_term_taxonomy_id_field_no_taxonomy() { 
     136        $posts = $this->factory->post->create_many( 5 ); 
     137 
     138        $cats = $tags = array(); 
     139 
     140        // need term_taxonomy_ids in addition to term_ids, so no factory 
     141        for ( $i = 0; $i < 5; $i++ ) { 
     142            $cats[$i] = wp_insert_term( 'category-' . $i , 'category' ); 
     143            $tags[$i] = wp_insert_term( 'tag-' . $i, 'post_tag' ); 
     144 
     145            // post 0 gets all terms 
     146            wp_set_object_terms( $posts[0], array( $cats[$i]['term_id'] ), 'category', true ); 
     147            wp_set_object_terms( $posts[0], array( $tags[$i]['term_id'] ), 'post_tag', true ); 
     148        } 
     149 
     150        wp_set_object_terms( $posts[1], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' ); 
     151        wp_set_object_terms( $posts[1], array( $tags[0]['term_id'], $tags[2]['term_id'], $cats[4]['term_id'] ), 'post_tag' ); 
     152 
     153        wp_set_object_terms( $posts[2], array( $cats[1]['term_id'], $cats[3]['term_id'] ), 'category' ); 
     154        wp_set_object_terms( $posts[2], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' ); 
     155 
     156        wp_set_object_terms( $posts[3], array( $cats[0]['term_id'], $cats[2]['term_id'], $cats[4]['term_id'] ), 'category' ); 
     157        wp_set_object_terms( $posts[3], array( $tags[1]['term_id'], $tags[3]['term_id'] ), 'post_tag' ); 
     158 
     159        $results1 = $this->q->query( array( 
     160            'fields' => 'ids', 
     161            'orderby' => 'id', 
     162            'order' => 'ASC', 
     163            'tax_query' => array( 
     164                'relation' => 'OR', 
     165                array( 
     166                    'field' => 'term_taxonomy_id', 
     167                    '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'] ), 
     168                    'operator' => 'AND', 
     169                    'include_children' => false, 
     170                ), 
     171                array( 
     172                    'field' => 'term_taxonomy_id', 
     173                    'terms' => array( $cats[1]['term_taxonomy_id'], $cats[3]['term_taxonomy_id'], $tags[1]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ), 
     174                    'operator' => 'AND', 
     175                    'include_children' => false, 
     176                ) 
     177            ) 
     178        ) ); 
     179 
     180        $this->assertEquals( array( $posts[0], $posts[1], $posts[2] ), $results1, 'Relation: OR; Operator: AND' ); 
     181 
     182        $results2 = $this->q->query( array( 
     183            'fields' => 'ids', 
     184            'orderby' => 'id', 
     185            'order' => 'ASC', 
     186            'tax_query' => array( 
     187                'relation' => 'AND', 
     188                array( 
     189                    'field' => 'term_taxonomy_id', 
     190                    'terms' => array( $cats[0]['term_taxonomy_id'], $tags[0]['term_taxonomy_id'] ), 
     191                    'operator' => 'IN', 
     192                    'include_children' => false, 
     193                ), 
     194                array( 
     195                    'field' => 'term_taxonomy_id', 
     196                    'terms' => array( $cats[3]['term_taxonomy_id'], $tags[3]['term_taxonomy_id'] ), 
     197                    'operator' => 'IN', 
     198                    'include_children' => false, 
     199                ) 
     200            ) 
     201        ) ); 
     202 
     203        $this->assertEquals( array( $posts[0], $posts[3] ), $results2, 'Relation: AND; Operator: IN' ); 
     204    } 
    101205} 
Note: See TracChangeset for help on using the changeset viewer.