Changeset 3536

Show
Ignore:
Timestamp:
02/17/06 00:57:10 (3 years ago)
Author:
ryan
Message:

Dynamic menu reparenting. fixes #2257

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/wp-admin/admin-functions.php

    r3520 r3536  
    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; 
     1240 
     1241    if ( empty($parent) ) 
     1242        return true; 
     1243 
     1244    if (isset ($submenu[$parent])) { 
     1245        foreach ($submenu[$parent] as $submenu_array) { 
     1246            if ($submenu_array[2] == $pagenow) { 
     1247                if (current_user_can($submenu_array[1])) 
     1248                    return true; 
     1249                else 
     1250                    return false; 
     1251            } 
     1252        } 
     1253    } 
    12361254 
    12371255    foreach ($menu as $menu_array) { 
    12381256        //echo "parent array: " . $menu_array[2]; 
    12391257        if ($menu_array[2] == $parent) { 
    1240             if (!current_user_can($menu_array[1])) { 
     1258            if (current_user_can($menu_array[1])) 
     1259                return true; 
     1260            else 
    12411261                return false; 
    1242             } else { 
    1243                 break; 
    1244             } 
    1245         } 
    1246     } 
    1247  
    1248     if (isset ($submenu[$parent])) { 
    1249         foreach ($submenu[$parent] as $submenu_array) { 
    1250             if ($submenu_array[2] == $pagenow) { 
    1251                 if (!current_user_can($submenu_array[1])) { 
    1252                     return false; 
    1253                 } else { 
    1254                     return true; 
    1255                 } 
    1256             } 
    1257         } 
    1258     } 
    1259  
     1262        } 
     1263    } 
     1264     
    12601265    return true; 
    12611266} 
     
    13141319    global $pagenow; 
    13151320    global $plugin_page; 
    1316  
    1317     if (isset ($parent_file) && !empty ($parent_file)) { 
     1321    global $real_parent_file; 
     1322 
     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    } 
     
    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        } 
     
    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; 
     
    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 
  • trunk/wp-admin/menu-header.php

    r3517 r3536  
    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>"; 
  • trunk/wp-admin/menu.php

    r3185 r3536  
    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) {