WordPress.org

Make WordPress Core

Ticket #11838: my#11838.3.patch

File my#11838.3.patch, 4.3 KB (added by arena, 8 years ago)

last code optimization

  • wp-admin/includes/template.php

     
    671671 * @return unknown
    672672 */
    673673function _tag_row( $tag, $level, $class = '', $taxonomy = 'post_tag' ) {
     674
     675                if ( is_taxonomy_hierarchical($taxonomy) && !isset($tag->_found)) $class .= " style='background-color:#EBEEEF;' ";
    674676                $count = number_format_i18n( $tag->count );
    675677                if ( 'post_tag' == $taxonomy )
    676678                        $tagsel = 'tag';
     
    774776        if ( !empty( $searchterms ) )
    775777                $args['search'] = $searchterms;
    776778
    777         // convert it to table rows
    778         $out = '';
    779         $count = 0;
    780         if ( is_taxonomy_hierarchical($taxonomy) ) {
    781                 // We'll need the full set of terms then.
    782                 $args['number'] = $args['offset'] = 0;
     779        $children = array();
    783780
    784                 $terms = get_terms( $taxonomy, $args );
    785                 if ( !empty( $searchterms ) ) // Ignore children on searches.
    786                         $children = array();
    787                 else
    788                         $children = _get_term_hierarchy($taxonomy);
     781        $_terms = get_terms( $taxonomy, $args );
     782        if (empty($_terms)) return false;
    789783
    790                 // Some funky recursion to get the job done is contained within, Skip it for non-hierarchical taxonomies for performance sake
    791                 $out .= _term_rows($taxonomy, $terms, $children, $page, $pagesize, $count);
    792         } else {
    793                 $terms = get_terms( $taxonomy, $args );
    794                 foreach( $terms as $term )
    795                         $out .= _tag_row( $term, 0, ++$count % 2 ? ' class="alternate"' : '', $taxonomy );
    796         }
     784        $count = count($_terms);
    797785
    798         // filter and send to screen
    799         echo $out;
    800         return $count;
    801 }
     786        if ( is_taxonomy_hierarchical($taxonomy) ) {
    802787
    803 function _term_rows( $taxonomy, $terms, &$children, $page = 1, $per_page = 20, &$count, $parent = 0, $level = 0 ) {
     788                $children = _get_term_hierarchy($taxonomy);
    804789
    805         $start = ($page - 1) * $per_page;
    806         $end = $start + $per_page;
     790                foreach($_terms as $_term) { $_term->_found = true; $terms[$_term->term_id] = $_term; }
     791                unset($_terms, $_term);
    807792
    808         $output = '';
    809         foreach ( $terms as $key => $term ) {
     793                foreach($terms as $term)
     794                {
     795                        $my_parent = $term->parent;
     796                        if (!$my_parent) continue;
    810797
    811                 if ( $count >= $end )
    812                         break;
    813 
    814                 if ( $term->parent != $parent && empty($_GET['s']) )
    815                         continue;
    816 
    817                 // If the page starts in a subtree, print the parents.
    818                 if ( $count == $start && $term->parent > 0 && empty($_GET['s']) ) {
    819                         $my_parents = $parent_ids = array();
    820                         $p = $term->parent;
    821                         while ( $p ) {
    822                                 $my_parent = get_term( $p, $taxonomy );
    823                                 $my_parents[] = $my_parent;
    824                                 $p = $my_parent->parent;
    825                                 if ( in_array($p, $parent_ids) ) // Prevent parent loops.
    826                                         break;
    827                                 $parent_ids[] = $p;
    828                         }
    829                         unset($parent_ids);
    830 
    831                         $num_parents = count($my_parents);
    832                         $count -= $num_parents; // Do not include parents in the per-page count, This is due to paging issues with unknown numbers of rows.
    833                         while ( $my_parent = array_pop($my_parents) ) {
    834                                 $output .=  "\t" . _tag_row( $my_parent, $level - $num_parents, ++$count % 2 ? ' class="alternate"' : '', $taxonomy );
    835                                 $num_parents--;
    836                         }
     798                        do { 
     799                                if (!isset($terms[$my_parent])) $terms[$my_parent] = get_term( $my_parent, $taxonomy ); 
     800                                $my_parent = $terms[$my_parent]->parent; 
     801                        } while ( $my_parent );
    837802                }
     803        }
     804        else $terms = $_terms;
    838805
    839                 if ( $count >= $start )
    840                         $output .= "\t" . _tag_row( $term, $level, ++$count % 2 ? ' class="alternate"' : '', $taxonomy );
    841                 else
    842                         ++$count;
     806        // convert it to table rows (recursion only applies to hierarchies so no performance issue)
     807        echo _term_rows($taxonomy, $terms, $children);
    843808
    844                 unset($terms[$key]);
     809        return $count;
     810}
    845811
    846                 if ( isset($children[$term->term_id]) )
    847                         $output .= _term_rows( $taxonomy, $terms, $children, $page, $per_page, $count, $term->term_id, $level + 1 );
    848         }
     812function _term_rows( $taxonomy, &$terms, &$children, $level = 0, $parent = 0 ) {
    849813
    850         return $output;
     814        $output = '';
     815        foreach ( $terms as $key => $term ) 
     816        {
     817                if ( $parent == $term->parent ) 
     818                {
     819                        $output .= _tag_row( $term, $level, '', $taxonomy); // class alternate stuff not supported in crazyhorse ...
     820                        unset( $terms[ $key ] );
     821                        if ( isset($children[$term->term_id]) )
     822                        $output .= _term_rows( $taxonomy, $terms, $children, $level + 1, $term->term_id );
     823                }
     824        }
     825        return $output;
    851826}
    852827
    853828// define the columns to display, the syntax is 'internal name' => 'display name'