Make WordPress Core

Ticket #41081: 41081.4.diff

File 41081.4.diff, 9.4 KB (added by mdifelice, 7 years ago)

New patch with Customizer support.

  • src/wp-admin/js/customize-nav-menus.js

     
    14831483
    14841484                        $removeBtn.on( 'click', function() {
    14851485                                // Find an adjacent element to add focus to when this menu item goes away
    1486                                 var addingItems = true, $adjacentFocusTarget, $next, $prev;
     1486                                var addingItems = true, $adjacentFocusTarget, $next, $prev,
     1487                                        currentMenuControl,
     1488                                        navMenuItemCount;
    14871489
    14881490                                if ( ! $( 'body' ).hasClass( 'adding-menu-items' ) ) {
    14891491                                        addingItems = false;
     
    15051507                                        wp.a11y.speak( api.Menus.data.l10n.itemDeleted );
    15061508                                        $adjacentFocusTarget.focus(); // keyboard accessibility
    15071509                                } );
     1510
     1511                                currentMenuControl = control.getMenuControl();
     1512
     1513                                if ( currentMenuControl ) {
     1514                                        navMenuItemCount = currentMenuControl.getMenuItemControls().length;
     1515
     1516                                        /**
     1517                                         * Since the item is not remove yet, we check if the
     1518                                         * current value is 1, meaning there is only one item in
     1519                                         * the menu that will be removed.
     1520                                         */
     1521                                        if ( 1 === navMenuItemCount ) {
     1522                                                currentMenuControl.removeFromWidgets();
     1523                                        }
     1524                                }
    15081525                        } );
    15091526                },
    15101527
     
    21352152                 */
    21362153                ready: function() {
    21372154                        var control = this,
    2138                                 section = api.section( control.section() ),
    2139                                 menuId = control.params.menu_id,
    2140                                 menu = control.setting(),
    2141                                 name,
    2142                                 widgetTemplate,
    2143                                 select;
     2155                                section = api.section( control.section() );
    21442156
    21452157                        if ( 'undefined' === typeof this.params.menu_id ) {
    21462158                                throw new Error( 'params.menu_id was not defined' );
     
    21752187                        this._setupAddition();
    21762188                        this._setupLocations();
    21772189                        this._setupTitle();
    2178 
    2179                         // Add menu to Custom Menu widgets.
    2180                         if ( menu ) {
    2181                                 name = displayNavMenuName( menu.name );
    2182 
    2183                                 // Add the menu to the existing controls.
    2184                                 api.control.each( function( widgetControl ) {
    2185                                         if ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {
    2186                                                 return;
    2187                                         }
    2188                                         widgetControl.container.find( '.nav-menu-widget-form-controls:first' ).show();
    2189                                         widgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).hide();
    2190 
    2191                                         select = widgetControl.container.find( 'select' );
    2192                                         if ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {
    2193                                                 select.append( new Option( name, menuId ) );
    2194                                         }
    2195                                 } );
    2196 
    2197                                 // Add the menu to the widget template.
    2198                                 widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
    2199                                 widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).show();
    2200                                 widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).hide();
    2201                                 select = widgetTemplate.find( '.widget-inside select:first' );
    2202                                 if ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {
    2203                                         select.append( new Option( name, menuId ) );
    2204                                 }
    2205                         }
    22062190                },
    22072191
    22082192                /**
     
    23372321                _handleDeletion: function() {
    23382322                        var control = this,
    23392323                                section,
    2340                                 menuId = control.params.menu_id,
    2341                                 removeSection,
    2342                                 widgetTemplate,
    2343                                 navMenuCount = 0;
     2324                                removeSection;
    23442325                        section = api.section( control.section() );
    23452326                        removeSection = function() {
    23462327                                section.container.remove();
     
    23592340                                removeSection();
    23602341                        }
    23612342
    2362                         api.each(function( setting ) {
    2363                                 if ( /^nav_menu\[/.test( setting.id ) && false !== setting() ) {
    2364                                         navMenuCount += 1;
    2365                                 }
    2366                         });
    2367 
    2368                         // Remove the menu from any Custom Menu widgets.
    2369                         api.control.each(function( widgetControl ) {
    2370                                 if ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {
    2371                                         return;
    2372                                 }
    2373                                 var select = widgetControl.container.find( 'select' );
    2374                                 if ( select.val() === String( menuId ) ) {
    2375                                         select.prop( 'selectedIndex', 0 ).trigger( 'change' );
    2376                                 }
    2377 
    2378                                 widgetControl.container.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
    2379                                 widgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
    2380                                 widgetControl.container.find( 'option[value=' + String( menuId ) + ']' ).remove();
    2381                         });
    2382 
    2383                         // Remove the menu to the nav menu widget template.
    2384                         widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
    2385                         widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
    2386                         widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
    2387                         widgetTemplate.find( 'option[value=' + String( menuId ) + ']' ).remove();
     2343                        control.removeFromWidgets();
    23882344                },
    23892345
    23902346                // Setup theme location checkboxes.
     
    26212577                 * @returns {wp.customize.Menus.controlConstructor.nav_menu_item} The newly-created nav_menu_item control instance.
    26222578                 */
    26232579                addItemToMenu: function( item ) {
    2624                         var menuControl = this, customizeId, settingArgs, setting, menuItemControl, placeholderId, position = 0, priority = 10;
     2580                        var menuControl = this, customizeId, settingArgs, setting, menuItemControl, placeholderId, position = 0, priority = 10,
     2581                                menu,
     2582                                name,
     2583                                menuId,
     2584                                select,
     2585                                widgetTemplate;
    26252586
    26262587                        _.each( menuControl.getMenuItemControls(), function( control ) {
    26272588                                if ( false === control.setting() ) {
     
    26792640
    26802641                        wp.a11y.speak( api.Menus.data.l10n.itemAdded );
    26812642
     2643                        /**
     2644                         * Add menu to Custom Menu widgets since it has at least one
     2645                         * menu item.
     2646                         */
     2647                        menu = menuControl.setting();
     2648
     2649                        if ( menu ) {
     2650                                name    = displayNavMenuName( menu.name );
     2651                                menuId  = menuControl.params.menu_id;
     2652
     2653                                /**
     2654                                 * Add the menu to the existing controls.
     2655                                 */
     2656                                api.control.each( function( widgetControl ) {
     2657                                        if ( widgetControl.extended( api.controlConstructor.widget_form ) ||
     2658                                                 'nav_menu' === widgetControl.params.widget_id_base ) {
     2659                                                widgetControl.container.find( '.nav-menu-widget-form-controls:first' ).show();
     2660                                                widgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).hide();
     2661
     2662                                                select = widgetControl.container.find( 'select' );
     2663                                               
     2664                                                if ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {
     2665                                                        select.append( new Option( name, menuId ) );
     2666                                                }
     2667                                        }
     2668                                } );
     2669                               
     2670                                /**
     2671                                 * Add the menu to the widget template.
     2672                                 */
     2673                                widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
     2674
     2675                                widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).show();
     2676                                widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).hide();
     2677
     2678                                select = widgetTemplate.find( '.widget-inside select:first' );
     2679
     2680                                if ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {
     2681                                        select.append( new Option( name, menuId ) );
     2682                                }
     2683                        }
     2684
    26822685                        return menuItemControl;
     2686                },
     2687
     2688                /**
     2689                 * Removes menu from widgets.
     2690                 */
     2691                removeFromWidgets: function() {
     2692                        var navMenuCount = 0,
     2693                                select,
     2694                                menuId = this.params.menu_id,
     2695                                widgetTemplate;
     2696
     2697                        api.each( function( setting ) {
     2698                                if ( /^nav_menu\[/.test( setting.id ) &&
     2699                                         false !== setting() ) {
     2700                                        navMenuCount += 1;
     2701                                }
     2702                        } );
     2703
     2704                        /**
     2705                         * Remove the menu from any Custom Menu widgets.
     2706                         */
     2707                        api.control.each( function( widgetControl ) {
     2708                                if ( widgetControl.extended( api.controlConstructor.widget_form ) &&
     2709                                        'nav_menu' === widgetControl.params.widget_id_base ) {
     2710                                        select = widgetControl.container.find( 'select' );
     2711
     2712                                        if ( select.val() === String( menuId ) ) {
     2713                                                select.prop( 'selectedIndex', 0 ).trigger( 'change' );
     2714                                        }
     2715
     2716                                        widgetControl.container.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
     2717                                        widgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
     2718                                        widgetControl.container.find( 'option[value=' + String( menuId ) + ']' ).remove();
     2719                                }
     2720                        } );
     2721
     2722                        /**
     2723                         * Remove the menu to the nav menu widget template.
     2724                         */
     2725                        widgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );
     2726
     2727                        widgetTemplate.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );
     2728                        widgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );
     2729                        widgetTemplate.find( 'option[value=' + String( menuId ) + ']' ).remove();
    26832730                }
    26842731        } );
    26852732
  • src/wp-includes/widgets/class-wp-nav-menu-widget.php

     
    118118                $nav_menu = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : '';
    119119
    120120                // Get menus
    121                 $menus = wp_get_nav_menus();
     121                $menus = wp_get_nav_menus( array(
     122                        'hide_empty' => true,
     123                ) );
    122124
    123125                // If no menus exists, direct the user to go and create some.
    124126                ?>
     
    130132                                $url = admin_url( 'nav-menus.php' );
    131133                        }
    132134                        ?>
    133                         <?php echo sprintf( __( 'No menus have been created yet. <a href="%s">Create some</a>.' ), esc_attr( $url ) ); ?>
     135                        <?php echo sprintf( __( 'No menus have been created or they are empty. <a href="%s">Manage menus</a>.' ), esc_attr( $url ) ); ?>
    134136                </p>
    135137                <div class="nav-menu-widget-form-controls" <?php if ( empty( $menus ) ) { echo ' style="display:none" '; } ?>>
    136138                        <p>