WordPress.org

Make WordPress Core

Ticket #2621: 2621.diff

File 2621.diff, 8.7 KB (added by mdawaffe, 12 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