Make WordPress Core


Ignore:
Timestamp:
01/25/2015 02:45:11 AM (12 years ago)
Author:
boonebgorges
Message:

In get_terms(), check hierarchy for all $taxonomies before bailing early from 'parent' or 'child_of'.

There is a pre-check in get_terms() that prevents an unnecessary database
query if the 'parent' or 'child_of' parameter is not found in the cached term
hierarchy (since a term without an index in the hierarchy cache has no
descendants). Previously, only the first item in the $taxonomies array was
being checked, with the result that an empty array was being erroneously
returned in cases where the 'parent' or 'child_of' term is in a subsequent
taxonomy.

See #31118.

File:
1 edited

Legend:

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

    r31275 r31276  
    16581658        $args = apply_filters( 'get_terms_args', $args, $taxonomies );
    16591659
     1660        // Avoid the query if the queried parent/child_of term has no descendants.
    16601661        $child_of = $args['child_of'];
     1662        $parent   = $args['parent'];
     1663
    16611664        if ( $child_of ) {
    1662                 $hierarchy = _get_term_hierarchy( reset( $taxonomies ) );
    1663                 if ( ! isset( $hierarchy[ $child_of ] ) ) {
    1664                         return $empty_array;
    1665                 }
    1666         }
    1667 
    1668         $parent = $args['parent'];
    1669         if ( $parent ) {
    1670                 $hierarchy = _get_term_hierarchy( reset( $taxonomies ) );
    1671                 if ( ! isset( $hierarchy[ $parent ] ) ) {
     1665                $_parent = $child_of;
     1666        } elseif ( $parent ) {
     1667                $_parent = $parent;
     1668        } else {
     1669                $_parent = false;
     1670        }
     1671
     1672        if ( $_parent ) {
     1673                $in_hierarchy = false;
     1674                foreach ( $taxonomies as $_tax ) {
     1675                        $hierarchy = _get_term_hierarchy( $_tax );
     1676
     1677                        if ( isset( $hierarchy[ $_parent ] ) ) {
     1678                                $in_hierarchy = true;
     1679                        }
     1680                }
     1681
     1682                if ( ! $in_hierarchy ) {
    16721683                        return $empty_array;
    16731684                }
    … …  
    19431954
    19441955        if ( $child_of ) {
    1945                 $children = _get_term_hierarchy( reset( $taxonomies ) );
    1946                 if ( ! empty( $children ) ) {
    1947                         $terms = _get_term_children( $child_of, $terms, reset( $taxonomies ) );
     1956                foreach ( $taxonomies as $_tax ) {
     1957                        $children = _get_term_hierarchy( $_tax );
     1958                        if ( ! empty( $children ) ) {
     1959                                $terms = _get_term_children( $child_of, $terms, $_tax );
     1960                        }
    19481961                }
    19491962        }
Note: See TracChangeset for help on using the changeset viewer.