WordPress.org

Make WordPress Core

Ticket #23119: 23119.19.diff

File 23119.19.diff, 42.4 KB (added by lessbloat, 15 months ago)
  • wp-admin/includes/list-table.php

     
    2323                'WP_Posts_List_Table' => 'posts', 
    2424                'WP_Media_List_Table' => 'media', 
    2525                'WP_Terms_List_Table' => 'terms', 
     26                'WP_Menus_List_Table' => 'menus', 
    2627                'WP_Users_List_Table' => 'users', 
    2728                'WP_Comments_List_Table' => 'comments', 
    2829                'WP_Post_Comments_List_Table' => 'comments', 
  • wp-admin/includes/misc.php

     
    346346                        case 'upload_per_page': 
    347347                        case 'edit_tags_per_page': 
    348348                        case 'plugins_per_page': 
     349                        case 'nav_menus_per_page': 
    349350                        // Network admin 
    350351                        case 'sites_network_per_page': 
    351352                        case 'users_network_per_page': 
  • wp-admin/includes/class-wp-menus-list-table.php

     
     1<?php 
     2 
     3/** 
     4 * Nav Menus List Table class. 
     5 * 
     6 * @package WordPress 
     7 * @subpackage List_Table 
     8 * @since 3.6 
     9 * @access private 
     10 */ 
     11class WP_Menus_List_Table extends WP_List_Table { 
     12 
     13        function __construct( $args = array() ) { 
     14 
     15                parent::__construct( array( 
     16                                'plural' => 'menus', 
     17                                'singular' => 'menu', 
     18                                'screen' => isset( $args['screen'] ) ? $args['screen'] : null, 
     19                        ) ); 
     20 
     21        } 
     22 
     23        function ajax_user_can() { 
     24                return current_user_can( 'edit_theme_options' ); 
     25        } 
     26 
     27        function prepare_items() { 
     28 
     29                $args = array(); 
     30 
     31                // order & orderby 
     32                $valid_arg_options = array( 
     33                        'orderby' => $this->get_sortable_columns(), 
     34                        'order' => array( 'asc', 'desc' ), 
     35                ); 
     36                foreach ( $valid_arg_options as $arg_key => $valid_options ) { 
     37                        if ( ! empty( $_REQUEST[$arg_key] ) && in_array( $_REQUEST[$arg_key], $valid_options ) ) 
     38                                $args[$arg_key] = $_REQUEST[$arg_key]; 
     39                } 
     40 
     41                // search 
     42                if ( ! empty( $_REQUEST['s'] ) ) 
     43                        $args['search'] = strip_tags( trim( $_REQUEST['s'] ) ); 
     44 
     45                // pagination 
     46                $per_page = apply_filters( 'nav_menus_per_page', $this->get_items_per_page( 'nav_menus_per_page' ) ); 
     47                $page = $this->get_pagenum(); 
     48 
     49                $defaults = array( 
     50                        'orderby' => 'name', 
     51                        'order' => 'asc', 
     52                        'offset' => ( $page - 1 ) * $per_page, 
     53                        'number' => $per_page, 
     54                ); 
     55                $args = wp_parse_args( $args, $defaults ); 
     56                $args = apply_filters( 'nav_menus_table_list_prepare_items_args', $args ); 
     57 
     58                $_args_to_calc_total_items = $args; 
     59                unset( $_args_to_calc_total_items['offset'] ); 
     60                $_args_to_calc_total_items['fields'] = 'count'; 
     61                $this->total_items = absint( wp_get_nav_menus( $_args_to_calc_total_items ) ); 
     62 
     63                $this->items = wp_get_nav_menus( $args ); 
     64 
     65                $this->set_pagination_args( array( 
     66                        'total_items' => $this->total_items, 
     67                        'per_page' => $per_page, 
     68                ) ); 
     69 
     70        } 
     71 
     72        function get_bulk_actions() { 
     73                $actions = array(); 
     74                $actions['delete_menus'] = __( 'Delete' ); 
     75 
     76                return apply_filters( 'nav_menus_bulk_actions', $actions ); 
     77        } 
     78 
     79        function get_columns() { 
     80                $columns = array( 
     81                        'cb'          => '<input type="checkbox" />', 
     82                        'name'            => __( 'Menu Name' ), 
     83                        'count'       => __( '# of links' ), 
     84                ); 
     85 
     86                return $columns; 
     87        } 
     88 
     89        function get_sortable_columns() { 
     90                $sortable_columns = array( 
     91                        'name'  => 'name', 
     92                        'count' => 'count', 
     93                ); 
     94 
     95                return $sortable_columns; 
     96        } 
     97 
     98 
     99        function single_row( $nav_menu, $level = 0 ) { 
     100                static $row_class = ''; 
     101                $row_class = ( $row_class == '' ? ' class="alternate"' : '' ); 
     102 
     103                echo '<tr id="' . esc_attr( 'menu-' . $nav_menu->term_id  ) . '"' . $row_class . '>'; 
     104                echo $this->single_row_columns( $nav_menu ); 
     105                echo '</tr>'; 
     106        } 
     107 
     108        function column_default( $nav_menu, $column_name ) { 
     109                return apply_filters( 'manage_nav_menu_custom_column', '', $column_name, $nav_menu->term_id ); 
     110        } 
     111 
     112 
     113        function column_cb( $nav_menu ) { 
     114                return '<label class="screen-reader-text" for="' . esc_attr( 'cb-select-' . $nav_menu->term_id . '">' . sprintf( __( 'Select %s' ), $nav_menu->name ) ) . '"></label>' . '<input type="checkbox" name="delete_menus[]" value="' . esc_attr( $nav_menu->term_id ) . '" id="' . esc_attr( 'cb-select-' . $nav_menu->term_id ) . '" />'; 
     115 
     116                return '&nbsp;'; 
     117        } 
     118 
     119        function column_name( $nav_menu ) { 
     120 
     121                $edit_link = esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => absint( $nav_menu->term_id ) ), admin_url( 'nav-menus.php' ) ) ); 
     122                $delete_link = wp_nonce_url( add_query_arg( array( 'action' => 'delete', 'menu' => absint( $nav_menu->term_id ) ), admin_url( 'nav-menus.php' ) ), 'delete-nav_menu-' . $nav_menu->term_id ); 
     123 
     124                $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $nav_menu->name ) ) . '">' . $nav_menu->name . '</a></strong><br />'; 
     125 
     126                $actions = array(); 
     127                $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 
     128                $actions['delete'] = "<a class='delete-menu' href='" . $delete_link . "'>" . __( 'Delete' ) . "</a>"; 
     129 
     130 
     131                $actions = apply_filters( 'nav_menu_row_actions', $actions, $nav_menu ); 
     132 
     133                $out .= $this->row_actions( $actions ); 
     134 
     135                return $out; 
     136        } 
     137 
     138        function column_count( $nav_menu ) { 
     139                return $nav_menu->count; 
     140        } 
     141 
     142        function should_display_search() { 
     143                return apply_filters( 'nav_menu_table_list_should_display_search', ( $this->total_items > 20 ) ); 
     144        } 
     145 
     146} 
     147 No newline at end of file 
  • wp-admin/includes/nav-menu.php

     
    8181 
    8282                $title = empty( $item->label ) ? $title : $item->label; 
    8383 
     84                $submenu_text = ''; 
     85                if (0 == $depth) 
     86                        $submenu_text = 'style="display: none;"'; 
     87 
    8488                ?> 
    8589                <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>"> 
    8690                        <dl class="menu-item-bar"> 
    8791                                <dt class="menu-item-handle"> 
    88                                         <span class="item-title"><?php echo esc_html( $title ); ?></span> 
     92                                        <span class="item-title"><?php echo esc_html( $title ); ?> <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span> 
    8993                                        <span class="item-controls"> 
    9094                                                <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span> 
    9195                                                <span class="item-order hide-if-js"> 
     
    382386 **/ 
    383387function wp_nav_menu_setup() { 
    384388        // Register meta boxes 
    385         if ( wp_get_nav_menus() ) 
    386                 add_meta_box( 'nav-menu-theme-locations', __( 'Theme Locations' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' ); 
    387         add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); 
    388         wp_nav_menu_post_type_meta_boxes(); 
    389         wp_nav_menu_taxonomy_meta_boxes(); 
     389        if ( wp_get_nav_menus() && ! isset( $_POST['menu-name'] ) && ! isset( $_GET['action'] ) || isset( $_GET['_wpnonce'] ) ) 
     390                add_meta_box( 'nav-menu-theme-locations', __( 'Menus within your theme' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' ); 
    390391 
     392        $nav_menus = wp_get_nav_menus( array('orderby' => 'name') ); 
     393 
     394        if ( empty( $nav_menus ) || isset( $_POST['menu-name'] ) || isset( $_GET['action'] ) && ! isset( $_GET['_wpnonce'] ) ) { 
     395                wp_nav_menu_post_type_meta_boxes(); 
     396                add_meta_box( 'add-common-links', __('Common Links'), 'wp_nav_menu_item_common_link_meta_box', 'nav-menus', 'side', 'core' ); 
     397                add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); 
     398                wp_nav_menu_taxonomy_meta_boxes(); 
     399        } 
     400 
    391401        // Register advanced menu items (columns) 
    392         add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns'); 
     402        if ( empty( $nav_menus ) || isset( $_POST['menu-name'] ) || isset( $_GET['action'] ) && ! isset( $_GET['_wpnonce'] ) ) { 
     403                add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns'); 
     404        } 
    393405 
    394406        // If first time editing, disable advanced items by default. 
    395407        if( false === get_user_option( 'managenav-menuscolumnshidden' ) ) { 
     
    411423        if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) ) 
    412424                return; 
    413425 
    414         $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-custom-links', 'add-page', 'add-category' ); 
     426        $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-page', 'add-common-links', 'add-custom-links', 'add-category' ); 
    415427        $hidden_meta_boxes = array(); 
    416428 
    417429        foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) { 
     
    445457                $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type ); 
    446458                if ( $post_type ) { 
    447459                        $id = $post_type->name; 
    448                         add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type ); 
     460                        add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'high', $post_type ); 
    449461                } 
    450462        } 
    451463} 
     
    489501        $menu_locations = get_nav_menu_locations(); 
    490502        $num_locations = count( array_keys($locations) ); 
    491503 
    492         echo '<p class="howto">' . sprintf( _n('Your theme supports %s menu. Select which menu you would like to use.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n($num_locations) ) . '</p>'; 
     504        echo '<p class="howto">' . _n('Select a menu to use within your theme.', 'Select the menus you will use in your theme.', $num_locations ) . '</p>'; 
    493505 
    494506        foreach ( $locations as $location => $description ) { 
    495507                ?> 
     
    512524        } 
    513525        ?> 
    514526        <p class="button-controls"> 
    515                 <?php submit_button( __( 'Save' ), 'primary right', 'nav-menu-locations', false, disabled( $nav_menu_selected_id, 0, false ) ); ?> 
     527                <?php submit_button( __( 'Save' ), 'primary right', 'nav-menu-locations', false ); ?> 
    516528                <span class="spinner"></span> 
    517529        </p> 
    518530        <?php 
    519531} 
    520532 
    521533/** 
     534 * Displays a metabox for the common links menu item. 
     535 * 
     536 * @since 3.0.0 
     537 */ 
     538function wp_nav_menu_item_common_link_meta_box() { 
     539        global $blog_id, $_nav_menu_placeholder, $nav_menu_selected_id; 
     540        $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; 
     541 
     542        $removed_args = array( 
     543                'action', 
     544                'customlink-tab', 
     545                'edit-menu-item', 
     546                'menu-item', 
     547                'page-tab', 
     548                '_wpnonce', 
     549        ); 
     550 
     551        $common_links = array( 
     552                array( 
     553                        'url' => get_site_url(), 
     554                        'text' => __('Home') 
     555                ), 
     556                array( 
     557                        'url' => get_site_url($blog_id, '/wp-login.php'), 
     558                        'text' => __('Log in') 
     559                ) 
     560        ); 
     561        ?> 
     562        <div class="commonlinkdiv" id="commonlinkdiv"> 
     563 
     564                <div class="common-links"> 
     565                        <?php foreach ( $common_links as $link ) { ?> 
     566                        <label class="menu-item-title"><input type="checkbox" class="menu-item-checkbox" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-object-id]" value="<?php echo $link['url']; ?>" title="<?php echo $link['text']; ?>"> <?php echo $link['text']; ?></label> 
     567                        <?php } ?> 
     568                </div> 
     569 
     570                <p class="button-controls"> 
     571                        <span class="add-to-menu"> 
     572                                <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-common-menu-item" id="submit-commonlinkdiv" /> 
     573                                <span class="spinner"></span> 
     574                        </span> 
     575                </p> 
     576 
     577        </div><!-- /.commonlinkdiv --> 
     578        <?php 
     579} 
     580 
     581/** 
    522582 * Displays a metabox for the custom links menu item. 
    523583 * 
    524584 * @since 3.0.0 
     
    554614 
    555615                        <p id="menu-item-name-wrap"> 
    556616                                <label class="howto" for="custom-menu-item-name"> 
    557                                         <span><?php _e('Label'); ?></span> 
     617                                        <span><?php _e('Link Text'); ?></span> 
    558618                                        <input id="custom-menu-item-name" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-title]" type="text" class="regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Menu Item'); ?>" /> 
    559619                                </label> 
    560620                        </p> 
     
    10861146                $menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') ); 
    10871147                $result = '<div id="menu-instructions" class="post-body-plain'; 
    10881148                $result .= ( ! empty($menu_items) ) ? ' menu-instructions-inactive">' : '">'; 
    1089                 $result .= '<p>' . __('Select menu items (pages, categories, links) from the boxes at left to begin building your custom menu.') . '</p>'; 
     1149                $result .= '<p>' . __('Next, add menu items (i.e. pages, links, categories) from the column on the left.') . '</p>'; 
    10901150                $result .= '</div>'; 
    10911151 
    10921152                if( empty($menu_items) ) 
     
    11581218        foreach( (array) $menu_items_to_delete as $menu_item_id ) 
    11591219                wp_delete_post( $menu_item_id, true ); 
    11601220} 
     1221add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items'); 
    11611222 
    1162 add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items'); 
     1223/** 
     1224 * Delete nav menus from the nav menu management screen 
     1225 * 
     1226 * @access private 
     1227 * @since 3.6 
     1228 */ 
     1229function _wp_delete_nav_menu( $nav_menu_id ) { 
     1230 
     1231        if ( ! is_nav_menu( $nav_menu_id ) ) 
     1232                return; 
     1233 
     1234        $deleted_nav_menu = wp_get_nav_menu_object( $nav_menu_id ); 
     1235        $delete_nav_menu = wp_delete_nav_menu( $nav_menu_id ); 
     1236 
     1237        if ( is_wp_error( $delete_nav_menu ) ) 
     1238                return $delete_nav_menu; 
     1239 
     1240        // Remove this menu from any locations. 
     1241        $locations = get_theme_mod( 'nav_menu_locations' ); 
     1242        foreach ( (array) $locations as $location => $menu_id ) { 
     1243                if ( $menu_id == $nav_menu_id ) 
     1244                        $locations[ $location ] = 0; 
     1245        } 
     1246        set_theme_mod( 'nav_menu_locations', $locations ); 
     1247 
     1248        return true; 
     1249} 
     1250 No newline at end of file 
  • wp-admin/js/nav-menu.js

     
    4646                                this.initSortables(); 
    4747 
    4848                        this.initToggles(); 
    49  
    50                         this.initTabManager(); 
     49                         
     50                        this.messageFadeIn(); 
     51                         
     52                        this.initAccessibility(); 
    5153                }, 
    5254 
    5355                jQueryExtensions : function() { 
     
    8486                                        }); 
    8587                                        return result; 
    8688                                }, 
     89                                shiftHorizontally : function(dir) { 
     90                                        return this.each(function(){ 
     91                                                var t = $(this), 
     92                                                        depth = t.menuItemDepth(), 
     93                                                        newDepth = depth + dir; 
     94 
     95                                                // Change .menu-item-depth-n class 
     96                                                t.moveHorizontally(newDepth, depth); 
     97                                        }); 
     98                                }, 
     99                                moveHorizontally : function(newDepth, depth) { 
     100                                        return this.each(function(){ 
     101                                                var t = $(this), 
     102                                                        children = t.childMenuItems(), 
     103                                                        diff = newDepth - depth, 
     104                                                        subItemText = t.find('.is-submenu'); 
     105 
     106                                                // Change .menu-item-depth-n class 
     107                                                t.updateDepthClass(newDepth, depth).updateParentMenuItemDBId(); 
     108 
     109                                                // If it has children, move those too 
     110                                                if (children) { 
     111                                                        children.each(function( index ) { 
     112                                                                var thisDepth = $(this).menuItemDepth(), 
     113                                                                        newDepth = thisDepth + diff; 
     114                                                                $(this).updateDepthClass(newDepth, thisDepth).updateParentMenuItemDBId(); 
     115                                                        }); 
     116                                                } 
     117 
     118                                                // Show "Sub item" helper text 
     119                                                if (0 === newDepth) 
     120                                                        subItemText.hide(); 
     121                                                else 
     122                                                        subItemText.show(); 
     123                                        }); 
     124                                }, 
    87125                                updateParentMenuItemDBId : function() { 
    88126                                        return this.each(function(){ 
    89127                                                var item = $(this), 
    90128                                                        input = item.find('.menu-item-data-parent-id'), 
    91                                                         depth = item.menuItemDepth(), 
    92                                                         parent = item.prev(); 
     129                                                        depth = parseInt(item.menuItemDepth()), 
     130                                                        parentDepth = depth - 1; 
     131                                                        parent = item.prevAll('.menu-item-depth-' + parentDepth).first(); 
    93132 
    94133                                                if( depth == 0 ) { // Item is on the top level, has no parent 
    95134                                                        input.val(0); 
    96135                                                } else { // Find the parent item, and retrieve its object id. 
    97                                                         while( ! parent[0] || ! parent[0].className || -1 == parent[0].className.indexOf('menu-item') || ( parent.menuItemDepth() != depth - 1 ) ) 
    98                                                                 parent = parent.prev(); 
    99136                                                        input.val( parent.find('.menu-item-data-db-id').val() ); 
    100137                                                } 
    101138                                        }); 
     
    222259                                } 
    223260                        }); 
    224261                }, 
     262                 
     263                initAccessibility : function() { 
     264                        $('.item-edit').on('focus', function () { 
     265                                $(this).on('keydown', function (e) { 
    225266 
     267                                        // Bail if it's not an arrow key 
     268                                        if (e.which !== 37 && e.which !== 38 && e.which !== 39 && e.which !== 40) 
     269                                                return; 
     270 
     271                                        // Avoid multiple keydown events 
     272                                        $(this).off('keydown'); 
     273 
     274                                        var menuItems = $('#menu-to-edit li'); 
     275                                                menuItemsCount = menuItems.length, 
     276                                                thisItem = $(this).parents('li.menu-item'), 
     277                                                thisItemChildren = thisItem.childMenuItems(), 
     278                                                thisItemData = thisItem.getItemData(), 
     279                                                thisItemDepth = parseInt(thisItem.menuItemDepth()), 
     280                                                thisItemPosition = parseInt(thisItem.index()), 
     281                                                nextItem = thisItem.next(), 
     282                                                nextItemChildren = nextItem.childMenuItems(), 
     283                                                nextItemDepth = parseInt(nextItem.menuItemDepth()) + 1, 
     284                                                prevItem = thisItem.prev(), 
     285                                                prevItemDepth = parseInt(prevItem.menuItemDepth()), 
     286                                                prevItemId = prevItem.getItemData()['menu-item-db-id']; 
     287 
     288                                        // Bail if there is only one menu item 
     289                                        if (1 === menuItemsCount) 
     290                                                return; 
     291                                                 
     292                                        // If RTL, swap left/right arrows 
     293                                        var arrows = { '38' : 'up', '40' : 'down', '37' : 'left', '39' : 'right' }; 
     294                                        if ($('body').hasClass('rtl')) 
     295                                                arrows = { '38' : 'up', '40' : 'down', '39' : 'left', '37' : 'right' }; 
     296 
     297                                        switch (arrows[e.which]) { 
     298                                        case 'up': 
     299                                                var newItemPosition = thisItemPosition - 1; 
     300 
     301                                                // Already at top 
     302                                                if (0 === thisItemPosition) 
     303                                                        break; 
     304 
     305                                                // If a sub item is moved to top, shift it to 0 depth 
     306                                                if (0 === newItemPosition && 0 !== thisItemDepth) 
     307                                                        thisItem.moveHorizontally(0, thisItemDepth); 
     308 
     309                                                // If prev item is sub item, shift to match depth 
     310                                                if (0 !== prevItemDepth) 
     311                                                        thisItem.moveHorizontally(prevItemDepth, thisItemDepth); 
     312 
     313                                                // Does this item have sub items? 
     314                                                if (thisItemChildren) { 
     315                                                        var items = thisItem.add(thisItemChildren); 
     316                                                        // Move the entire block 
     317                                                        items.detach().insertBefore(menuItems.eq(newItemPosition)); 
     318                                                } else { 
     319                                                        thisItem.detach().insertBefore(menuItems.eq(newItemPosition)); 
     320                                                } 
     321                                                break; 
     322                                        case 'down': 
     323                                                // Does this item have sub items? 
     324                                                if (thisItemChildren) { 
     325                                                        var items = thisItem.add(thisItemChildren), 
     326                                                                nextItem = menuItems.eq(items.length + thisItemPosition), 
     327                                                                nextItemChildren = 0 !== nextItem.childMenuItems().length; 
     328 
     329                                                        if (nextItemChildren) { 
     330                                                                var newDepth = parseInt(nextItem.menuItemDepth()) + 1; 
     331                                                                thisItem.moveHorizontally(newDepth, thisItemDepth); 
     332                                                        } 
     333 
     334                                                        // Have we reached the bottom? 
     335                                                        if (menuItemsCount === thisItemPosition + items.length) 
     336                                                                break; 
     337 
     338                                                        items.detach().insertAfter(menuItems.eq(thisItemPosition + items.length)); 
     339                                                } else { 
     340                                                        // If next item has sub items, shift depth 
     341                                                        if (0 !== nextItemChildren.length) 
     342                                                                thisItem.moveHorizontally(nextItemDepth, thisItemDepth); 
     343 
     344                                                        // Have we reached the bottom 
     345                                                        if (menuItemsCount === thisItemPosition + 1) 
     346                                                                break; 
     347                                                        thisItem.detach().insertAfter(menuItems.eq(thisItemPosition + 1)); 
     348                                                } 
     349                                                break; 
     350                                        case 'left': 
     351                                                // As far left as possible 
     352                                                if (0 === thisItemDepth) 
     353                                                        break; 
     354                                                thisItem.shiftHorizontally(-1); 
     355                                                break; 
     356                                        case 'right': 
     357                                                // Can't be sub item at top 
     358                                                if (0 === thisItemPosition) 
     359                                                        break; 
     360                                                // Already sub item of prevItem 
     361                                                if (thisItemData['menu-item-parent-id'] === prevItemId) 
     362                                                        break; 
     363                                                thisItem.shiftHorizontally(1); 
     364                                                break; 
     365                                        } 
     366                                        api.registerChange(); 
     367                                        // Put focus back on same menu item 
     368                                        $('#edit-' + thisItemData['menu-item-db-id']).focus(); 
     369                                        return false; 
     370                                }); 
     371                        }).blur(function () { 
     372                                $(this).off('keydown'); 
     373                        }); 
     374                }, 
     375                 
     376                messageFadeIn : function() { 
     377                        var messages = $('#message'); 
     378                         
     379                        // Visual change when users save menus multiple times in a row 
     380                        messages.slideDown('slow'); 
     381                }, 
     382 
    226383                initToggles : function() { 
    227384                        // init postboxes 
    228385                        postboxes.add_postbox_toggles('nav-menus'); 
     
    245402                                menuEdge = api.menuList.offset().left, 
    246403                                body = $('body'), maxChildDepth, 
    247404                                menuMaxDepth = initialMenuMaxDepth(); 
     405                                 
     406                        if( 0 != $('#menu-to-edit li').length ) 
     407                                $('.drag-instructions').show(); 
    248408 
    249409                        // Use the right edge if RTL. 
    250410                        menuEdge += api.isRTL ? api.menuList.width() : 0; 
     
    307467 
    308468                                        // Return child elements to the list 
    309469                                        children = transport.children().insertAfter(ui.item); 
     470                                         
     471                                        // Add "sub menu" description 
     472                                        var subMenuTitle = ui.item.find('.item-title .is-submenu'); 
     473                                        if (0 < currentDepth) 
     474                                                subMenuTitle.show(); 
     475                                        else 
     476                                                subMenuTitle.hide(); 
    310477 
    311478                                        // Update depth classes 
    312479                                        if( depthChange != 0 ) { 
     
    327494                                                ui.item[0].style.left = 'auto'; 
    328495                                                ui.item[0].style.right = 0; 
    329496                                        } 
    330  
    331                                         // The width of the tab bar might have changed. Just in case. 
    332                                         api.refreshMenuTabs( true ); 
    333497                                }, 
    334498                                change: function(e, ui) { 
    335499                                        // Make sure the placeholder is inside the menu. 
     
    433597                                        $("#submit-customlinkdiv").click(); 
    434598                                } 
    435599                        }); 
     600                        $('#submit-commonlinkdiv').click(function () { 
     601                                api.addCommonLink(); 
     602                                return false; 
     603                        }); 
    436604                }, 
    437605 
    438606                /** 
     
    461629                                if( '' == $t.val() ) 
    462630                                        $t.addClass( name ).val( $t.data(name) ); 
    463631                        }); 
     632                         
     633                        $('.blank-slate .input-with-default-title').focus(); 
    464634                }, 
    465635 
    466636                attachThemeLocationsListeners : function() { 
     
    474644                                loc.find('.spinner').show(); 
    475645                                $.post( ajaxurl, params, function(r) { 
    476646                                        loc.find('.spinner').hide(); 
     647                                        $('.menu-location-success').slideDown('slow'); 
    477648                                }); 
    478649                                return false; 
    479650                        }); 
     
    521692                                api.processQuickSearchQueryResponse(menuMarkup, params, panel); 
    522693                        }); 
    523694                }, 
     695                 
     696                addCommonLink : function() { 
     697                         
     698                        $('#commonlinkdiv input[type="checkbox"]:checked').each(function( index ) { 
     699                                var url = $(this).val(), 
     700                                        linkText = $(this).prop('title'), 
     701                                        processMethod = api.addMenuItemToTop; 
    524702 
     703                                // Show the ajax spinner 
     704                                $('.commonlinkdiv .spinner').show(); 
     705                                api.addLinkToMenu( url, linkText, processMethod, function() { 
     706                                        // Remove the ajax spinner 
     707                                        $('.commonlinkdiv .spinner').hide(); 
     708                                }); 
     709                        }); 
     710                }, 
     711 
    525712                addCustomLink : function( processMethod ) { 
    526713                        var url = $('#custom-menu-item-url').val(), 
    527714                                label = $('#custom-menu-item-name').val(); 
     
    572759                        $.post( ajaxurl, params, function(menuMarkup) { 
    573760                                var ins = $('#menu-instructions'); 
    574761                                processMethod(menuMarkup, params); 
     762                                // Make it stand out a bit more visually, by adding a fadeIn 
     763                                $('li.pending').hide().fadeIn('slow'); 
     764                                $('.drag-instructions').show(); 
    575765                                if( ! ins.hasClass('menu-instructions-inactive') && ins.siblings().length ) 
    576766                                        ins.addClass('menu-instructions-inactive'); 
    577767                                callback(); 
     
    604794                                }; 
    605795                        } else { 
    606796                                // Make the post boxes read-only, as they can't be used yet 
    607                                 $('#menu-settings-column').find('input,select').prop('disabled', true).end().find('a').attr('href', '#').unbind('click'); 
     797                                $('#menu-settings-column').find('input,select').end().find('a').attr('href', '#').unbind('click'); 
    608798                        } 
    609799                }, 
    610800 
     
    688878                        }); 
    689879                }, 
    690880 
    691                 initTabManager : function() { 
    692                         var fixed = $('.nav-tabs-wrapper'), 
    693                                 fluid = fixed.children('.nav-tabs'), 
    694                                 active = fluid.children('.nav-tab-active'), 
    695                                 tabs = fluid.children('.nav-tab'), 
    696                                 tabsWidth = 0, 
    697                                 fixedRight, fixedLeft, 
    698                                 arrowLeft, arrowRight, resizeTimer, css = {}, 
    699                                 marginFluid = api.isRTL ? 'margin-right' : 'margin-left', 
    700                                 marginFixed = api.isRTL ? 'margin-left' : 'margin-right', 
    701                                 msPerPx = 2; 
    702  
    703                         /** 
    704                          * Refreshes the menu tabs. 
    705                          * Will show and hide arrows where necessary. 
    706                          * Scrolls to the active tab by default. 
    707                          * 
    708                          * @param savePosition {boolean} Optional. Prevents scrolling so 
    709                          *                that the current position is maintained. Default false. 
    710                          **/ 
    711                         api.refreshMenuTabs = function( savePosition ) { 
    712                                 var fixedWidth = fixed.width(), 
    713                                         margin = 0, css = {}; 
    714                                 fixedLeft = fixed.offset().left; 
    715                                 fixedRight = fixedLeft + fixedWidth; 
    716  
    717                                 if( !savePosition ) 
    718                                         active.makeTabVisible(); 
    719  
    720                                 // Prevent space from building up next to the last tab if there's more to show 
    721                                 if( tabs.last().isTabVisible() ) { 
    722                                         margin = fixed.width() - tabsWidth; 
    723                                         margin = margin > 0 ? 0 : margin; 
    724                                         css[marginFluid] = margin + 'px'; 
    725                                         fluid.animate( css, 100, "linear" ); 
    726                                 } 
    727  
    728                                 // Show the arrows only when necessary 
    729                                 if( fixedWidth > tabsWidth ) 
    730                                         arrowLeft.add( arrowRight ).hide(); 
    731                                 else 
    732                                         arrowLeft.add( arrowRight ).show(); 
    733                         } 
    734  
    735                         $.fn.extend({ 
    736                                 makeTabVisible : function() { 
    737                                         var t = this.eq(0), left, right, css = {}, shift = 0; 
    738  
    739                                         if( ! t.length ) return this; 
    740  
    741                                         left = t.offset().left; 
    742                                         right = left + t.outerWidth(); 
    743  
    744                                         if( right > fixedRight ) 
    745                                                 shift = fixedRight - right; 
    746                                         else if ( left < fixedLeft ) 
    747                                                 shift = fixedLeft - left; 
    748  
    749                                         if( ! shift ) return this; 
    750  
    751                                         css[marginFluid] = "+=" + api.negateIfRTL * shift + 'px'; 
    752                                         fluid.animate( css, Math.abs( shift ) * msPerPx, "linear" ); 
    753                                         return this; 
    754                                 }, 
    755                                 isTabVisible : function() { 
    756                                         var t = this.eq(0), 
    757                                                 left = t.offset().left, 
    758                                                 right = left + t.outerWidth(); 
    759                                         return ( right <= fixedRight && left >= fixedLeft ) ? true : false; 
    760                                 } 
    761                         }); 
    762  
    763                         // Find the width of all tabs 
    764                         tabs.each(function(){ 
    765                                 tabsWidth += $(this).outerWidth(true); 
    766                         }); 
    767  
    768                         // Set up fixed margin for overflow, unset padding 
    769                         css['padding'] = 0; 
    770                         css[marginFixed] = (-1 * tabsWidth) + 'px'; 
    771                         fluid.css( css ); 
    772  
    773                         // Build tab navigation 
    774                         arrowLeft = $('<div class="nav-tabs-arrow nav-tabs-arrow-left"><a>&laquo;</a></div>'); 
    775                         arrowRight = $('<div class="nav-tabs-arrow nav-tabs-arrow-right"><a>&raquo;</a></div>'); 
    776                         // Attach to the document 
    777                         fixed.wrap('<div class="nav-tabs-nav"/>').parent().prepend( arrowLeft ).append( arrowRight ); 
    778  
    779                         // Set the menu tabs 
    780                         api.refreshMenuTabs(); 
    781                         // Make sure the tabs reset on resize 
    782                         $(window).resize(function() { 
    783                                 if( resizeTimer ) clearTimeout(resizeTimer); 
    784                                 resizeTimer = setTimeout( api.refreshMenuTabs, 200); 
    785                         }); 
    786  
    787                         // Build arrow functions 
    788                         $.each([{ 
    789                                         arrow : arrowLeft, 
    790                                         next : "next", 
    791                                         last : "first", 
    792                                         operator : "+=" 
    793                                 },{ 
    794                                         arrow : arrowRight, 
    795                                         next : "prev", 
    796                                         last : "last", 
    797                                         operator : "-=" 
    798                                 }], function(){ 
    799                                 var that = this; 
    800                                 this.arrow.mousedown(function(){ 
    801                                         var marginFluidVal = Math.abs( parseInt( fluid.css(marginFluid) ) ), 
    802                                                 shift = marginFluidVal, 
    803                                                 css = {}; 
    804  
    805                                         if( "-=" == that.operator ) 
    806                                                 shift = Math.abs( tabsWidth - fixed.width() ) - marginFluidVal; 
    807  
    808                                         if( ! shift ) return; 
    809  
    810                                         css[marginFluid] = that.operator + shift + 'px'; 
    811                                         fluid.animate( css, shift * msPerPx, "linear" ); 
    812                                 }).mouseup(function(){ 
    813                                         var tab, next; 
    814                                         fluid.stop(true); 
    815                                         tab = tabs[that.last](); 
    816                                         while( (next = tab[that.next]()) && next.length && ! next.isTabVisible() ) { 
    817                                                 tab = next; 
    818                                         } 
    819                                         tab.makeTabVisible(); 
    820                                 }); 
    821                         }); 
    822                 }, 
    823  
    824881                eventOnClickEditLink : function(clickedEl) { 
    825882                        var settings, item, 
    826883                        matchedSection = /#(.*)$/.exec(clickedEl.href); 
     
    9451002                                        var ins = $('#menu-instructions'); 
    9461003                                        el.remove(); 
    9471004                                        children.shiftDepthClass(-1).updateParentMenuItemDBId(); 
    948                                         if( ! ins.siblings().length ) 
     1005                                        if( 0 == $('#menu-to-edit li').length ) { 
     1006                                                $('.drag-instructions').hide(); 
    9491007                                                ins.removeClass('menu-instructions-inactive'); 
     1008                                        } 
    9501009                                }); 
    9511010                }, 
    9521011 
  • wp-admin/nav-menus.php

     
    221221                if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) ) 
    222222                        $messages[] = '<div id="message" class="updated"><p>' . __('The menu item has been successfully deleted.') . '</p></div>'; 
    223223                break; 
     224 
    224225        case 'delete': 
    225226                check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id ); 
    226  
    227227                if ( is_nav_menu( $nav_menu_selected_id ) ) { 
    228                         $deleted_nav_menu = wp_get_nav_menu_object( $nav_menu_selected_id ); 
    229                         $delete_nav_menu = wp_delete_nav_menu( $nav_menu_selected_id ); 
    230  
    231                         if ( is_wp_error($delete_nav_menu) ) { 
    232                                 $messages[] = '<div id="message" class="error"><p>' . $delete_nav_menu->get_error_message() . '</p></div>'; 
    233                         } else { 
    234                                 // Remove this menu from any locations. 
    235                                 $locations = get_theme_mod( 'nav_menu_locations' ); 
    236                                 foreach ( (array) $locations as $location => $menu_id ) { 
    237                                         if ( $menu_id == $nav_menu_selected_id ) 
    238                                                 $locations[ $location ] = 0; 
    239                                 } 
    240                                 set_theme_mod( 'nav_menu_locations', $locations ); 
    241                                 $messages[] = '<div id="message" class="updated"><p>' . __('The menu has been successfully deleted.') . '</p></div>'; 
    242                                 // Select the next available menu 
    243                                 $nav_menu_selected_id = 0; 
    244                                 $_nav_menus = wp_get_nav_menus( array('orderby' => 'name') ); 
    245                                 foreach( $_nav_menus as $index => $_nav_menu ) { 
    246                                         if ( strcmp( $_nav_menu->name, $deleted_nav_menu->name ) >= 0 
    247                                          || $index == count( $_nav_menus ) - 1 ) { 
    248                                                 $nav_menu_selected_id = $_nav_menu->term_id; 
    249                                                 break; 
    250                                         } 
    251                                 } 
    252                         } 
    253                         unset( $delete_nav_menu, $deleted_nav_menu, $_nav_menus ); 
     228                        $deletion = _wp_delete_nav_menu( $nav_menu_selected_id ); 
    254229                } else { 
    255230                        // Reset the selected menu 
    256231                        $nav_menu_selected_id = 0; 
    257232                        unset( $_REQUEST['menu'] ); 
    258233                } 
     234                 
     235                if ( ! isset( $deletion ) ) 
     236                        break; 
     237 
     238                if ( is_wp_error( $deletion ) ) 
     239                        $messages[] = '<div id="message" class="error"><p>' . $deletion->get_error_message() . '</p></div>'; 
     240                else 
     241                        $messages[] = '<div id="message" class="updated"><p>' . __( 'The menu has been successfully deleted.' ) . '</p></div>'; 
    259242                break; 
    260243 
     244        case 'delete_menus': 
     245                check_admin_referer( 'nav_menus_bulk_actions' ); 
     246                foreach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) { 
     247                        if ( ! is_nav_menu( $menu_id_to_delete ) ) 
     248                                continue; 
     249 
     250                        $deletion = _wp_delete_nav_menu( $menu_id_to_delete ); 
     251                        if ( is_wp_error( $deletion ) ) { 
     252                                $messages[] = '<div id="message" class="error"><p>' . $deletion->get_error_message() . '</p></div>'; 
     253                                $deletion_error = true; 
     254                        } 
     255                } 
     256 
     257                if ( empty( $deletion_error ) ) 
     258                        $messages[] = '<div id="message" class="updated"><p>' . __( 'Selected menus have been successfully deleted.' ) . '</p></div>'; 
     259                break; 
     260 
    261261        case 'update': 
    262262                check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); 
    263263 
     
    367367 
    368368                                do_action( 'wp_update_nav_menu', $nav_menu_selected_id ); 
    369369 
    370                                 $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been updated.'), $nav_menu_selected_title ) . '</p></div>'; 
     370                                $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('<strong>%1$s</strong> has been updated. <a href="%2$s">Assign a theme location for this menu</a>, or <a href="%3$s">use it in a widget</a>.'), $nav_menu_selected_title, admin_url( 'nav-menus.php' ), admin_url( 'widgets.php' ) ) . '</p></div>'; 
    371371                                unset( $menu_items, $unsorted_menu_items ); 
    372372                        } 
    373373                } 
     
    434434if ( ! current_theme_supports( 'menus' ) && ! wp_get_nav_menus() ) 
    435435        $messages[] = '<div id="message" class="updated"><p>' . __('The current theme does not natively support menus, but you can use the &#8220;Custom Menu&#8221; widget to add any menus you create here to the theme&#8217;s sidebar.') . '</p></div>'; 
    436436 
     437add_screen_option( 'per_page', array('label' => _x( 'Menus', 'nav menus per page (screen options)' )) ); 
     438 
    437439get_current_screen()->add_help_tab( array( 
    438440'id'            => 'overview', 
    439441'title'         => __('Overview'), 
     
    455457        '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>' 
    456458); 
    457459 
     460// prep the table view 
     461$wp_list_table = _get_list_table( 'WP_Menus_List_Table' ); 
     462$pagenum = $wp_list_table->get_pagenum(); 
     463$wp_list_table->prepare_items(); 
     464 
    458465// Get the admin header 
    459466require_once( './admin-header.php' ); 
    460467?> 
    461468<div class="wrap"> 
    462469        <?php screen_icon(); ?> 
    463         <h2><?php esc_html_e('Menus'); ?></h2> 
     470        <h2 class="nav-tab-wrapper"> 
     471                <a href="<?php echo admin_url( 'nav-menus.php' ); ?>" class="nav-tab<?php if ( ! isset( $_POST['menu-name'] ) && ! isset( $_GET['action'] ) || isset( $_GET['_wpnonce'] ) ) echo ' nav-tab-active'; ?>"><?php esc_html_e('Manage Menus'); ?></a> 
     472                <a href="<?php echo esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, ), admin_url( 'nav-menus.php' ) ) ); ?>" class="nav-tab<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] ) echo ' nav-tab-active'; ?>"><?php esc_html_e('Add Menu'); ?></a> 
     473        </h2> 
    464474        <?php 
    465475        foreach( $messages as $message ) : 
    466476                echo $message . "\n"; 
    467477        endforeach; 
    468478        ?> 
     479        <div class="updated menu-location-success" style="display: none;"><p><?php echo sprintf( __('The menus within your theme have been updated. <a href="%s">Visit your site</a> to preview these changes.'), get_site_url() ); ?></p></div> 
    469480        <div id="nav-menus-frame"> 
    470         <div id="menu-settings-column" class="metabox-holder<?php if ( !$nav_menu_selected_id ) { echo ' metabox-holder-disabled'; } ?>"> 
     481        <div id="menu-settings-column" class="metabox-holder<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] || empty( $nav_menus ) ) { echo ' metabox-holder-disabled'; } ?>"> 
    471482 
     483                <div class="clear"></div> 
     484 
    472485                <form id="nav-menu-meta" action="<?php echo admin_url( 'nav-menus.php' ); ?>" class="nav-menu-meta" method="post" enctype="multipart/form-data"> 
    473486                        <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> 
    474487                        <input type="hidden" name="action" value="add-menu-item" /> 
     
    479492        </div><!-- /#menu-settings-column --> 
    480493        <div id="menu-management-liquid"> 
    481494                <div id="menu-management"> 
    482                         <div id="select-nav-menu-container" class="hide-if-js"> 
    483                                 <form id="select-nav-menu" action=""> 
    484                                         <strong><label for="select-nav-menu"><?php esc_html_e( 'Select Menu:' ); ?></label></strong> 
    485                                         <select class="select-nav-menu" name="menu"> 
    486                                                 <?php foreach( (array) $nav_menus as $_nav_menu ) : ?> 
    487                                                         <option value="<?php echo esc_attr($_nav_menu->term_id) ?>" <?php selected($nav_menu_selected_id, $_nav_menu->term_id); ?>> 
    488                                                                 <?php echo esc_html( $_nav_menu->truncated_name ); ?> 
    489                                                         </option> 
    490                                                 <?php endforeach; ?> 
    491                                                 <option value="0"><?php esc_html_e('Add New Menu'); ?></option> 
    492                                         </select> 
    493                                         <input type="hidden" name="action" value="edit" /> 
    494                                         <?php submit_button( __( 'Select' ), 'secondary', 'select_menu', false ); ?> 
     495                        <?php if ( ! isset( $_POST['menu-name'] ) && ! empty( $nav_menus ) && ! isset( $_GET['action'] ) || ( isset( $_GET['_wpnonce'] ) && 0 != count( $nav_menus ) ) ) : ?> 
     496 
     497                                <form id="menu-list-form" action="" method="post"> 
     498 
     499                                        <?php 
     500                                        if ( $wp_list_table->should_display_search() ) 
     501                                                $wp_list_table->search_box( __( 'Search Menus' ), 'menus' );  
     502                                        ?> 
     503 
     504                                        <?php $wp_list_table->display(); ?> 
     505 
     506                                        <input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('total_items') ); ?>" /> 
     507                                        <input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('per_page') ); ?>" /> 
     508                                        <input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('page') ); ?>" /> 
     509                                        <?php wp_nonce_field( 'nav_menus_bulk_actions' ); ?> 
     510 
    495511                                </form> 
    496                         </div> 
    497                         <div class="nav-tabs-wrapper"> 
    498                         <div class="nav-tabs"> 
    499                                 <?php 
    500                                 foreach( (array) $nav_menus as $_nav_menu ) : 
    501                                         if ( $nav_menu_selected_id == $_nav_menu->term_id ) : ?><span class="nav-tab nav-tab-active"> 
    502                                                         <?php echo esc_html( $_nav_menu->truncated_name ); ?> 
    503                                                 </span><?php else : ?><a href="<?php 
    504                                                         echo esc_url(add_query_arg( 
    505                                                                 array( 
    506                                                                         'action' => 'edit', 
    507                                                                         'menu' => $_nav_menu->term_id, 
    508                                                                 ), 
    509                                                                 admin_url( 'nav-menus.php' ) 
    510                                                         )); 
    511                                                 ?>" class="nav-tab hide-if-no-js"> 
    512                                                         <?php echo esc_html( $_nav_menu->truncated_name ); ?> 
    513                                                 </a><?php endif; 
    514                                 endforeach; 
    515                                 if ( 0 == $nav_menu_selected_id ) : ?><span class="nav-tab menu-add-new nav-tab-active"> 
    516                                         <?php printf( '<abbr title="%s">+</abbr>', esc_html__( 'Add menu' ) ); ?> 
    517                                 </span><?php else : ?><a href="<?php 
    518                                         echo esc_url(add_query_arg( 
    519                                                 array( 
    520                                                         'action' => 'edit', 
    521                                                         'menu' => 0, 
    522                                                 ), 
    523                                                 admin_url( 'nav-menus.php' ) 
    524                                         )); 
    525                                 ?>" class="nav-tab menu-add-new"> 
    526                                         <?php printf( '<abbr title="%s">+</abbr>', esc_html__( 'Add menu' ) ); ?> 
    527                                 </a><?php endif; ?> 
    528                         </div> 
    529                         </div> 
    530                         <div class="menu-edit"> 
     512 
     513 
     514                        <?php else : ?> 
     515                        <div class="menu-edit <?php if ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] || empty( $nav_menus ) ) echo 'blank-slate'; ?>"> 
    531516                                <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data"> 
    532517                                        <div id="nav-menu-header"> 
    533518                                                <div id="submitpost" class="submitbox"> 
     
    551536                                                                        <label class="howto"><input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" value="1" /> <?php printf( __('Automatically add new top-level pages' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label> 
    552537                                                                </div> 
    553538                                                                <?php endif; ?> 
    554                                                                 <br class="clear" /> 
    555539                                                                <div class="publishing-action"> 
    556540                                                                        <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?> 
    557541                                                                </div><!-- END .publishing-action --> 
    558542 
    559                                                                 <?php if ( ! empty( $nav_menu_selected_id ) ) : ?> 
    560                                                                 <div class="delete-action"> 
    561                                                                         <a class="submitdelete deletion menu-delete" href="<?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=delete&amp;menu=' . $nav_menu_selected_id), 'delete-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Delete Menu'); ?></a> 
    562                                                                 </div><!-- END .delete-action --> 
    563                                                                 <?php endif; ?> 
    564543                                                        </div><!-- END .major-publishing-actions --> 
    565544                                                </div><!-- END #submitpost .submitbox --> 
    566545                                                <?php 
     
    574553                                        <div id="post-body"> 
    575554                                                <div id="post-body-content"> 
    576555                                                        <?php 
    577                                                         if ( isset( $edit_markup ) ) { 
     556                                                        $drag_instructions = ''; 
     557                                                        if ( empty( $ordered_menu_items ) ) 
     558                                                                $drag_instructions = 'style="display: none;"'; 
     559                                                         
     560                                                        if ( isset( $edit_markup ) ) {                                                           
     561                                                                echo '<div class="drag-instructions post-body-plain" ' . $drag_instructions . '>'; 
     562                                                                echo '<p>' . __('Drag each item into the order you prefer. Click an item to reveal additional configuration options.') . '</p>'; 
     563                                                                echo '</div>'; 
     564                                                                 
    578565                                                                if ( ! is_wp_error( $edit_markup ) ) 
    579566                                                                        echo $edit_markup; 
    580                                                         } else if ( empty( $nav_menu_selected_id ) ) { 
     567                                                        } else if ( empty( $nav_menu_selected_id ) || ( isset( $_GET['_wpnonce'] ) && 0 == count( $nav_menus ) ) ) { 
    581568                                                                echo '<div class="post-body-plain">'; 
    582                                                                 echo '<p>' . __('To create a custom menu, give it a name above and click Create Menu. Then choose items like pages, categories or custom links from the left column to add to this menu.') . '</p>'; 
    583                                                                 echo '<p>' . __('After you have added your items, drag and drop to put them in the order you want. You can also click each item to reveal additional configuration options.') . '</p>'; 
    584                                                                 echo '<p>' . __('When you have finished building your custom menu, make sure you click the Save Menu button.') . '</p>'; 
     569                                                                echo '<p>' . __('Give your custom menu a name above, then click Create Menu.') . '</p>'; 
    585570                                                                echo '</div>'; 
    586571                                                        } 
    587572                                                        ?> 
     
    599584                                        </div><!-- /#nav-menu-footer --> 
    600585                                </form><!-- /#update-nav-menu --> 
    601586                        </div><!-- /.menu-edit --> 
     587                        <?php endif; ?> 
    602588                </div><!-- /#menu-management --> 
    603589        </div><!-- /#menu-management-liquid --> 
    604590        </div><!-- /#nav-menus-frame --> 
  • wp-admin/css/wp-admin.css

     
    24282428.fixed .column-categories, 
    24292429.fixed .column-tags, 
    24302430.fixed .column-rel, 
    2431 .fixed .column-role { 
     2431.fixed .column-role, 
     2432.fixed .column-count { 
    24322433        width: 15%; 
    24332434} 
    24342435 
     
    67506751 
    67516752/* nav-menu */ 
    67526753 
     6754.nav-menus-php #message { 
     6755        display: none; 
     6756} 
     6757 
     6758.nav-menus-php .nav-tab-wrapper { 
     6759        margin-bottom: 20px; 
     6760} 
     6761 
    67536762#nav-menus-frame { 
    67546763        margin-left: 300px; 
     6764        margin-top: 20px; 
    67556765} 
    67566766 
    67576767#wpbody-content #menu-settings-column { 
     
    67606770        margin-left: -300px; 
    67616771        clear: both; 
    67626772        float: left; 
    6763         padding-top: 24px; 
     6773        padding-top: 0; 
    67646774} 
    67656775 
    67666776.no-js #wpbody-content #menu-settings-column { 
     
    67856795        position: relative; 
    67866796} 
    67876797 
     6798.blank-slate br {  
     6799        display: none;  
     6800}  
     6801 
     6802.blank-slate .menu-name {  
     6803        height: 2em;  
     6804} 
     6805 
     6806.is-submenu { 
     6807        color: #999; 
     6808        font-style: italic; 
     6809        font-weight: normal; 
     6810        margin-left: 4px; 
     6811} 
     6812 
     6813.common-links { 
     6814        background: #fff; 
     6815        border: 1px solid #dfdfdf; 
     6816        line-height: 1.4em; 
     6817        min-height: 42px; 
     6818        padding: 0.9em; 
     6819} 
     6820 
     6821.common-links label { 
     6822        display: block; 
     6823        line-height: 19px; 
     6824} 
     6825 
    67886826/* Menu Container */ 
    67896827#menu-management-liquid { 
    67906828        float: left; 
    67916829        min-width: 100%; 
     6830        margin-top: 3px; 
    67926831} 
    67936832 
    67946833#menu-management { 
     
    68026841        margin-bottom: 20px; 
    68036842} 
    68046843 
     6844#menu-management p.search-box { 
     6845        margin: 5px 0; 
     6846} 
     6847 
    68056848.nav-menus-php #post-body { 
    68066849        padding: 10px; 
    68076850        border-width: 1px 0; 
     
    68356878        font-weight:bold; 
    68366879} 
    68376880 
    6838 /* Menu Tabs */ 
    6839  
    6840 #menu-management .nav-tabs-nav { 
    6841         margin: 0 20px; 
    6842 } 
    6843  
    6844 #menu-management .nav-tabs-arrow { 
    6845         width: 10px; 
    6846         padding: 0 5px 4px; 
    6847         cursor: pointer; 
    6848         position: absolute; 
    6849         top: 0; 
    6850         line-height: 22px; 
    6851         font-size: 18px; 
    6852         text-shadow: 0 1px 0 #fff; 
    6853 } 
    6854  
    6855 #menu-management .nav-tabs-arrow-left { 
    6856         left: 0; 
    6857 } 
    6858  
    6859 #menu-management .nav-tabs-arrow-right { 
    6860         right: 0; 
    6861         text-align: right; 
    6862 } 
    6863  
    6864 #menu-management .nav-tabs-wrapper { 
    6865         width: 100%; 
    6866         height: 28px; 
    6867         margin-bottom: -1px; 
    6868         overflow: hidden; 
    6869 } 
    6870  
    6871 #menu-management .nav-tabs { 
    6872         padding-left: 20px; 
    6873         padding-right: 10px; 
    6874 } 
    6875  
    6876 .js #menu-management .nav-tabs { 
    6877         float: left; 
    6878         margin-left: 0px; 
    6879         margin-right: -400px; 
    6880 } 
    6881  
    6882 #menu-management .nav-tab { 
    6883         margin-bottom: 0; 
    6884         font-size: 14px; 
    6885 } 
    6886  
    68876881#select-nav-menu-container { 
    68886882        text-align: right; 
    68896883        padding: 0 10px 3px 10px; 
     
    70807074} 
    70817075 
    70827076#menu-to-edit { 
    7083         padding: 1em 0; 
     7077        padding: 0.1em 0; 
    70847078} 
    70857079 
    70867080.menu ul { 
     
    73267320        margin: 5px 0 1px; 
    73277321} 
    73287322 
     7323.nav-menus-php .blank-slate .publishing-action {  
     7324        float: left;  
     7325        margin: 1px 0 0;  
     7326} 
     7327 
     7328.nav-menus-php .blank-slate .auto-add-pages, 
     7329.nav-menus-php .blank-slate #nav-menu-footer .publishing-action { 
     7330        display: none; 
     7331} 
     7332 
    73297333.nav-menus-php .major-publishing-actions .delete-action { 
    73307334        vertical-align: middle; 
    73317335        text-align: left;