Make WordPress Core


Ignore:
Timestamp:
01/25/2015 02:45:11 AM (10 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.