Ticket #23119: 23119.16.diff
File 23119.16.diff, 36.8 KB (added by , 11 years ago) |
---|
-
wp-admin/includes/list-table.php
23 23 'WP_Posts_List_Table' => 'posts', 24 24 'WP_Media_List_Table' => 'media', 25 25 'WP_Terms_List_Table' => 'terms', 26 'WP_Menus_List_Table' => 'menus', 26 27 'WP_Users_List_Table' => 'users', 27 28 'WP_Comments_List_Table' => 'comments', 28 29 'WP_Post_Comments_List_Table' => 'comments', -
wp-admin/includes/misc.php
346 346 case 'upload_per_page': 347 347 case 'edit_tags_per_page': 348 348 case 'plugins_per_page': 349 case 'nav_menus_per_page': 349 350 // Network admin 350 351 case 'sites_network_per_page': 351 352 case 'users_network_per_page': -
wp-admin/includes/class-wp-menus-list-table.php
1 <?php 2 3 /** 4 * Nav Menus List Table class. 5 * 6 * @package WordPress 7 * @subpackage List_Table 8 * @since 3.6 9 * @access private 10 */ 11 class WP_Menus_List_Table extends WP_List_Table { 12 13 function __construct( $args = array() ) { 14 15 parent::__construct( array( 16 'plural' => 'menus', 17 'singular' => 'menu', 18 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, 19 ) ); 20 21 } 22 23 function ajax_user_can() { 24 return current_user_can( 'edit_theme_options' ); 25 } 26 27 function prepare_items() { 28 29 $args = array(); 30 31 // order & orderby 32 $valid_arg_options = array( 33 'orderby' => $this->get_sortable_columns(), 34 'order' => array( 'asc', 'desc' ), 35 ); 36 foreach ( $valid_arg_options as $arg_key => $valid_options ) { 37 if ( ! empty( $_REQUEST[$arg_key] ) && in_array( $_REQUEST[$arg_key], $valid_options ) ) 38 $args[$arg_key] = $_REQUEST[$arg_key]; 39 } 40 41 // search 42 if ( ! empty( $_REQUEST['s'] ) ) 43 $args['search'] = strip_tags( trim( $_REQUEST['s'] ) ); 44 45 // pagination 46 $per_page = apply_filters( 'nav_menus_per_page', $this->get_items_per_page( 'nav_menus_per_page' ) ); 47 $page = $this->get_pagenum(); 48 49 $defaults = array( 50 'orderby' => 'name', 51 'order' => 'asc', 52 'offset' => ( $page - 1 ) * $per_page, 53 'number' => $per_page, 54 ); 55 $args = wp_parse_args( $args, $defaults ); 56 $args = apply_filters( 'nav_menus_table_list_prepare_items_args', $args ); 57 58 $_args_to_calc_total_items = $args; 59 unset( $_args_to_calc_total_items['offset'] ); 60 $_args_to_calc_total_items['fields'] = 'count'; 61 $this->total_items = absint( wp_get_nav_menus( $_args_to_calc_total_items ) ); 62 63 $this->items = wp_get_nav_menus( $args ); 64 65 $this->set_pagination_args( array( 66 'total_items' => $this->total_items, 67 'per_page' => $per_page, 68 ) ); 69 70 } 71 72 function get_bulk_actions() { 73 $actions = array(); 74 $actions['delete_menus'] = __( 'Delete' ); 75 76 return apply_filters( 'nav_menus_bulk_actions', $actions ); 77 } 78 79 function get_columns() { 80 $columns = array( 81 'cb' => '<input type="checkbox" />', 82 'name' => __( 'Menu Name' ), 83 'count' => __( '# of links' ), 84 ); 85 86 return $columns; 87 } 88 89 function get_sortable_columns() { 90 $sortable_columns = array( 91 'name' => 'name', 92 'count' => 'count', 93 ); 94 95 return $sortable_columns; 96 } 97 98 99 function single_row( $nav_menu, $level = 0 ) { 100 static $row_class = ''; 101 $row_class = ( $row_class == '' ? ' class="alternate"' : '' ); 102 103 echo '<tr id="' . esc_attr( 'menu-' . $nav_menu->term_id ) . '"' . $row_class . '>'; 104 echo $this->single_row_columns( $nav_menu ); 105 echo '</tr>'; 106 } 107 108 function column_default( $nav_menu, $column_name ) { 109 return apply_filters( 'manage_nav_menu_custom_column', '', $column_name, $nav_menu->term_id ); 110 } 111 112 113 function column_cb( $nav_menu ) { 114 return '<label class="screen-reader-text" for="' . esc_attr( 'cb-select-' . $nav_menu->term_id . '">' . sprintf( __( 'Select %s' ), $nav_menu->name ) ) . '"></label>' . '<input type="checkbox" name="delete_menus[]" value="' . esc_attr( $nav_menu->term_id ) . '" id="' . esc_attr( 'cb-select-' . $nav_menu->term_id ) . '" />'; 115 116 return ' '; 117 } 118 119 function column_name( $nav_menu ) { 120 121 $edit_link = esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => absint( $nav_menu->term_id ) ), admin_url( 'nav-menus.php' ) ) ); 122 $delete_link = wp_nonce_url( add_query_arg( array( 'action' => 'delete', 'menu' => absint( $nav_menu->term_id ) ), admin_url( 'nav-menus.php' ) ), 'delete-nav_menu-' . $nav_menu->term_id ); 123 124 $out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit “%s”' ), $nav_menu->name ) ) . '">' . $nav_menu->name . '</a></strong><br />'; 125 126 $actions = array(); 127 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 128 $actions['delete'] = "<a class='delete-menu' href='" . $delete_link . "'>" . __( 'Delete' ) . "</a>"; 129 130 131 $actions = apply_filters( 'nav_menu_row_actions', $actions, $nav_menu ); 132 133 $out .= $this->row_actions( $actions ); 134 135 return $out; 136 } 137 138 function column_count( $nav_menu ) { 139 return $nav_menu->count; 140 } 141 142 function should_display_search() { 143 return apply_filters( 'nav_menu_table_list_should_display_search', ( $this->total_items > 20 ) ); 144 } 145 146 } 147 No newline at end of file -
wp-admin/includes/nav-menu.php
81 81 82 82 $title = empty( $item->label ) ? $title : $item->label; 83 83 84 $submenu_text = ''; 85 if (0 == $depth) 86 $submenu_text = 'style="display: none;"'; 87 84 88 ?> 85 89 <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>"> 86 90 <dl class="menu-item-bar"> 87 91 <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> 89 93 <span class="item-controls"> 90 94 <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span> 91 95 <span class="item-order hide-if-js"> … … 382 386 **/ 383 387 function wp_nav_menu_setup() { 384 388 // Register meta boxes 385 if ( wp_get_nav_menus() ) 386 add_meta_box( 'nav-menu-theme-locations', __( 'Theme Locations' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' ); 387 add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); 388 wp_nav_menu_post_type_meta_boxes(); 389 wp_nav_menu_taxonomy_meta_boxes(); 389 if ( wp_get_nav_menus() && ! isset( $_POST['menu-name'] ) && ! isset( $_GET['action'] ) || isset( $_GET['_wpnonce'] ) ) 390 add_meta_box( 'nav-menu-theme-locations', __( 'Menus within your theme' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' ); 390 391 392 $nav_menus = wp_get_nav_menus( array('orderby' => 'name') ); 393 394 if ( empty( $nav_menus ) || isset( $_POST['menu-name'] ) || isset( $_GET['action'] ) && ! isset( $_GET['_wpnonce'] ) ) { 395 wp_nav_menu_post_type_meta_boxes(); 396 add_meta_box( 'add-common-links', __('Common Links'), 'wp_nav_menu_item_common_link_meta_box', 'nav-menus', 'side', 'core' ); 397 add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); 398 wp_nav_menu_taxonomy_meta_boxes(); 399 } 400 391 401 // Register advanced menu items (columns) 392 add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns'); 402 if ( empty( $nav_menus ) || isset( $_POST['menu-name'] ) || isset( $_GET['action'] ) && ! isset( $_GET['_wpnonce'] ) ) { 403 add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns'); 404 } 393 405 394 406 // If first time editing, disable advanced items by default. 395 407 if( false === get_user_option( 'managenav-menuscolumnshidden' ) ) { … … 411 423 if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) ) 412 424 return; 413 425 414 $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add- custom-links', 'add-page', 'add-category' );426 $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-page', 'add-common-links', 'add-custom-links', 'add-category' ); 415 427 $hidden_meta_boxes = array(); 416 428 417 429 foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) { … … 445 457 $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type ); 446 458 if ( $post_type ) { 447 459 $id = $post_type->name; 448 add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', ' default', $post_type );460 add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'high', $post_type ); 449 461 } 450 462 } 451 463 } … … 489 501 $menu_locations = get_nav_menu_locations(); 490 502 $num_locations = count( array_keys($locations) ); 491 503 492 echo '<p class="howto">' . sprintf( _n('Your theme supports %s menu. Select which menu you would like to use.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n($num_locations)) . '</p>';504 echo '<p class="howto">' . _n('Select a menu to use within your theme.', 'Select the menus you will use in your theme.', $num_locations ) . '</p>'; 493 505 494 506 foreach ( $locations as $location => $description ) { 495 507 ?> … … 512 524 } 513 525 ?> 514 526 <p class="button-controls"> 515 <?php submit_button( __( 'Save' ), 'primary right', 'nav-menu-locations', false , disabled( $nav_menu_selected_id, 0, false )); ?>527 <?php submit_button( __( 'Save' ), 'primary right', 'nav-menu-locations', false ); ?> 516 528 <span class="spinner"></span> 517 529 </p> 518 530 <?php 519 531 } 520 532 521 533 /** 534 * Displays a metabox for the common links menu item. 535 * 536 * @since 3.0.0 537 */ 538 function wp_nav_menu_item_common_link_meta_box() { 539 global $blog_id, $_nav_menu_placeholder, $nav_menu_selected_id; 540 $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; 541 542 $removed_args = array( 543 'action', 544 'customlink-tab', 545 'edit-menu-item', 546 'menu-item', 547 'page-tab', 548 '_wpnonce', 549 ); 550 551 $common_links = array( 552 array( 553 'url' => get_site_url(), 554 'text' => __('Home') 555 ), 556 array( 557 'url' => get_site_url($blog_id, '/wp-login.php'), 558 'text' => __('Log in') 559 ) 560 ); 561 ?> 562 <div class="commonlinkdiv" id="commonlinkdiv"> 563 564 <div class="common-links"> 565 <?php foreach ( $common_links as $link ) { ?> 566 <label class="menu-item-title"><input type="checkbox" class="menu-item-checkbox" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-object-id]" value="<?php echo $link['url']; ?>" title="<?php echo $link['text']; ?>"> <?php echo $link['text']; ?></label> 567 <?php } ?> 568 </div> 569 570 <p class="button-controls"> 571 <span class="add-to-menu"> 572 <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-common-menu-item" id="submit-commonlinkdiv" /> 573 <span class="spinner"></span> 574 </span> 575 </p> 576 577 </div><!-- /.commonlinkdiv --> 578 <?php 579 } 580 581 /** 522 582 * Displays a metabox for the custom links menu item. 523 583 * 524 584 * @since 3.0.0 … … 554 614 555 615 <p id="menu-item-name-wrap"> 556 616 <label class="howto" for="custom-menu-item-name"> 557 <span><?php _e('L abel'); ?></span>617 <span><?php _e('Link Text'); ?></span> 558 618 <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'); ?>" /> 559 619 </label> 560 620 </p> … … 1086 1146 $menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') ); 1087 1147 $result = '<div id="menu-instructions" class="post-body-plain'; 1088 1148 $result .= ( ! empty($menu_items) ) ? ' menu-instructions-inactive">' : '">'; 1089 $result .= '<p>' . __(' Select menu items (pages, categories, links) from the boxes at left to begin building your custom menu.') . '</p>';1149 $result .= '<p>' . __('Next, add menu items (i.e. pages, links, categories) from the column on the left.') . '</p>'; 1090 1150 $result .= '</div>'; 1091 1151 1092 1152 if( empty($menu_items) ) … … 1158 1218 foreach( (array) $menu_items_to_delete as $menu_item_id ) 1159 1219 wp_delete_post( $menu_item_id, true ); 1160 1220 } 1221 add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items'); 1161 1222 1162 add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items'); 1223 /** 1224 * Delete nav menus from the nav menu management screen 1225 * 1226 * @access private 1227 * @since 3.6 1228 */ 1229 function _wp_delete_nav_menu( $nav_menu_id ) { 1230 1231 if ( ! is_nav_menu( $nav_menu_id ) ) 1232 return; 1233 1234 $deleted_nav_menu = wp_get_nav_menu_object( $nav_menu_id ); 1235 $delete_nav_menu = wp_delete_nav_menu( $nav_menu_id ); 1236 1237 if ( is_wp_error( $delete_nav_menu ) ) 1238 return $delete_nav_menu; 1239 1240 // Remove this menu from any locations. 1241 $locations = get_theme_mod( 'nav_menu_locations' ); 1242 foreach ( (array) $locations as $location => $menu_id ) { 1243 if ( $menu_id == $nav_menu_id ) 1244 $locations[ $location ] = 0; 1245 } 1246 set_theme_mod( 'nav_menu_locations', $locations ); 1247 1248 return true; 1249 } 1250 No newline at end of file -
wp-admin/js/nav-menu.js
46 46 this.initSortables(); 47 47 48 48 this.initToggles(); 49 50 this. initTabManager();49 50 this.messageFadeIn(); 51 51 }, 52 52 53 53 jQueryExtensions : function() { … … 222 222 } 223 223 }); 224 224 }, 225 226 messageFadeIn : function() { 227 var messages = $('#message'); 228 229 // Visual change when users save menus multiple times in a row 230 messages.slideDown('slow'); 231 }, 225 232 226 233 initToggles : function() { 227 234 // init postboxes … … 245 252 menuEdge = api.menuList.offset().left, 246 253 body = $('body'), maxChildDepth, 247 254 menuMaxDepth = initialMenuMaxDepth(); 255 256 if( 0 != $('#menu-to-edit li').length ) 257 $('.drag-instructions').show(); 248 258 249 259 // Use the right edge if RTL. 250 260 menuEdge += api.isRTL ? api.menuList.width() : 0; … … 307 317 308 318 // Return child elements to the list 309 319 children = transport.children().insertAfter(ui.item); 320 321 // Add "sub menu" description 322 var subMenuTitle = ui.item.find('.item-title .is-submenu'); 323 if (0 < currentDepth) 324 subMenuTitle.show(); 325 else 326 subMenuTitle.hide(); 310 327 311 328 // Update depth classes 312 329 if( depthChange != 0 ) { … … 327 344 ui.item[0].style.left = 'auto'; 328 345 ui.item[0].style.right = 0; 329 346 } 330 331 // The width of the tab bar might have changed. Just in case.332 api.refreshMenuTabs( true );333 347 }, 334 348 change: function(e, ui) { 335 349 // Make sure the placeholder is inside the menu. … … 433 447 $("#submit-customlinkdiv").click(); 434 448 } 435 449 }); 450 $('#submit-commonlinkdiv').click(function () { 451 api.addCommonLink(); 452 return false; 453 }); 436 454 }, 437 455 438 456 /** … … 461 479 if( '' == $t.val() ) 462 480 $t.addClass( name ).val( $t.data(name) ); 463 481 }); 482 483 $('.blank-slate .input-with-default-title').focus(); 464 484 }, 465 485 466 486 attachThemeLocationsListeners : function() { … … 474 494 loc.find('.spinner').show(); 475 495 $.post( ajaxurl, params, function(r) { 476 496 loc.find('.spinner').hide(); 497 $('.menu-location-success').slideDown('slow'); 477 498 }); 478 499 return false; 479 500 }); … … 521 542 api.processQuickSearchQueryResponse(menuMarkup, params, panel); 522 543 }); 523 544 }, 545 546 addCommonLink : function() { 547 548 $('#commonlinkdiv input[type="checkbox"]:checked').each(function( index ) { 549 var url = $(this).val(), 550 linkText = $(this).prop('title'), 551 processMethod = api.addMenuItemToTop; 524 552 553 // Show the ajax spinner 554 $('.commonlinkdiv .spinner').show(); 555 api.addLinkToMenu( url, linkText, processMethod, function() { 556 // Remove the ajax spinner 557 $('.commonlinkdiv .spinner').hide(); 558 }); 559 }); 560 }, 561 525 562 addCustomLink : function( processMethod ) { 526 563 var url = $('#custom-menu-item-url').val(), 527 564 label = $('#custom-menu-item-name').val(); … … 572 609 $.post( ajaxurl, params, function(menuMarkup) { 573 610 var ins = $('#menu-instructions'); 574 611 processMethod(menuMarkup, params); 612 // Make it stand out a bit more visually, by adding a fadeIn 613 $('li.pending').hide().fadeIn('slow'); 614 $('.drag-instructions').show(); 575 615 if( ! ins.hasClass('menu-instructions-inactive') && ins.siblings().length ) 576 616 ins.addClass('menu-instructions-inactive'); 577 617 callback(); … … 604 644 }; 605 645 } else { 606 646 // 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');647 $('#menu-settings-column').find('input,select').end().find('a').attr('href', '#').unbind('click'); 608 648 } 609 649 }, 610 650 … … 688 728 }); 689 729 }, 690 730 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 so709 * 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 show721 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 necessary729 if( fixedWidth > tabsWidth )730 arrowLeft.add( arrowRight ).hide();731 else732 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 tabs764 tabs.each(function(){765 tabsWidth += $(this).outerWidth(true);766 });767 768 // Set up fixed margin for overflow, unset padding769 css['padding'] = 0;770 css[marginFixed] = (-1 * tabsWidth) + 'px';771 fluid.css( css );772 773 // Build tab navigation774 arrowLeft = $('<div class="nav-tabs-arrow nav-tabs-arrow-left"><a>«</a></div>');775 arrowRight = $('<div class="nav-tabs-arrow nav-tabs-arrow-right"><a>»</a></div>');776 // Attach to the document777 fixed.wrap('<div class="nav-tabs-nav"/>').parent().prepend( arrowLeft ).append( arrowRight );778 779 // Set the menu tabs780 api.refreshMenuTabs();781 // Make sure the tabs reset on resize782 $(window).resize(function() {783 if( resizeTimer ) clearTimeout(resizeTimer);784 resizeTimer = setTimeout( api.refreshMenuTabs, 200);785 });786 787 // Build arrow functions788 $.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 824 731 eventOnClickEditLink : function(clickedEl) { 825 732 var settings, item, 826 733 matchedSection = /#(.*)$/.exec(clickedEl.href); … … 945 852 var ins = $('#menu-instructions'); 946 853 el.remove(); 947 854 children.shiftDepthClass(-1).updateParentMenuItemDBId(); 948 if( ! ins.siblings().length ) 855 if( 0 == $('#menu-to-edit li').length ) { 856 $('.drag-instructions').hide(); 949 857 ins.removeClass('menu-instructions-inactive'); 858 } 950 859 }); 951 860 }, 952 861 -
wp-admin/nav-menus.php
221 221 if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) ) 222 222 $messages[] = '<div id="message" class="updated"><p>' . __('The menu item has been successfully deleted.') . '</p></div>'; 223 223 break; 224 224 225 case 'delete': 225 226 check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id ); 226 227 227 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 ); 254 229 } else { 255 230 // Reset the selected menu 256 231 $nav_menu_selected_id = 0; 257 232 unset( $_REQUEST['menu'] ); 258 233 } 234 235 if ( is_wp_error( $deletion ) ) 236 $messages[] = '<div id="message" class="error"><p>' . $deletion->get_error_message() . '</p></div>'; 237 else 238 $messages[] = '<div id="message" class="updated"><p>' . __( 'The menu has been successfully deleted.' ) . '</p></div>'; 259 239 break; 260 240 241 case 'delete_menus': 242 check_admin_referer( 'nav_menus_bulk_actions' ); 243 foreach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) { 244 if ( ! is_nav_menu( $menu_id_to_delete ) ) 245 continue; 246 247 $deletion = _wp_delete_nav_menu( $menu_id_to_delete ); 248 if ( is_wp_error( $deletion ) ) { 249 $messages[] = '<div id="message" class="error"><p>' . $deletion->get_error_message() . '</p></div>'; 250 $deletion_error = true; 251 } 252 } 253 254 if ( empty( $deletion_error ) ) 255 $messages[] = '<div id="message" class="updated"><p>' . __( 'Selected menus have been successfully deleted.' ) . '</p></div>'; 256 break; 257 261 258 case 'update': 262 259 check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); 263 260 … … 367 364 368 365 do_action( 'wp_update_nav_menu', $nav_menu_selected_id ); 369 366 370 $messages[] = '<div id="message" class="updated"><p>' . sprintf( __(' The <strong>%s</strong> menu has been updated.'), $nav_menu_selected_title) . '</p></div>';367 $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('<strong>%s</strong> has been updated. Use this menu to <a href="%s">replace your sites main navigation</a>, or <a href="%s">within a widget</a>.'), $nav_menu_selected_title, admin_url( 'nav-menus.php' ), admin_url( 'widgets.php' ) ) . '</p></div>'; 371 368 unset( $menu_items, $unsorted_menu_items ); 372 369 } 373 370 } … … 434 431 if ( ! current_theme_supports( 'menus' ) && ! wp_get_nav_menus() ) 435 432 $messages[] = '<div id="message" class="updated"><p>' . __('The current theme does not natively support menus, but you can use the “Custom Menu” widget to add any menus you create here to the theme’s sidebar.') . '</p></div>'; 436 433 434 add_screen_option( 'per_page', array('label' => _x( 'Menus', 'nav menus per page (screen options)' )) ); 435 437 436 get_current_screen()->add_help_tab( array( 438 437 'id' => 'overview', 439 438 'title' => __('Overview'), … … 455 454 '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>' 456 455 ); 457 456 457 // prep the table view 458 $wp_list_table = _get_list_table( 'WP_Menus_List_Table' ); 459 $pagenum = $wp_list_table->get_pagenum(); 460 $wp_list_table->prepare_items(); 461 458 462 // Get the admin header 459 463 require_once( './admin-header.php' ); 460 464 ?> 461 465 <div class="wrap"> 462 466 <?php screen_icon(); ?> 463 <h2><?php esc_html_e('Menus'); ?></h2> 467 <h2 class="nav-tab-wrapper"> 468 <a href="<?php echo admin_url( 'nav-menus.php' ); ?>" class="nav-tab<?php if ( ! isset( $_POST['menu-name'] ) && ! isset( $_GET['action'] ) || isset( $_GET['_wpnonce'] ) ) echo ' nav-tab-active'; ?>"><?php esc_html_e('Manage Menus'); ?></a> 469 <a href="<?php echo esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, ), admin_url( 'nav-menus.php' ) ) ); ?>" class="nav-tab<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] ) echo ' nav-tab-active'; ?>"><?php esc_html_e('Add Menu'); ?></a> 470 </h2> 464 471 <?php 465 472 foreach( $messages as $message ) : 466 473 echo $message . "\n"; 467 474 endforeach; 468 475 ?> 476 <div class="updated menu-location-success" style="display: none;"><p><?php echo sprintf( __('The menus within your theme have been updated. <a href="%s">Visit your site</a> to preview these changes.'), get_site_url() ); ?></p></div> 469 477 <div id="nav-menus-frame"> 470 <div id="menu-settings-column" class="metabox-holder<?php if ( !$nav_menu_selected_id) { echo ' metabox-holder-disabled'; } ?>">478 <div id="menu-settings-column" class="metabox-holder<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] || empty( $nav_menus ) ) { echo ' metabox-holder-disabled'; } ?>"> 471 479 480 <div class="clear"></div> 481 472 482 <form id="nav-menu-meta" action="<?php echo admin_url( 'nav-menus.php' ); ?>" class="nav-menu-meta" method="post" enctype="multipart/form-data"> 473 483 <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> 474 484 <input type="hidden" name="action" value="add-menu-item" /> … … 479 489 </div><!-- /#menu-settings-column --> 480 490 <div id="menu-management-liquid"> 481 491 <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 ); ?> 492 <?php if ( ! isset( $_POST['menu-name'] ) && ! empty( $nav_menus ) && ! isset( $_GET['action'] ) || ( isset( $_GET['_wpnonce'] ) && 0 != count( $nav_menus ) ) ) : ?> 493 494 <form id="menu-list-form" action="" method="post"> 495 496 <?php 497 if ( $wp_list_table->should_display_search() ) 498 $wp_list_table->search_box( __( 'Search Menus' ), 'menus' ); 499 ?> 500 501 <?php $wp_list_table->display(); ?> 502 503 <input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('total_items') ); ?>" /> 504 <input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('per_page') ); ?>" /> 505 <input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('page') ); ?>" /> 506 <?php wp_nonce_field( 'nav_menus_bulk_actions' ); ?> 507 495 508 </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> 509 510 511 <?php else : ?> 530 512 <div class="menu-edit"> 531 513 <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data"> 532 514 <div id="nav-menu-header"> 533 515 <div id="submitpost" class="submitbox"> 534 <div class="major-publishing-actions ">516 <div class="major-publishing-actions <?php if ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] || empty( $nav_menus ) ) echo 'blank-slate'; ?>"> 535 517 <label class="menu-name-label howto open-label" for="menu-name"> 536 518 <span><?php _e('Menu Name'); ?></span> 537 519 <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 ); ?>" /> … … 551 533 <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 534 </div> 553 535 <?php endif; ?> 554 <br class="clear" />555 536 <div class="publishing-action"> 556 537 <?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 538 </div><!-- END .publishing-action --> 558 539 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&menu=' . $nav_menu_selected_id), 'delete-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Delete Menu'); ?></a>562 </div><!-- END .delete-action -->563 <?php endif; ?>564 540 </div><!-- END .major-publishing-actions --> 565 541 </div><!-- END #submitpost .submitbox --> 566 542 <?php … … 574 550 <div id="post-body"> 575 551 <div id="post-body-content"> 576 552 <?php 577 if ( isset( $edit_markup ) ) { 553 $drag_instructions = ''; 554 if ( empty( $ordered_menu_items ) ) 555 $drag_instructions = 'style="display: none;"'; 556 557 if ( isset( $edit_markup ) ) { 558 echo '<div class="drag-instructions post-body-plain" ' . $drag_instructions . '>'; 559 echo '<p>' . __('Drag each item into the order you prefer. Click an item to reveal additional configuration options.') . '</p>'; 560 echo '</div>'; 561 578 562 if ( ! is_wp_error( $edit_markup ) ) 579 563 echo $edit_markup; 580 564 } else if ( empty( $nav_menu_selected_id ) ) { 581 565 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>'; 566 echo '<p>' . __('Give your custom menu a name above, then click Create Menu.') . '</p>'; 585 567 echo '</div>'; 586 568 } 587 569 ?> … … 599 581 </div><!-- /#nav-menu-footer --> 600 582 </form><!-- /#update-nav-menu --> 601 583 </div><!-- /.menu-edit --> 584 <?php endif; ?> 602 585 </div><!-- /#menu-management --> 603 586 </div><!-- /#menu-management-liquid --> 604 587 </div><!-- /#nav-menus-frame --> -
wp-admin/css/wp-admin.css
2428 2428 .fixed .column-categories, 2429 2429 .fixed .column-tags, 2430 2430 .fixed .column-rel, 2431 .fixed .column-role { 2431 .fixed .column-role, 2432 .fixed .column-count { 2432 2433 width: 15%; 2433 2434 } 2434 2435 … … 6750 6751 6751 6752 /* nav-menu */ 6752 6753 6754 .nav-menus-php #message { 6755 display: none; 6756 } 6757 6758 .nav-menus-php .nav-tab-wrapper { 6759 margin-bottom: 20px; 6760 } 6761 6753 6762 #nav-menus-frame { 6754 6763 margin-left: 300px; 6764 margin-top: 20px; 6755 6765 } 6756 6766 6757 6767 #wpbody-content #menu-settings-column { … … 6760 6770 margin-left: -300px; 6761 6771 clear: both; 6762 6772 float: left; 6763 padding-top: 24px;6773 padding-top: 0; 6764 6774 } 6765 6775 6766 6776 .no-js #wpbody-content #menu-settings-column { … … 6785 6795 position: relative; 6786 6796 } 6787 6797 6798 .blank-slate br { 6799 display: none; 6800 } 6801 6802 .blank-slate .menu-name { 6803 height: 2em; 6804 } 6805 6806 .is-submenu { 6807 color: #999; 6808 font-style: italic; 6809 font-weight: normal; 6810 margin-left: 4px; 6811 } 6812 6813 .common-links { 6814 background: #fff; 6815 border: 1px solid #dfdfdf; 6816 line-height: 1.4em; 6817 min-height: 42px; 6818 padding: 0.9em; 6819 } 6820 6821 .common-links label { 6822 display: block; 6823 line-height: 19px; 6824 } 6825 6788 6826 /* Menu Container */ 6789 6827 #menu-management-liquid { 6790 6828 float: left; 6791 6829 min-width: 100%; 6830 margin-top: 3px; 6792 6831 } 6793 6832 6794 6833 #menu-management { … … 6802 6841 margin-bottom: 20px; 6803 6842 } 6804 6843 6844 #menu-management p.search-box { 6845 margin: 5px 0; 6846 } 6847 6805 6848 .nav-menus-php #post-body { 6806 6849 padding: 10px; 6807 6850 border-width: 1px 0; … … 6835 6878 font-weight:bold; 6836 6879 } 6837 6880 6838 /* Menu Tabs */6839 6840 #menu-management .nav-tabs-nav {6841 margin: 0 20px;6842 }6843 6844 #menu-management .nav-tabs-arrow {6845 width: 10px;6846 padding: 0 5px 4px;6847 cursor: pointer;6848 position: absolute;6849 top: 0;6850 line-height: 22px;6851 font-size: 18px;6852 text-shadow: 0 1px 0 #fff;6853 }6854 6855 #menu-management .nav-tabs-arrow-left {6856 left: 0;6857 }6858 6859 #menu-management .nav-tabs-arrow-right {6860 right: 0;6861 text-align: right;6862 }6863 6864 #menu-management .nav-tabs-wrapper {6865 width: 100%;6866 height: 28px;6867 margin-bottom: -1px;6868 overflow: hidden;6869 }6870 6871 #menu-management .nav-tabs {6872 padding-left: 20px;6873 padding-right: 10px;6874 }6875 6876 .js #menu-management .nav-tabs {6877 float: left;6878 margin-left: 0px;6879 margin-right: -400px;6880 }6881 6882 #menu-management .nav-tab {6883 margin-bottom: 0;6884 font-size: 14px;6885 }6886 6887 6881 #select-nav-menu-container { 6888 6882 text-align: right; 6889 6883 padding: 0 10px 3px 10px; … … 7080 7074 } 7081 7075 7082 7076 #menu-to-edit { 7083 padding: 1em 0;7077 padding: 0.1em 0; 7084 7078 } 7085 7079 7086 7080 .menu ul { … … 7326 7320 margin: 5px 0 1px; 7327 7321 } 7328 7322 7323 .nav-menus-php .blank-slate .publishing-action { 7324 float: left; 7325 margin: 1px 0 0; 7326 } 7327 7329 7328 .nav-menus-php .major-publishing-actions .delete-action { 7330 7329 vertical-align: middle; 7331 7330 text-align: left;