Make WordPress Core

Ticket #23119: 23119.24.diff

File 23119.24.diff, 51.7 KB (added by jkudish, 11 years ago)

theme locations as checkboxes

  • 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">
     
    383387function wp_nav_menu_setup() {
    384388        // Register meta boxes
    385389        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' );
     390//              add_meta_box( 'nav-menu-theme-locations', __( 'Menus within your theme' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' );
     391                // todo: if we stick with the theme location checkboxes then remove the metabox code all togehter
    388392        wp_nav_menu_post_type_meta_boxes();
     393        add_meta_box( 'add-custom-links', __('Add Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );
    389394        wp_nav_menu_taxonomy_meta_boxes();
    390395
    391396        // Register advanced menu items (columns)
     
    411416        if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) )
    412417                return;
    413418
    414         $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-custom-links', 'add-page', 'add-category' );
     419        $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-page', 'add-custom-links', 'add-category' );
    415420        $hidden_meta_boxes = array();
    416421
    417422        foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) {
     
    445450                $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );
    446451                if ( $post_type ) {
    447452                        $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 );
     453                        add_meta_box( "add-{$id}", __('Add ') . $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
    449454                }
    450455        }
    451456}
     
    465470                $tax = apply_filters( 'nav_menu_meta_box_object', $tax );
    466471                if ( $tax ) {
    467472                        $id = $tax->name;
    468                         add_meta_box( "add-{$id}", $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
     473                        add_meta_box( "add-{$id}", __('Add ') . $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
    469474                }
    470475        }
    471476}
     
    489494        $menu_locations = get_nav_menu_locations();
    490495        $num_locations = count( array_keys($locations) );
    491496
    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>';
     497        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>';
    493498
    494499        foreach ( $locations as $location => $description ) {
    495500                ?>
     
    554559
    555560                        <p id="menu-item-name-wrap">
    556561                                <label class="howto" for="custom-menu-item-name">
    557                                         <span><?php _e('Label'); ?></span>
     562                                        <span><?php _e('Link Text'); ?></span>
    558563                                        <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'); ?>" />
    559564                                </label>
    560565                        </p>
     
    10841089        // If the menu exists, get its items.
    10851090        if ( is_nav_menu( $menu ) ) {
    10861091                $menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') );
    1087                 $result = '<div id="menu-instructions" class="post-body-plain';
    1088                 $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>';
    1090                 $result .= '</div>';
     1092                $result = '';
    10911093
    10921094                if( empty($menu_items) )
    10931095                        return $result . ' <ul class="menu" id="menu-to-edit"> </ul>';
     
    11581160        foreach( (array) $menu_items_to_delete as $menu_item_id )
    11591161                wp_delete_post( $menu_item_id, true );
    11601162}
     1163add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items');
    11611164
    1162 add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items');
     1165/**
     1166* Delete nav menus from the nav menu management screen
     1167*
     1168* @access private
     1169* @since 3.6
     1170*/
     1171function _wp_delete_nav_menu( $nav_menu_id ) {
     1172
     1173        if ( ! is_nav_menu( $nav_menu_id ) )
     1174                return;
     1175
     1176        $deleted_nav_menu = wp_get_nav_menu_object( $nav_menu_id );
     1177        $delete_nav_menu = wp_delete_nav_menu( $nav_menu_id );
     1178
     1179        if ( is_wp_error( $delete_nav_menu ) )
     1180                return $delete_nav_menu;
     1181
     1182        // Remove this menu from any locations.
     1183        $locations = get_theme_mod( 'nav_menu_locations' );
     1184        foreach ( (array) $locations as $location => $menu_id ) {
     1185                if ( $menu_id == $nav_menu_id )
     1186                        $locations[ $location ] = 0;
     1187        }
     1188        set_theme_mod( 'nav_menu_locations', $locations );
     1189        return true;
     1190}
     1191
     1192/**
     1193* Saves nav menu items
     1194*
     1195* @since 3.6
     1196*/
     1197function wp_nav_menu_update_menu_items ($nav_menu_selected_id, $nav_menu_selected_title) {
     1198        $unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish') );
     1199                               
     1200        $menu_items = array();
     1201        // Index menu items by db ID
     1202        foreach( $unsorted_menu_items as $_item )
     1203                $menu_items[$_item->db_id] = $_item;
     1204
     1205        $post_fields = array( 'menu-item-db-id', 'menu-item-object-id', 'menu-item-object', 'menu-item-parent-id', 'menu-item-position', 'menu-item-type', 'menu-item-title', 'menu-item-url', 'menu-item-description', 'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn' );
     1206        wp_defer_term_counting(true);
     1207        // Loop through all the menu items' POST variables
     1208        if ( ! empty( $_POST['menu-item-db-id'] ) ) {
     1209                foreach( (array) $_POST['menu-item-db-id'] as $_key => $k ) {
     1210
     1211                        // Menu item title can't be blank
     1212                        if ( empty( $_POST['menu-item-title'][$_key] ) )
     1213                                continue;
     1214
     1215                        $args = array();
     1216                        foreach ( $post_fields as $field )
     1217                                $args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';
     1218
     1219                        $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );
     1220
     1221                        if ( is_wp_error( $menu_item_db_id ) )
     1222                                $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
     1223                        elseif ( isset( $menu_items[$menu_item_db_id] ) )
     1224                                unset( $menu_items[$menu_item_db_id] );
     1225                }
     1226        }
     1227
     1228        // Remove menu items from the menu that weren't in $_POST
     1229        if ( ! empty( $menu_items ) ) {
     1230                foreach ( array_keys( $menu_items ) as $menu_item_id ) {
     1231                        if ( is_nav_menu_item( $menu_item_id ) ) {
     1232                                wp_delete_post( $menu_item_id );
     1233                        }
     1234                }
     1235        }
     1236
     1237        // Store 'auto-add' pages.
     1238        $auto_add = ! empty( $_POST['auto-add-pages'] );
     1239        $nav_menu_option = (array) get_option( 'nav_menu_options' );
     1240        if ( ! isset( $nav_menu_option['auto_add'] ) )
     1241                $nav_menu_option['auto_add'] = array();
     1242        if ( $auto_add ) {
     1243                if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )
     1244                        $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
     1245        } else {
     1246                if ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )
     1247                        unset( $nav_menu_option['auto_add'][$key] );
     1248        }
     1249        // Remove nonexistent/deleted menus
     1250        $nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );
     1251        update_option( 'nav_menu_options', $nav_menu_option );
     1252
     1253        wp_defer_term_counting(false);
     1254
     1255        do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
     1256
     1257        $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title ) . '</p></div>';
     1258        unset( $menu_items, $unsorted_menu_items );
     1259       
     1260        return $messages;
     1261}
     1262 No newline at end of file
  • wp-admin/js/nav-menu.js

     
    4545                        if( api.menuList.length ) // If no menu, we're in the + tab.
    4646                                this.initSortables();
    4747
     48                        if( oneThemeLocationNoMenus )
     49                                $('#posttype-page').addSelectedToMenu( api.addMenuItemToBottom );
     50
    4851                        this.initToggles();
    49 
    50                         this.initTabManager();
     52                       
     53                        this.messageFadeIn();
     54                       
     55                        this.initSelectMenuDropdown();
     56                        this.initAccessibility();
    5157                },
    5258
    5359                jQueryExtensions : function() {
     
    8490                                        });
    8591                                        return result;
    8692                                },
     93                                shiftHorizontally : function(dir) {
     94                                        return this.each(function(){
     95                                                var t = $(this),
     96                                                        depth = t.menuItemDepth(),
     97                                                        newDepth = depth + dir;
     98
     99                                                // Change .menu-item-depth-n class
     100                                                t.moveHorizontally(newDepth, depth);
     101                                        });
     102                                },
     103                                moveHorizontally : function(newDepth, depth) {
     104                                        return this.each(function(){
     105                                                var t = $(this),
     106                                                        children = t.childMenuItems(),
     107                                                        diff = newDepth - depth,
     108                                                        subItemText = t.find('.is-submenu');
     109
     110                                                // Change .menu-item-depth-n class
     111                                                t.updateDepthClass(newDepth, depth).updateParentMenuItemDBId();
     112
     113                                                // If it has children, move those too
     114                                                if (children) {
     115                                                        children.each(function( index ) {
     116                                                                var thisDepth = $(this).menuItemDepth(),
     117                                                                        newDepth = thisDepth + diff;
     118                                                                $(this).updateDepthClass(newDepth, thisDepth).updateParentMenuItemDBId();
     119                                                        });
     120                                                }
     121
     122                                                // Show "Sub item" helper text
     123                                                if (0 === newDepth)
     124                                                        subItemText.hide();
     125                                                else
     126                                                        subItemText.show();
     127                                        });
     128                                },
    87129                                updateParentMenuItemDBId : function() {
    88130                                        return this.each(function(){
    89131                                                var item = $(this),
    90132                                                        input = item.find('.menu-item-data-parent-id'),
    91                                                         depth = item.menuItemDepth(),
    92                                                         parent = item.prev();
     133                                                        depth = parseInt(item.menuItemDepth()),
     134                                                        parentDepth = depth - 1;
     135                                                        parent = item.prevAll('.menu-item-depth-' + parentDepth).first();
    93136
    94137                                                if( depth == 0 ) { // Item is on the top level, has no parent
    95138                                                        input.val(0);
    96139                                                } 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();
    99140                                                        input.val( parent.find('.menu-item-data-db-id').val() );
    100141                                                }
    101142                                        });
     
    120161
    121162                                        return this.each(function() {
    122163                                                var t = $(this), menuItems = {},
    123                                                         checkboxes = t.find('.tabs-panel-active .categorychecklist li input:checked'),
     164                                                        checkboxes = ( oneThemeLocationNoMenus ) ? t.find('#page-all li input[type="checkbox"]') : t.find('.tabs-panel-active .categorychecklist li input:checked'),
    124165                                                        re = new RegExp('menu-item\\[(\[^\\]\]*)');
    125166
    126167                                                processMethod = processMethod || api.addMenuItemToBottom;
     
    222263                                }
    223264                        });
    224265                },
     266               
     267                initSelectMenuDropdown : function () {
     268                        var menuSelector = $('.manage-menus select');
    225269
     270                        menuSelector.on('change', function () {
     271                                var url = $(this).val();
     272
     273                                if (url && '--' !== url) {
     274                                        $('.menu-selector .spinner').show();
     275                                        window.location = url;
     276                                }
     277                        });
     278                },
     279               
     280                initAccessibility : function() {
     281                        $('.item-edit').on('focus', function () {
     282                                $(this).on('keydown', function (e) {
     283
     284                                        // Bail if it's not an arrow key
     285                                        if (e.which !== 37 && e.which !== 38 && e.which !== 39 && e.which !== 40)
     286                                                return;
     287
     288                                        // Avoid multiple keydown events
     289                                        $(this).off('keydown');
     290
     291                                        var menuItems = $('#menu-to-edit li');
     292                                                menuItemsCount = menuItems.length,
     293                                                thisItem = $(this).parents('li.menu-item'),
     294                                                thisItemChildren = thisItem.childMenuItems(),
     295                                                thisItemData = thisItem.getItemData(),
     296                                                thisItemDepth = parseInt(thisItem.menuItemDepth()),
     297                                                thisItemPosition = parseInt(thisItem.index()),
     298                                                nextItem = thisItem.next(),
     299                                                nextItemChildren = nextItem.childMenuItems(),
     300                                                nextItemDepth = parseInt(nextItem.menuItemDepth()) + 1,
     301                                                prevItem = thisItem.prev(),
     302                                                prevItemDepth = parseInt(prevItem.menuItemDepth()),
     303                                                prevItemId = prevItem.getItemData()['menu-item-db-id'];
     304
     305                                        // Bail if there is only one menu item
     306                                        if (1 === menuItemsCount)
     307                                                return;
     308                                               
     309                                        // If RTL, swap left/right arrows
     310                                        var arrows = { '38' : 'up', '40' : 'down', '37' : 'left', '39' : 'right' };
     311                                        if ($('body').hasClass('rtl'))
     312                                                arrows = { '38' : 'up', '40' : 'down', '39' : 'left', '37' : 'right' };
     313
     314                                        switch (arrows[e.which]) {
     315                                        case 'up':
     316                                                var newItemPosition = thisItemPosition - 1;
     317
     318                                                // Already at top
     319                                                if (0 === thisItemPosition)
     320                                                        break;
     321
     322                                                // If a sub item is moved to top, shift it to 0 depth
     323                                                if (0 === newItemPosition && 0 !== thisItemDepth)
     324                                                        thisItem.moveHorizontally(0, thisItemDepth);
     325
     326                                                // If prev item is sub item, shift to match depth
     327                                                if (0 !== prevItemDepth)
     328                                                        thisItem.moveHorizontally(prevItemDepth, thisItemDepth);
     329
     330                                                // Does this item have sub items?
     331                                                if (thisItemChildren) {
     332                                                        var items = thisItem.add(thisItemChildren);
     333                                                        // Move the entire block
     334                                                        items.detach().insertBefore(menuItems.eq(newItemPosition));
     335                                                } else {
     336                                                        thisItem.detach().insertBefore(menuItems.eq(newItemPosition));
     337                                                }
     338                                                break;
     339                                        case 'down':
     340                                                // Does this item have sub items?
     341                                                if (thisItemChildren) {
     342                                                        var items = thisItem.add(thisItemChildren),
     343                                                                nextItem = menuItems.eq(items.length + thisItemPosition),
     344                                                                nextItemChildren = 0 !== nextItem.childMenuItems().length;
     345
     346                                                        if (nextItemChildren) {
     347                                                                var newDepth = parseInt(nextItem.menuItemDepth()) + 1;
     348                                                                thisItem.moveHorizontally(newDepth, thisItemDepth);
     349                                                        }
     350
     351                                                        // Have we reached the bottom?
     352                                                        if (menuItemsCount === thisItemPosition + items.length)
     353                                                                break;
     354
     355                                                        items.detach().insertAfter(menuItems.eq(thisItemPosition + items.length));
     356                                                } else {
     357                                                        // If next item has sub items, shift depth
     358                                                        if (0 !== nextItemChildren.length)
     359                                                                thisItem.moveHorizontally(nextItemDepth, thisItemDepth);
     360
     361                                                        // Have we reached the bottom
     362                                                        if (menuItemsCount === thisItemPosition + 1)
     363                                                                break;
     364                                                        thisItem.detach().insertAfter(menuItems.eq(thisItemPosition + 1));
     365                                                }
     366                                                break;
     367                                        case 'left':
     368                                                // As far left as possible
     369                                                if (0 === thisItemDepth)
     370                                                        break;
     371                                                thisItem.shiftHorizontally(-1);
     372                                                break;
     373                                        case 'right':
     374                                                // Can't be sub item at top
     375                                                if (0 === thisItemPosition)
     376                                                        break;
     377                                                // Already sub item of prevItem
     378                                                if (thisItemData['menu-item-parent-id'] === prevItemId)
     379                                                        break;
     380                                                thisItem.shiftHorizontally(1);
     381                                                break;
     382                                        }
     383                                        api.registerChange();
     384                                        // Put focus back on same menu item
     385                                        $('#edit-' + thisItemData['menu-item-db-id']).focus();
     386                                        return false;
     387                                });
     388                        }).blur(function () {
     389                                $(this).off('keydown');
     390                        });
     391                },
     392               
     393                messageFadeIn : function() {
     394                        var messages = $('#message');
     395                       
     396                        // Visual change when users save menus multiple times in a row
     397                        messages.slideDown('slow');
     398                },
     399
    226400                initToggles : function() {
    227401                        // init postboxes
    228402                        postboxes.add_postbox_toggles('nav-menus');
     
    245419                                menuEdge = api.menuList.offset().left,
    246420                                body = $('body'), maxChildDepth,
    247421                                menuMaxDepth = initialMenuMaxDepth();
     422                               
     423                        if( 0 != $('#menu-to-edit li').length )
     424                                $('.drag-instructions').show();
    248425
    249426                        // Use the right edge if RTL.
    250427                        menuEdge += api.isRTL ? api.menuList.width() : 0;
     
    307484
    308485                                        // Return child elements to the list
    309486                                        children = transport.children().insertAfter(ui.item);
     487                                       
     488                                        // Add "sub menu" description
     489                                        var subMenuTitle = ui.item.find('.item-title .is-submenu');
     490                                        if (0 < currentDepth)
     491                                                subMenuTitle.show();
     492                                        else
     493                                                subMenuTitle.hide();
    310494
    311495                                        // Update depth classes
    312496                                        if( depthChange != 0 ) {
     
    327511                                                ui.item[0].style.left = 'auto';
    328512                                                ui.item[0].style.right = 0;
    329513                                        }
    330 
    331                                         // The width of the tab bar might have changed. Just in case.
    332                                         api.refreshMenuTabs( true );
    333514                                },
    334515                                change: function(e, ui) {
    335516                                        // Make sure the placeholder is inside the menu.
     
    461642                                if( '' == $t.val() )
    462643                                        $t.addClass( name ).val( $t.data(name) );
    463644                        });
     645                       
     646                        $('.blank-slate .input-with-default-title').focus();
    464647                },
    465648
    466649                attachThemeLocationsListeners : function() {
     
    572755                        $.post( ajaxurl, params, function(menuMarkup) {
    573756                                var ins = $('#menu-instructions');
    574757                                processMethod(menuMarkup, params);
     758                                // Make it stand out a bit more visually, by adding a fadeIn
     759                                $('li.pending').hide().fadeIn('slow');
     760                                $('.drag-instructions').show();
    575761                                if( ! ins.hasClass('menu-instructions-inactive') && ins.siblings().length )
    576762                                        ins.addClass('menu-instructions-inactive');
    577763                                callback();
     
    604790                                };
    605791                        } else {
    606792                                // 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');
     793                                $('#menu-settings-column').find('input,select').end().find('a').attr('href', '#').unbind('click');
    608794                        }
    609795                },
    610796
     
    688874                        });
    689875                },
    690876
    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 
    824877                eventOnClickEditLink : function(clickedEl) {
    825878                        var settings, item,
    826879                        matchedSection = /#(.*)$/.exec(clickedEl.href);
     
    945998                                        var ins = $('#menu-instructions');
    946999                                        el.remove();
    9471000                                        children.shiftDepthClass(-1).updateParentMenuItemDBId();
    948                                         if( ! ins.siblings().length )
     1001                                        if( 0 == $('#menu-to-edit li').length ) {
     1002                                                $('.drag-instructions').hide();
    9491003                                                ins.removeClass('menu-instructions-inactive');
     1004                                        }
    9501005                                });
    9511006                },
    9521007
  • 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
    264264                // Update menu theme locations
    265                 if ( isset( $_POST['menu-locations'] ) )
     265                if ( isset( $_POST['menu-locations'] ) ) {
    266266                        set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) );
     267                } else {
     268                        // remove menu locations that have been unchecked
     269                        $locations = get_registered_nav_menus();
     270                        $menu_locations = get_nav_menu_locations();
     271                        foreach ( $locations as $location => $description ) {
     272                                if ( $menu_locations[ $location ] == $nav_menu_selected_id )
     273                                        unset( $menu_locations[ $location ] );
     274                        }
     275                        set_theme_mod( 'nav_menu_locations', array_map( 'absint', $menu_locations ) );
     276                }
    267277
     278
    268279                // Add Menu
    269280                if ( 0 == $nav_menu_selected_id ) {
    270281                        $new_menu_title = trim( esc_html( $_POST['menu-name'] ) );
     
    278289                                        $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );
    279290                                        $nav_menu_selected_id = $_nav_menu_selected_id;
    280291                                        $nav_menu_selected_title = $_menu_object->name;
    281                                         $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), $nav_menu_selected_title ) . '</p></div>';
     292                                        if ( isset( $_REQUEST['menu-item'] ) )
     293                                                wp_save_nav_menu_items( $nav_menu_selected_id, $_REQUEST['menu-item'] );
     294                                        if ( isset( $_REQUEST['zero-menu-state'] ) ) {
     295                                                // If there are menu items, add them
     296                                                wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title );
     297                                                // Auto-save nav_menu_locations
     298                                                $locations = get_theme_mod( 'nav_menu_locations' );
     299                                                foreach ( (array) $locations as $location => $menu_id ) {
     300                                                                $locations[ $location ] = $nav_menu_selected_id;
     301                                                                break; // There should only be 1
     302                                                }
     303                                                set_theme_mod( 'nav_menu_locations', $locations );
     304                                        }
     305                                        $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('<strong>%s</strong> has been created. Next, add menu items (i.e. pages, links, categories) from the column on the left.'), $nav_menu_selected_title ) . '</p></div>';
    282306                                }
    283307                        } else {
    284308                                $messages[] = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>';
     
    309333                        // Update menu items
    310334
    311335                        if ( ! is_wp_error( $_menu_object ) ) {
    312                                 $unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish') );
    313                                 $menu_items = array();
    314                                 // Index menu items by db ID
    315                                 foreach( $unsorted_menu_items as $_item )
    316                                         $menu_items[$_item->db_id] = $_item;
    317 
    318                                 $post_fields = array( 'menu-item-db-id', 'menu-item-object-id', 'menu-item-object', 'menu-item-parent-id', 'menu-item-position', 'menu-item-type', 'menu-item-title', 'menu-item-url', 'menu-item-description', 'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn' );
    319                                 wp_defer_term_counting(true);
    320                                 // Loop through all the menu items' POST variables
    321                                 if ( ! empty( $_POST['menu-item-db-id'] ) ) {
    322                                         foreach( (array) $_POST['menu-item-db-id'] as $_key => $k ) {
    323 
    324                                                 // Menu item title can't be blank
    325                                                 if ( empty( $_POST['menu-item-title'][$_key] ) )
    326                                                         continue;
    327 
    328                                                 $args = array();
    329                                                 foreach ( $post_fields as $field )
    330                                                         $args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';
    331 
    332                                                 $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );
    333 
    334                                                 if ( is_wp_error( $menu_item_db_id ) )
    335                                                         $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
    336                                                 elseif ( isset( $menu_items[$menu_item_db_id] ) )
    337                                                         unset( $menu_items[$menu_item_db_id] );
    338                                         }
    339                                 }
    340 
    341                                 // Remove menu items from the menu that weren't in $_POST
    342                                 if ( ! empty( $menu_items ) ) {
    343                                         foreach ( array_keys( $menu_items ) as $menu_item_id ) {
    344                                                 if ( is_nav_menu_item( $menu_item_id ) ) {
    345                                                         wp_delete_post( $menu_item_id );
    346                                                 }
    347                                         }
    348                                 }
    349 
    350                                 // Store 'auto-add' pages.
    351                                 $auto_add = ! empty( $_POST['auto-add-pages'] );
    352                                 $nav_menu_option = (array) get_option( 'nav_menu_options' );
    353                                 if ( ! isset( $nav_menu_option['auto_add'] ) )
    354                                         $nav_menu_option['auto_add'] = array();
    355                                 if ( $auto_add ) {
    356                                         if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )
    357                                                 $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
    358                                 } else {
    359                                         if ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )
    360                                                 unset( $nav_menu_option['auto_add'][$key] );
    361                                 }
    362                                 // Remove nonexistent/deleted menus
    363                                 $nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );
    364                                 update_option( 'nav_menu_options', $nav_menu_option );
    365 
    366                                 wp_defer_term_counting(false);
    367 
    368                                 do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
    369 
    370                                 $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been updated.'), $nav_menu_selected_title ) . '</p></div>';
    371                                 unset( $menu_items, $unsorted_menu_items );
     336                                $messages = array_merge( $messages, wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title ) );
    372337                        }
    373338                }
    374339                break;
     
    376341
    377342// Get all nav menus
    378343$nav_menus = wp_get_nav_menus( array('orderby' => 'name') );
     344$menu_count = count( $nav_menus );
    379345
     346// Are we on the add new screen?
     347$add_new_screen = ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] ) ? true : false;
     348
     349// If we have one theme location, and zero menus, we take them right into editing their first menu
     350$one_theme_location_no_menus = ( 1 == count( get_registered_nav_menus() ) && ! $add_new_screen && empty($nav_menus) && 0 < count(get_pages()) ) ? true : false;
     351
     352// Redirect to add screen if there are no menus and this users has either zero, or more than 1 theme locations
     353if ( 0 == $menu_count && ! $add_new_screen && ! $one_theme_location_no_menus )
     354        wp_redirect( admin_url( 'nav-menus.php?action=edit&menu=0' ) );
     355
    380356// Get recently edited nav menu
    381357$recently_edited = (int) get_user_option( 'nav_menu_recently_edited' );
    382 
    383 // If there was no recently edited menu, and $nav_menu_selected_id is a nav menu, update recently edited menu.
    384 if ( !$recently_edited && is_nav_menu( $nav_menu_selected_id ) ) {
     358if ( !$recently_edited && is_nav_menu( $nav_menu_selected_id ) )
    385359        $recently_edited = $nav_menu_selected_id;
    386360
    387 // Else if $nav_menu_selected_id is not a menu and not requesting that we create a new menu, but $recently_edited is a menu, grab that one.
    388 } elseif ( 0 == $nav_menu_selected_id && ! isset( $_REQUEST['menu'] ) && is_nav_menu( $recently_edited ) ) {
     361// Use $recently_edited if none are selected
     362if ( 0 == $nav_menu_selected_id && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) )
    389363        $nav_menu_selected_id = $recently_edited;
    390364
    391 // Else try to grab the first menu from the menus list
    392 } elseif ( 0 == $nav_menu_selected_id && ! isset( $_REQUEST['menu'] ) && ! empty($nav_menus) ) {
     365// On deletion of menu, if another menu exists, show it
     366if ( ! $add_new_screen && 0 < $menu_count && isset( $_GET['action'] ) && 'delete' == $_GET['action'] )
    393367        $nav_menu_selected_id = $nav_menus[0]->term_id;
    394 }
     368       
     369if ( $one_theme_location_no_menus )
     370        $nav_menu_selected_id = 0;
    395371
    396372// Update the user's setting
    397373if ( $nav_menu_selected_id != $recently_edited && is_nav_menu( $nav_menu_selected_id ) )
     
    418394$_wp_nav_menu_max_depth = 0;
    419395
    420396// Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth
    421 if ( is_nav_menu( $nav_menu_selected_id ) )
     397if ( is_nav_menu( $nav_menu_selected_id ) ) {
     398        $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('post_status' => 'any') );
    422399        $edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id );
     400}
    423401
    424402function wp_nav_menu_max_depth($classes) {
    425403        global $_wp_nav_menu_max_depth;
     
    460438?>
    461439<div class="wrap">
    462440        <?php screen_icon(); ?>
    463         <h2><?php esc_html_e('Menus'); ?></h2>
     441        <h2>Menus <a href="<?php echo esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, ), admin_url( 'nav-menus.php' ) ) ); ?>" class="add-new-h2">Add New</a></h2>
    464442        <?php
    465443        foreach( $messages as $message ) :
    466444                echo $message . "\n";
    467445        endforeach;
    468446        ?>
     447        <?php if ( 1 < $menu_count ) : ?>
     448        <div class="manage-menus">
     449                <span><?php _e('Selected menu'); ?></span>
     450                <select>
     451                        <?php
     452                        foreach( (array) $nav_menus as $_nav_menu ) : ?>
     453                        <option value="<?php echo esc_url(add_query_arg( array( 'action' => 'edit', 'menu' => $_nav_menu->term_id, ), admin_url( 'nav-menus.php' ) )); ?>" <?php if ( $nav_menu_selected_id == $_nav_menu->term_id ) echo 'selected="selected"'; ?>>
     454                                <?php echo esc_html( $_nav_menu->truncated_name ); ?>
     455                        </option>
     456                <?php endforeach; ?>
     457                </select>
     458                <span class="spinner"></span>
     459        </div>
     460        <?php endif; ?>
    469461        <div id="nav-menus-frame">
    470         <div id="menu-settings-column" class="metabox-holder<?php if ( !$nav_menu_selected_id ) { echo ' metabox-holder-disabled'; } ?>">
     462        <div id="menu-settings-column" class="metabox-holder<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] ) { echo ' metabox-holder-disabled'; } ?>">
    471463
     464                <div class="clear"></div>
     465
    472466                <form id="nav-menu-meta" action="<?php echo admin_url( 'nav-menus.php' ); ?>" class="nav-menu-meta" method="post" enctype="multipart/form-data">
    473467                        <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
    474468                        <input type="hidden" name="action" value="add-menu-item" />
     
    479473        </div><!-- /#menu-settings-column -->
    480474        <div id="menu-management-liquid">
    481475                <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                                 </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">
    531                                 <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
     476                        <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
     477                                <div class="menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>">
     478                                        <?php
     479                                        wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
     480                                        wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
     481                                        wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );
     482                                        ?>
     483                                        <?php if ( $one_theme_location_no_menus ) { ?>
     484                                        <input type="hidden" name="zero-menu-state" value="true" />
     485                                        <?php } ?>
     486                                        <input type="hidden" name="action" value="update" />
     487                                        <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
    532488                                        <div id="nav-menu-header">
    533                                                 <div id="submitpost" class="submitbox">
    534                                                         <div class="major-publishing-actions">
    535                                                                 <label class="menu-name-label howto open-label" for="menu-name">
    536                                                                         <span><?php _e('Menu Name'); ?></span>
    537                                                                         <input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Enter menu name here'); ?>" value="<?php echo esc_attr( $nav_menu_selected_title ); ?>" />
    538                                                                 </label>
    539                                                                 <?php if ( !empty( $nav_menu_selected_id ) ) :
    540                                                                         if ( ! isset( $auto_add ) ) {
    541                                                                                 $auto_add = get_option( 'nav_menu_options' );
    542                                                                                 if ( ! isset( $auto_add['auto_add'] ) )
    543                                                                                         $auto_add = false;
    544                                                                                 elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'] ) )
    545                                                                                         $auto_add = true;
    546                                                                                 else
    547                                                                                         $auto_add = false;
    548                                                                         }
    549                                                                 ?>
    550                                                                 <div class="auto-add-pages">
    551                                                                         <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>
    552                                                                 </div>
     489                                                <div class="major-publishing-actions">
     490                                                        <h2><?php if ( $one_theme_location_no_menus ) { _e('Menu 1'); } else { echo esc_attr( $nav_menu_selected_title ); } ?></h2>
     491                                                        <div class="publishing-action">
     492                                                                <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
     493                                                        </div><!-- END .publishing-action -->
     494                                                </div><!-- END .major-publishing-actions -->
     495                                        </div><!-- END .nav-menu-header -->
     496                                        <div id="post-body">
     497                                                <div id="post-body-content">
     498                                                        <div class="menu-settings" <?php if ( $one_theme_location_no_menus ) { ?>style="display: none;"<?php } ?>>
     499                                                                <h3 class="settings-header"><?php _e('Settings'); ?></strong></h3>
     500                                                                <?php if ( $add_new_screen ) : ?>
     501                                                                        <h3><?php _e('Add a new menu'); ?></strong></h3>
     502                                                                        <p class="post-body-plain"><?php _e('Give your menu a name, then click Create Menu.'); ?></p>
    553503                                                                <?php endif; ?>
    554                                                                 <br class="clear" />
    555                                                                 <div class="publishing-action">
    556                                                                         <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
    557                                                                 </div><!-- END .publishing-action -->
     504                                                                <dl>
     505                                                                        <dt class="howto"><label class="menu-name-label" for="menu-name"><?php _e('Menu Name'); ?></label></dt>
     506                                                                        <dd>
     507                                                                                <?php if ( $one_theme_location_no_menus ) { ?>
     508                                                                                <input name="menu-name" id="menu-name" type="hidden" class="menu-name regular-text menu-item-textbox input-with-default-title" value="<?php _e('Menu 1'); ?>" />
     509                                                                                <?php } else { ?>
     510                                                                                <input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Enter menu name here'); ?>" value="<?php echo esc_attr( $nav_menu_selected_title ); ?>" />
     511                                                                                <?php } ?>
     512                                                                        </dd>
     513                                                                </dl>
     514                                                                <?php
     515                                                                if ( ! isset( $auto_add ) ) {
     516                                                                        $auto_add = get_option( 'nav_menu_options' );
     517                                                                        if ( ! isset( $auto_add['auto_add'] ) )
     518                                                                                $auto_add = false;
     519                                                                        elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'] ) )
     520                                                                                $auto_add = true;
     521                                                                        else
     522                                                                                $auto_add = false;
     523                                                                } ?>
    558524
    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 -->
     525                                                                <dl class="auto-add-pages">
     526                                                                        <dt class="howto"><?php _e('Auto add pages'); ?></dt>
     527                                                                        <dd class="checkbox-input"><input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" id="auto-add-pages" value="1" /> <label for="auto-add-pages"><?php printf( __('Automatically add new top-level pages' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label></dd>
     528                                                                </dl>
     529
     530                                                                <?php if ( current_theme_supports( 'menus' ) ) :
     531                                                                        $locations = get_registered_nav_menus();
     532                                                                        $menu_locations = get_nav_menu_locations();
     533                                                                ?>
     534
     535                                                                        <dl class="menu-theme-locations">
     536                                                                                <dt class="howto"><?php _e( 'Theme locations to use this menu in' ); ?></dt>
     537                                                                                <dd class="checkbox-input">
     538
     539                                                                                        <?php foreach ( $locations as $location => $description ) : ?>
     540                                                                                                <input type="checkbox"<?php checked( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $nav_menu_selected_id ); ?> name="menu-locations[<?php echo esc_attr( $location ); ?>]" id="locations-<?php echo esc_attr( $location ); ?>" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> <label for="locations-<?php echo esc_attr( $location ); ?>"><?php echo $description; ?></label>
     541                                                                                                <?php if ( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] != $nav_menu_selected_id ) : ?>
     542                                                                                                        <p></p><small><?php printf( __( "Note: the '%s' menu is currently assigned to this location." ), wp_get_nav_menu_object( $menu_locations[ $location ] )->name ); ?> </small></p>
     543                                                                                                <?php endif; ?>
     544
     545                                                                                        <?php endforeach; ?>
     546
     547                                                                                </dd>
     548                                                                        </dl>
     549
    563550                                                                <?php endif; ?>
    564                                                         </div><!-- END .major-publishing-actions -->
    565                                                 </div><!-- END #submitpost .submitbox -->
    566                                                 <?php
    567                                                 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
    568                                                 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
    569                                                 wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );
    570                                                 ?>
    571                                                 <input type="hidden" name="action" value="update" />
    572                                                 <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
    573                                         </div><!-- END #nav-menu-header -->
    574                                         <div id="post-body">
    575                                                 <div id="post-body-content">
     551
     552                                                        </div>
     553                                                        <?php if ( ! $add_new_screen ) : ?>
     554                                                        <h3><?php _e('Menu Structure'); ?></strong></h3>
     555                                                        <?php $starter_copy = ( $one_theme_location_no_menus ) ? __("Edit your default menu by adding or removing items. Drag each item into the order you prefer. Click Create Menu to save your changes.") : __('Drag each item into the order you prefer. Click an item to reveal additional configuration options.') ; ?>
     556                                                        <div class="drag-instructions post-body-plain" <?php if ( isset( $menu_items ) && 0 == count( $menu_items ) ) { ?>style="display: none;"<?php } ?>>
     557                                                                <p><?php echo $starter_copy; ?></p>
     558                                                        </div>
    576559                                                        <?php
    577                                                         if ( isset( $edit_markup ) ) {
    578                                                                 if ( ! is_wp_error( $edit_markup ) )
    579                                                                         echo $edit_markup;
    580                                                         } else if ( empty( $nav_menu_selected_id ) ) {
    581                                                                 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>';
    585                                                                 echo '</div>';
    586                                                         }
     560                                                        if ( isset( $edit_markup ) && ! is_wp_error( $edit_markup ) ) {
     561                                                                echo $edit_markup;
     562                                                        } else {
    587563                                                        ?>
     564                                                        <ul class="menu" id="menu-to-edit"></ul>
     565                                                        <?php } ?>
     566                                                        <?php endif; ?>
    588567                                                </div><!-- /#post-body-content -->
    589568                                        </div><!-- /#post-body -->
    590569                                        <div id="nav-menu-footer">
    591570                                                <div class="major-publishing-actions">
    592                                                 <div class="publishing-action">
    593                                                         <?php
    594                                                         if ( ! empty( $nav_menu_selected_id ) )
    595                                                                 submit_button( __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_footer' ) );
    596                                                         ?>
    597                                                 </div>
    598                                                 </div>
     571                                                        <?php if ( 0 != $menu_count && ! $add_new_screen ) : ?>
     572                                                        <span class="delete-action">
     573                                                                <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>
     574                                                        </span><!-- END .delete-action -->
     575                                                        <?php endif; ?>
     576                                                        <div class="publishing-action">
     577                                                                <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
     578                                                        </div><!-- END .publishing-action -->
     579                                                </div><!-- END .major-publishing-actions -->
    599580                                        </div><!-- /#nav-menu-footer -->
    600                                 </form><!-- /#update-nav-menu -->
    601                         </div><!-- /.menu-edit -->
     581                                </div><!-- /.menu-edit -->
     582                        </form><!-- /#update-nav-menu -->
    602583                </div><!-- /#menu-management -->
    603584        </div><!-- /#menu-management-liquid -->
    604585        </div><!-- /#nav-menus-frame -->
    605586</div><!-- /.wrap-->
    606 
     587<script type="text/javascript">var oneThemeLocationNoMenus = <?php if ( $one_theme_location_no_menus ) { echo 'true'; } else { echo 'false'; } ?>;</script>
    607588<?php include( './admin-footer.php' ); ?>
  • wp-admin/css/wp-admin.css

     
    24332433.fixed .column-categories,
    24342434.fixed .column-tags,
    24352435.fixed .column-rel,
    2436 .fixed .column-role {
     2436.fixed .column-role,
     2437.fixed .column-count {
    24372438        width: 15%;
    24382439}
    24392440
     
    67606761
    67616762/* nav-menu */
    67626763
     6764.nav-menus-php #message {
     6765        display: none;
     6766}
     6767
     6768.nav-menus-php .nav-tab-wrapper {
     6769        margin-bottom: 20px;
     6770}
     6771
    67636772#nav-menus-frame {
    67646773        margin-left: 300px;
     6774        margin-top: 20px;
    67656775}
    67666776
    67676777#wpbody-content #menu-settings-column {
     
    67706780        margin-left: -300px;
    67716781        clear: both;
    67726782        float: left;
    6773         padding-top: 24px;
     6783        padding-top: 0;
    67746784}
    67756785
    67766786.no-js #wpbody-content #menu-settings-column {
     
    67956805        position: relative;
    67966806}
    67976807
     6808.blank-slate br {
     6809        display: none;
     6810}
     6811
     6812.blank-slate .menu-name {
     6813        height: 2em;
     6814}
     6815
     6816.is-submenu {
     6817        color: #999;
     6818        font-style: italic;
     6819        font-weight: normal;
     6820        margin-left: 4px;
     6821}
     6822
     6823.manage-menus {
     6824        border: 1px solid #eee;
     6825        background: #fbfbfb;
     6826        margin-top: 13px;
     6827        padding: 10px;
     6828        overflow: hidden;
     6829        -webkit-border-radius: 3px;
     6830        border-radius: 3px;
     6831}
     6832
     6833.manage-menus select {
     6834        float: left;
     6835        min-width: 180px;
     6836}
     6837
     6838.manage-menus .spinner {
     6839        float: left;
     6840}
     6841
     6842.manage-menus span {
     6843        float: left;
     6844        margin: 4px 6px 0 0;
     6845}
     6846
     6847.menu-edit p {
     6848        margin: .3em 0 .6em;
     6849}
     6850
     6851.menu-settings {
     6852        overflow: hidden;
     6853}
     6854
     6855.menu-settings dl {
     6856        margin: 0;
     6857        overflow: hidden;
     6858}
     6859
     6860.menu-settings dd {
     6861        float: left;
     6862        margin: 0;
     6863        width: 60%;
     6864}
     6865
     6866.menu-settings dt {
     6867        clear: both;
     6868        display: inline;
     6869        float: left;
     6870        padding: 3px 0 13px;
     6871        width: 170px;
     6872}
     6873
     6874.menu-edit .checkbox-input {
     6875        margin-top: 4px;
     6876}
     6877
    67986878/* Menu Container */
    67996879#menu-management-liquid {
    68006880        float: left;
    68016881        min-width: 100%;
     6882        margin-top: 3px;
    68026883}
    68036884
    68046885#menu-management {
     
    68126893        margin-bottom: 20px;
    68136894}
    68146895
     6896#menu-management p.search-box {
     6897        margin: 5px 0;
     6898}
     6899
    68156900.nav-menus-php #post-body {
    6816         padding: 10px;
     6901        padding: 0 10px;
    68176902        border-width: 1px 0;
    68186903        border-style: solid;
    68196904}
     
    68276912        border-bottom: 1px solid;
    68286913}
    68296914
     6915#nav-menu-header h2 {
     6916        float: left;
     6917        line-height: 18px;
     6918        margin: 0;
     6919        padding: 6px 0 0 0;
     6920        font-size: 18px;
     6921}
     6922
    68306923#nav-menu-footer {
    68316924        border-top: 1px solid;
    68326925}
     
    68456938        font-weight:bold;
    68466939}
    68476940
    6848 /* Menu Tabs */
    6849 
    6850 #menu-management .nav-tabs-nav {
    6851         margin: 0 20px;
    6852 }
    6853 
    6854 #menu-management .nav-tabs-arrow {
    6855         width: 10px;
    6856         padding: 0 5px 4px;
    6857         cursor: pointer;
    6858         position: absolute;
    6859         top: 0;
    6860         line-height: 22px;
    6861         font-size: 18px;
    6862         text-shadow: 0 1px 0 #fff;
    6863 }
    6864 
    6865 #menu-management .nav-tabs-arrow-left {
    6866         left: 0;
    6867 }
    6868 
    6869 #menu-management .nav-tabs-arrow-right {
    6870         right: 0;
    6871         text-align: right;
    6872 }
    6873 
    6874 #menu-management .nav-tabs-wrapper {
    6875         width: 100%;
    6876         height: 28px;
    6877         margin-bottom: -1px;
    6878         overflow: hidden;
    6879 }
    6880 
    6881 #menu-management .nav-tabs {
    6882         padding-left: 20px;
    6883         padding-right: 10px;
    6884 }
    6885 
    6886 .js #menu-management .nav-tabs {
    6887         float: left;
    6888         margin-left: 0px;
    6889         margin-right: -400px;
    6890 }
    6891 
    6892 #menu-management .nav-tab {
    6893         margin-bottom: 0;
    6894         font-size: 14px;
    6895 }
    6896 
    68976941#select-nav-menu-container {
    68986942        text-align: right;
    68996943        padding: 0 10px 3px 10px;
     
    70907134}
    70917135
    70927136#menu-to-edit {
    7093         padding: 1em 0;
     7137        margin: 0;
     7138        padding: 0.1em 0;
    70947139}
    70957140
    70967141.menu ul {
     
    71067151        clear:both;
    71077152        line-height:1.5em;
    71087153        position:relative;
    7109         margin: 13px 0 0 0;
     7154        margin-top: 9px;
    71107155}
    71117156
    71127157.menu-item-handle {
     
    73337378        text-align: right;
    73347379        float: right;
    73357380        line-height: 23px;
    7336         margin: 5px 0 1px;
     7381        margin: 2px 0 1px;
    73377382}
    73387383
    7339 .nav-menus-php .major-publishing-actions .delete-action {
    7340         vertical-align: middle;
    7341         text-align: left;
    7342         float: left;
    7343         padding-right: 15px;
    7344         margin-top: 5px;
     7384.nav-menus-php .blank-slate .auto-add-pages,
     7385.nav-menus-php .blank-slate .settings-header,
     7386.nav-menus-php .blank-slate dt,
     7387.nav-menus-php .blank-slate .auto-add-pages,
     7388.nav-menus-php .blank-slate .menu-theme-locations {
     7389        display: none;
    73457390}
    73467391
    7347 .menu-name-label span,
    7348 .auto-add-pages label {
    7349         font-size: 12px;
    7350         font-style: normal;
     7392.nav-menus-php .delete-action {
     7393        float: left;
     7394        margin-top: 2px;
    73517395}
    73527396
    7353 .menu-name-label {
    7354         margin-right: 15px;
     7397.nav-menus-php .delete-action a {
     7398        color: #999;
    73557399}
    73567400
    7357 .auto-add-pages input {
    7358         margin-top: 0;
    7359 }
    7360 
    7361 .auto-add-pages {
    7362         margin-top: 4px;
    7363         float: left;
    7364 }
    7365 
    73667401.nav-menus-php .submitbox .submitcancel {
    73677402        border-bottom: 1px solid;
    73687403        padding: 1px 2px;