Make WordPress Core


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.7/wp-includes/taxonomy.php

    r10159 r10417  
    535535 * 'exclude' is ignored.
    536536 *
     537 * exclude_tree - A comma- or space-delimited string of term ids to exclude
     538 * from the return array, along with all of their descendant terms according to
     539 * the primary taxonomy.  If 'include' is non-empty, 'exclude_tree' is ignored.
     540 *
    537541 * include - Default is an empty string.  A comma- or space-delimited string
    538542 * of term ids to include in the return array.
     
    605609
    606610    $defaults = array('orderby' => 'name', 'order' => 'ASC',
    607         'hide_empty' => true, 'exclude' => '', 'include' => '',
     611        'hide_empty' => true, 'exclude' => '', 'exclude_tree' => '', 'include' => '',
    608612        'number' => '', 'fields' => 'all', 'slug' => '', 'parent' => '',
    609613        'hierarchical' => true, 'child_of' => 0, 'get' => '', 'name__like' => '',
     
    669673    if ( !empty($include) ) {
    670674        $exclude = '';
     675        $exclude_tree = '';
    671676        $interms = preg_split('/[\s,]+/',$include);
    672677        if ( count($interms) ) {
     
    685690
    686691    $exclusions = '';
     692    if ( ! empty( $exclude_tree ) ) {
     693        $excluded_trunks = preg_split('/[\s,]+/',$exclude_tree);
     694        foreach( (array) $excluded_trunks as $extrunk ) {
     695            $excluded_children = (array) get_terms($taxonomies[0], array('child_of' => intval($extrunk), 'fields' => 'ids'));   
     696            $excluded_children[] = $extrunk;
     697            foreach( (array) $excluded_children as $exterm ) {
     698                if ( empty($exclusions) )
     699                    $exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' ';
     700                else
     701                    $exclusions .= ' AND t.term_id <> ' . intval($exterm) . ' ';
     702
     703            }
     704        }
     705    }
    687706    if ( !empty($exclude) ) {
    688707        $exterms = preg_split('/[\s,]+/',$exclude);
    689708        if ( count($exterms) ) {
    690709            foreach ( (array) $exterms as $exterm ) {
    691                 if (empty($exclusions))
     710                if ( empty($exclusions) )
    692711                    $exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' ';
    693712                else
     
    718737        $where .= ' AND tt.count > 0';
    719738
    720     if ( !empty($number) ) {
     739    // don't limit the query results when we have to descend the family tree
     740    if ( ! empty($number) && ! $hierarchical && empty( $child_of ) && '' == $parent ) {
    721741        if( $offset )
    722             $number = 'LIMIT ' . $offset . ',' . $number;
     742            $limit = 'LIMIT ' . $offset . ',' . $number;
    723743        else
    724             $number = 'LIMIT ' . $number;
     744            $limit = 'LIMIT ' . $number;
    725745
    726746    } else
    727         $number = '';
     747        $limit = '';
    728748
    729749    if ( !empty($search) ) {
     
    740760        $select_this = 't.term_id, tt.parent, tt.count, t.name';
    741761
    742     $query = "SELECT $select_this FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ($in_taxonomies) $where ORDER BY $orderby $order $number";
    743 
     762    $query = "SELECT $select_this FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ($in_taxonomies) $where ORDER BY $orderby $order $limit";
     763
     764    $terms = $wpdb->get_results($query);
    744765    if ( 'all' == $fields ) {
    745         $terms = $wpdb->get_results($query);
    746766        update_term_cache($terms);
    747     } else if ( ('ids' == $fields) || ('names' == $fields) ) {
    748         $terms = $wpdb->get_results($query);
    749767    }
    750768
     
    792810            $_terms[] = $term->name;
    793811        $terms = $_terms;
     812    }
     813
     814    if ( 0 < $number && intval(@count($terms)) > $number ) {
     815        $terms = array_slice($terms, $offset, $number);
    794816    }
    795817
Note: See TracChangeset for help on using the changeset viewer.