Make WordPress Core

Ticket #2257: auto_parent.diff

File auto_parent.diff, 5.2 KB (added by ryan, 19 years ago)

Automattically determine proper menu parent

  • wp-admin/menu-header.php

     
    1111        // 0 = name, 1 = capability, 2 = file
    1212        if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"';
    1313   
    14         if ( current_user_can($item[1]) ) {
     14        if ( !empty($submenu[$item[2]]) || current_user_can($item[1]) ) {
    1515                if ( file_exists(ABSPATH . "wp-content/plugins/{$item[2]}") )
    1616                        echo "\n\t<li><a href='" . get_settings('siteurl') . "/wp-admin/admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
    1717                else
  • wp-admin/menu.php

     
    4949$submenu['themes.php'][5] = array(__('Themes'), 'switch_themes', 'themes.php');
    5050$submenu['themes.php'][10] = array(__('Theme Editor'), 'edit_themes', 'theme-editor.php');
    5151
     52// Loop over submenus and remove pages for which the user does not have privs.
     53foreach ($submenu as $parent => $sub) {
     54        foreach ($sub as $index => $data) {
     55                if ( ! current_user_can($data[1]) ) {
     56                        $menu_nopriv[$data[2]] = true;
     57                        unset($submenu[$parent][$index]);
     58                }
     59        }
     60       
     61        if ( empty($submenu[$parent]) )
     62                unset($submenu[$parent]);
     63}
     64
     65// Loop over the top-level menu.
     66// Remove menus that have no accessible submenus and require privs that the user does not have.
     67// Menus for which the original parent is not acessible due to lack of privs will have the next
     68// submenu in line be assigned as the new menu parent.
     69foreach ( $menu as $id => $data ) {
     70        // If submenu is empty...
     71        if ( empty($submenu[$data[2]]) ) {
     72                // And user doesn't have privs, remove menu.
     73                if ( ! current_user_can($data[1]) ) {
     74                        $menu_nopriv[$data[2]] = true;
     75                        unset($menu[$id]);
     76                }
     77        } else {
     78                $subs = $submenu[$data[2]];
     79                $first_sub = array_shift($subs);
     80                $old_parent = $data[2];
     81                $new_parent = $first_sub[2];
     82                // If the first submenu is not the same as the assigned parent,
     83                // make the first submenu the new parent.
     84                if ( $new_parent != $old_parent ) {
     85                        $real_parent_file[$old_parent] = $new_parent;
     86                        $menu[$id][2] = $new_parent;
     87                       
     88                        foreach ($submenu[$old_parent] as $index => $data) {
     89                                $submenu[$new_parent][$index] = $submenu[$old_parent][$index];
     90                                unset($submenu[$old_parent][$index]);
     91                        }
     92                        unset($submenu[$old_parent]);   
     93                }
     94        }
     95}
     96
    5297// Create list of page plugin hook names.
    5398foreach ($menu as $menu_page) {
    5499        $admin_page_hooks[$menu_page[2]] = sanitize_title($menu_page[0]);
  • wp-admin/admin-functions.php

     
    12311231        global $pagenow;
    12321232        global $menu;
    12331233        global $submenu;
     1234        global $menu_nopriv;
    12341235
    12351236        $parent = get_admin_page_parent();
     1237       
     1238        if ( isset($menu_nopriv[$pagenow]) )
     1239                return false;
    12361240
    1237         foreach ($menu as $menu_array) {
    1238                 //echo "parent array: " . $menu_array[2];
    1239                 if ($menu_array[2] == $parent) {
    1240                         if (!current_user_can($menu_array[1])) {
    1241                                 return false;
    1242                         } else {
    1243                                 break;
    1244                         }
    1245                 }
    1246         }
     1241        if ( empty($parent) )
     1242                return true;
    12471243
    12481244        if (isset ($submenu[$parent])) {
    12491245                foreach ($submenu[$parent] as $submenu_array) {
    12501246                        if ($submenu_array[2] == $pagenow) {
    1251                                 if (!current_user_can($submenu_array[1])) {
     1247                                if (current_user_can($submenu_array[1]))
     1248                                        return true;
     1249                                else
    12521250                                        return false;
    1253                                 } else {
    1254                                         return true;
    1255                                 }
    12561251                        }
    12571252                }
    12581253        }
    12591254
     1255        foreach ($menu as $menu_array) {
     1256                //echo "parent array: " . $menu_array[2];
     1257                if ($menu_array[2] == $parent) {
     1258                        if (current_user_can($menu_array[1]))
     1259                                return true;
     1260                        else
     1261                                return false;
     1262                }
     1263        }
     1264       
    12601265        return true;
    12611266}
    12621267
     
    13131318        global $submenu;
    13141319        global $pagenow;
    13151320        global $plugin_page;
     1321        global $real_parent_file;
    13161322
    1317         if (isset ($parent_file) && !empty ($parent_file)) {
     1323        if ( !empty ($parent_file) ) {
     1324                if ( isset($real_parent_file[$parent_file]) )
     1325                        $parent_file = $real_parent_file[$parent_file];
     1326
    13181327                return $parent_file;
    13191328        }
    13201329
     
    13221331                foreach ($menu as $parent_menu) {
    13231332                        if ($parent_menu[2] == $plugin_page) {
    13241333                                $parent_file = $plugin_page;
    1325                                 return $plugin_page;
     1334                                if ( isset($real_parent_file[$parent_file]) )
     1335                                        $parent_file = $real_parent_file[$parent_file];
     1336                                       
     1337                                return $parent_file;
    13261338                        }
    13271339                }
    13281340        }
    13291341
    13301342        foreach (array_keys($submenu) as $parent) {
    13311343                foreach ($submenu[$parent] as $submenu_array) {
     1344                        if ( isset($real_parent_file[$parent]) )
     1345                                $parent = $real_parent_file[$parent];
    13321346                        if ($submenu_array[2] == $pagenow) {
    13331347                                $parent_file = $parent;
    13341348                                return $parent;
     
    13631377function add_submenu_page($parent, $page_title, $menu_title, $access_level, $file, $function = '') {
    13641378        global $submenu;
    13651379        global $menu;
     1380        global $real_parent_file;
    13661381
    13671382        $parent = plugin_basename($parent);
     1383        if ( isset($real_parent_file[$parent]) )
     1384                $parent = $real_parent_file[$parent];
     1385
    13681386        $file = plugin_basename($file);
    13691387
    13701388        // If the parent doesn't already have a submenu, add a link to the parent