Make WordPress Core

Changeset 31285


Ignore:
Timestamp:
01/26/2015 07:03:09 PM (12 years ago)
Author:
boonebgorges
Message:

Ensure that 'hierarchical' is respected in get_terms() when multiple taxonomies are passed.

Previously, attempts to descend the family tree of each term were done using
the first taxonomy in the $taxonomies array, with the result that terms not
belonging to that taxonomy were not found and their children not properly
parsed. We fix this bug by fetching each term's taxonomy with the SQL query,
and then using that taxonomy to get the correct children for each term.

Fixes #31118.

Location:
trunk
Files:
2 edited

Legend:

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

    r31284 r31285  
    18881888                case 'ids':
    18891889                case 'id=>parent':
    1890                         $selects = array( 't.term_id', 'tt.parent', 'tt.count' );
     1890                        $selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' );
    18911891                        break;
    18921892                case 'names':
    1893                         $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name' );
     1893                        $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' );
    18941894                        break;
    18951895                case 'count':
    … …  
    18991899                        break;
    19001900                case 'id=>name':
    1901                         $selects = array( 't.term_id', 't.name', 'tt.count' );
     1901                        $selects = array( 't.term_id', 't.name', 'tt.count', 'tt.taxonomy' );
    19021902                        break;
    19031903                case 'id=>slug':
    1904                         $selects = array( 't.term_id', 't.slug', 'tt.count' );
     1904                        $selects = array( 't.term_id', 't.slug', 'tt.count', 'tt.taxonomy' );
    19051905                        break;
    19061906        }
    … …  
    19751975                }
    19761976        }
     1977
    19771978        // Make sure we show empty categories that have children.
    19781979        if ( $hierarchical && $args['hide_empty'] && is_array( $terms ) ) {
    19791980                foreach ( $terms as $k => $term ) {
    19801981                        if ( ! $term->count ) {
    1981                                 $children = get_term_children( $term->term_id, reset( $taxonomies ) );
     1982                                $children = get_term_children( $term->term_id, $term->taxonomy );
    19821983                                if ( is_array( $children ) ) {
    19831984                                        foreach ( $children as $child_id ) {
    1984                                                 $child = get_term( $child_id, reset( $taxonomies ) );
     1985                                                $child = get_term( $child_id, $term->taxonomy );
    19851986                                                if ( $child->count ) {
    19861987                                                        continue 2;
  • trunk/tests/phpunit/tests/term/getTerms.php

    r31284 r31285  
    10711071
    10721072        /**
     1073         * @ticket 31118
     1074         */
     1075        public function test_hierarchical_should_recurse_properly_for_all_taxonomies() {
     1076                register_taxonomy( 'wptests_tax1', 'post', array( 'hierarchical' => true ) );
     1077                register_taxonomy( 'wptests_tax2', 'post', array( 'hierarchical' => true ) );
     1078
     1079                $t1 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1' ) );
     1080                $t2 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1', 'parent' => $t1 ) );
     1081                $t3 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax1', 'parent' => $t2 ) );
     1082
     1083                $t4 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2' ) );
     1084                $t5 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2', 'parent' => $t4 ) );
     1085                $t6 = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax2', 'parent' => $t5 ) );
     1086
     1087                $p = $this->factory->post->create();
     1088
     1089                wp_set_object_terms( $p, $t3, 'wptests_tax1' );
     1090                wp_set_object_terms( $p, $t6, 'wptests_tax2' );
     1091
     1092                $found = get_terms( array( 'wptests_tax1', 'wptests_tax2' ), array(
     1093                        'hierarchical' => true,
     1094                        'hide_empty' => true,
     1095                        'fields' => 'ids',
     1096                ) );
     1097
     1098                /*
     1099                 * Should contain all terms, since they all have non-empty descendants.
     1100                 * To make the case clearer, test taxonomies separately.
     1101                 */
     1102
     1103                // First taxonomy.
     1104                $this->assertContains( $t1, $found );
     1105                $this->assertContains( $t2, $found );
     1106                $this->assertContains( $t3, $found );
     1107
     1108                // Second taxonomy.
     1109                $this->assertContains( $t4, $found );
     1110                $this->assertContains( $t5, $found );
     1111                $this->assertContains( $t6, $found );
     1112        }
     1113
     1114        /**
    10731115         * @ticket 23261
    10741116         */
Note: See TracChangeset for help on using the changeset viewer.