WordPress.org

Make WordPress Core

Ticket #2621: 2621.diff

File 2621.diff, 8.7 KB (added by mdawaffe, 9 years ago)

Reduce DB hits by orders of magnitude for admin side category template functions.

  • wp-admin/admin-functions.php

     
    545545                echo ' checked="checked"'; 
    546546} 
    547547 
    548 function return_categories_list($parent = 0) { 
     548function return_categories_list($parent = 0) { // deprecated 
    549549        global $wpdb; 
    550550        return $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories WHERE category_parent = $parent ORDER BY category_count DESC LIMIT 100"); 
    551551} 
     
    554554        return strcasecmp($cat1['cat_name'], $cat2['cat_name']); 
    555555} 
    556556 
    557 function get_nested_categories($default = 0, $parent = 0) { 
     557function get_nested_categories($default = 0, $parent = 0, $cats = false, $checked_categories = false ) { 
    558558        global $post_ID, $link_id, $mode, $wpdb; 
    559559 
    560         if ($post_ID) { 
    561                 $checked_categories = $wpdb->get_col(" 
    562                      SELECT category_id 
    563                      FROM $wpdb->categories, $wpdb->post2cat 
    564                      WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID' 
    565                      "); 
     560        if ( !$cats ) 
     561                $cats = get_all_category_ids(); 
     562        if ( !$cats ) 
     563                return false; 
    566564 
    567                 if (count($checked_categories) == 0) { 
    568                         // No selected categories, strange 
     565        if ( false === $checked_categories ) { 
     566                if ( $post_ID ) { 
     567                        $checked_categories = $wpdb->get_col(" 
     568                             SELECT category_id 
     569                             FROM $wpdb->categories, $wpdb->post2cat 
     570                             WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID' 
     571                             "); 
     572 
     573                        if (count($checked_categories) == 0) { 
     574                                // No selected categories, strange 
     575                                $checked_categories[] = $default; 
     576                        } 
     577                } else if ( $link_id ) { 
     578                        $checked_categories = $wpdb->get_col(" 
     579                             SELECT category_id 
     580                             FROM $wpdb->categories, $wpdb->link2cat 
     581                             WHERE $wpdb->link2cat.category_id = cat_ID AND $wpdb->link2cat.link_id = '$link_id' 
     582                             "); 
     583 
     584                        if (count($checked_categories) == 0) { 
     585                                // No selected categories, strange 
     586                                $checked_categories[] = $default; 
     587                        }        
     588                } else { 
    569589                        $checked_categories[] = $default; 
    570590                } 
    571         } else if ($link_id) { 
    572                 $checked_categories = $wpdb->get_col(" 
    573                      SELECT category_id 
    574                      FROM $wpdb->categories, $wpdb->link2cat 
    575                      WHERE $wpdb->link2cat.category_id = cat_ID AND $wpdb->link2cat.link_id = '$link_id' 
    576                      "); 
    577  
    578                 if (count($checked_categories) == 0) { 
    579                         // No selected categories, strange 
    580                         $checked_categories[] = $default; 
    581                 }        
    582         } else { 
    583                 $checked_categories[] = $default; 
    584591        } 
    585592 
    586         $cats = return_categories_list($parent); 
    587593        $result = array (); 
    588594 
    589         if (is_array($cats)) { 
    590                 foreach ($cats as $cat) { 
    591                         $result[$cat]['children'] = get_nested_categories($default, $cat); 
    592                         $result[$cat]['cat_ID'] = $cat; 
    593                         $result[$cat]['checked'] = in_array($cat, $checked_categories); 
    594                         $result[$cat]['cat_name'] = get_the_category_by_ID($cat); 
    595                 } 
     595        foreach ( (array) $cats as $cat ) { 
     596                $_cat = &get_category( $cat ); 
     597                if ( $parent != $_cat->category_parent ) 
     598                        continue; 
     599                $result[$cat]['children'] = get_nested_categories( $default, $cat, $cats, $checked_categories ); 
     600                $result[$cat]['cat_ID'] = $cat; 
     601                $result[$cat]['checked'] = in_array($cat, $checked_categories); 
     602                $result[$cat]['cat_name'] = $_cat->cat_name; 
    596603        } 
    597604 
    598605        usort($result, 'sort_cats'); 
     
    617624} 
    618625 
    619626// Dandy new recursive multiple category stuff. 
    620 function cat_rows($parent = 0, $level = 0, $categories = 0) { 
    621         global $wpdb, $class; 
     627function cat_rows($level = 0, $categories = 0) { 
     628        global $class; 
    622629 
    623630        if (!$categories) 
    624                 $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name"); 
     631                $categories = get_nested_categories(); 
     632        if (!$categories) 
     633                return false; 
    625634 
    626         if ($categories) { 
    627                 foreach ($categories as $category) { 
    628                         if ($category->category_parent == $parent) { 
    629                                 $category->cat_name = wp_specialchars($category->cat_name,'double'); 
    630                                 $pad = str_repeat('— ', $level); 
    631                                 if ( current_user_can('manage_categories') ) { 
    632                                         $edit = "<a href='categories.php?action=edit&amp;cat_ID=$category->cat_ID' class='edit'>".__('Edit')."</a></td>"; 
    633                                         $default_cat_id = get_option('default_category'); 
    634                                         $default_link_cat_id = get_option('default_link_category'); 
     635        $default_cat_id = get_option('default_category'); 
     636        $default_link_cat_id = get_option('default_link_category'); 
    635637 
    636                                         if ( ($category->cat_ID != $default_cat_id) && ($category->cat_ID != $default_link_cat_id) ) 
    637                                                 $edit .= "<td><a href='categories.php?action=delete&amp;cat_ID=$category->cat_ID' onclick=\"return deleteSomething( 'cat', $category->cat_ID, '".sprintf(__("You are about to delete the category &quot;%s&quot;.\\nAll of its posts will go into the default category of &quot;%s&quot;\\nAll of its bookmarks will go into the default category of &quot;%s&quot;.\\n&quot;OK&quot; to delete, &quot;Cancel&quot; to stop."), addslashes($category->cat_name), addslashes(wp_specialchars(get_catname($default_cat_id),'double')), addslashes(wp_specialchars(get_catname($default_link_cat_id),'double')))."' );\" class='delete'>".__('Delete')."</a>"; 
    638                                         else 
    639                                                 $edit .= "<td style='text-align:center'>".__("Default"); 
    640                                 } 
    641                                 else 
    642                                         $edit = ''; 
     638        foreach ($categories as $_category) { 
     639                $category = &get_category( $_category['cat_ID'] ); 
     640                $_category['cat_name'] = wp_specialchars($_category['cat_name'],'double'); 
     641                $pad = str_repeat('&#8212; ', $level); 
     642                if ( current_user_can('manage_categories') ) { 
     643                        $edit = "<a href='categories.php?action=edit&amp;cat_ID=$category->cat_ID' class='edit'>".__('Edit')."</a></td>"; 
    643644 
    644                                 $class = ('alternate' == $class) ? '' : 'alternate'; 
    645                                 echo "<tr id='cat-$category->cat_ID' class='$class'><th scope='row'>$category->cat_ID</th><td>$pad $category->cat_name</td> 
    646                                                                 <td>$category->category_description</td> 
    647                                                                 <td>$category->category_count</td> 
    648                                                                 <td>$category->link_count</td> 
    649                                                                 <td>$edit</td> 
    650                                                                 </tr>"; 
    651                                 cat_rows($category->cat_ID, $level +1, $categories); 
    652                         } 
     645                        if ( ($category->cat_ID != $default_cat_id) && ($category->cat_ID != $default_link_cat_id) ) 
     646                                $edit .= "<td><a href='categories.php?action=delete&amp;cat_ID=$category->cat_ID' onclick=\"return deleteSomething( 'cat', $category->cat_ID, '".sprintf(__("You are about to delete the category &quot;%s&quot;.\\nAll of its posts will go into the default category of &quot;%s&quot;\\nAll of its bookmarks will go into the default category of &quot;%s&quot;.\\n&quot;OK&quot; to delete, &quot;Cancel&quot; to stop."), addslashes($_category['cat_name']), addslashes(wp_specialchars(get_catname($default_cat_id),'double')), addslashes(wp_specialchars(get_catname($default_link_cat_id),'double')))."' );\" class='delete'>".__('Delete')."</a>"; 
     647                        else 
     648                                $edit .= "<td style='text-align:center'>".__("Default"); 
    653649                } 
    654         } else { 
    655                 return false; 
     650                else 
     651                        $edit = ''; 
     652 
     653                $class = ('alternate' == $class) ? '' : 'alternate'; 
     654                echo "<tr id='cat-$category->cat_ID' class='$class'><th scope='row'>$category->cat_ID</th><td>$pad {$_category['cat_name']}</td> 
     655                                                <td>$category->category_description</td> 
     656                                                <td>$category->category_count</td> 
     657                                                <td>$category->link_count</td> 
     658                                                <td>$edit</td> 
     659                                                </tr>"; 
     660                if ( $_category['children'] ) 
     661                        cat_rows($level + 1, $_category['children']); 
    656662        } 
    657663} 
    658664 
     
    692698        } 
    693699} 
    694700 
    695 function wp_dropdown_cats($currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0) { 
    696         global $wpdb, $bgcolor; 
    697         if (!$categories) { 
    698                 $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name"); 
    699         } 
    700         if ($categories) { 
    701                 foreach ($categories as $category) { 
    702                         if ($currentcat != $category->cat_ID && $parent == $category->category_parent) { 
    703                                 $pad = str_repeat('&#8211; ', $level); 
    704                                 $category->cat_name = wp_specialchars($category->cat_name); 
    705                                 echo "\n\t<option value='$category->cat_ID'"; 
    706                                 if ($currentparent == $category->cat_ID) 
    707                                         echo " selected='selected'"; 
    708                                 echo ">$pad$category->cat_name</option>"; 
    709                                 wp_dropdown_cats($currentcat, $currentparent, $category->cat_ID, $level +1, $categories); 
    710                         } 
     701function wp_dropdown_cats($currentcat = 0, $currentparent = 0, $level = 0, $categories = 0) { 
     702        global $bgcolor; 
     703        if ( !$categories ) 
     704                $categories = get_nested_categories(); 
     705        if ( !$categories ) 
     706                return false; 
     707 
     708        foreach ($categories as $category) { 
     709                if ($currentcat != $category['cat_ID'] ) { 
     710                        $pad = str_repeat('&#8211; ', $level); 
     711                        $category['cat_name'] = wp_specialchars($category['cat_name']); 
     712                        echo "\n\t<option value='{$category['cat_ID']}'"; 
     713                        if ($currentparent == $category['cat_ID']) 
     714                                echo " selected='selected'"; 
     715                        echo ">$pad{$category['cat_name']}</option>"; 
     716                        if ( $category['children'] ) 
     717                                wp_dropdown_cats($currentcat, $currentparent, $level + 1, $category['children']); 
    711718                } 
    712         } else { 
    713                 return false; 
    714719        } 
    715720} 
    716721