WordPress.org

Make WordPress Core

Ticket #36697: 36697.diff

File 36697.diff, 6.1 KB (added by curdin, 4 years ago)
  • src/wp-admin/js/customize-nav-menus.js

    diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
    index 25495fe..83b2693 100644
     
    292292
    293293                // Render the individual items.
    294294                initList: function() {
    295                         var self = this;
     295                        var self = this,
     296                        itemTypes = [];
    296297
    297298                        // Render the template for each item by type.
    298299                        _.each( api.Menus.data.itemTypes, function( itemType ) {
    299300                                self.pages[ itemType.type + ':' + itemType.object ] = 0;
    300                                 self.loadItems( itemType.type, itemType.object ); // @todo we need to combine these Ajax requests.
     301                                itemTypes.push({
     302                                        type: itemType.type,
     303                                        object: itemType.object
     304                                });
    301305                        } );
     306                        self.loadItems( itemTypes, self.pages.menu || 0 ); // @todo we need to combine these Ajax requests.
    302307                },
    303308
    304309                // Load available menu items.
    305                 loadItems: function( type, object ) {
    306                         var self = this, params, request, itemTemplate, availableMenuItemContainer;
     310                loadItems: function( itemTypes, page ) {
     311                        var self = this, params, request, itemTemplate, availableMenuItemContainer = [];
    307312                        itemTemplate = wp.template( 'available-menu-item' );
     313                        _.each( itemTypes, function( itemType, index ) {
     314                                var type = itemType.type,
     315                                        object = itemType.object
    308316
    309                         if ( -1 === self.pages[ type + ':' + object ] ) {
    310                                 return;
    311                         }
    312                         availableMenuItemContainer = $( '#available-menu-items-' + type + '-' + object );
    313                         availableMenuItemContainer.find( '.accordion-section-title' ).addClass( 'loading' );
     317                                if ( -1 === self.pages[ type + ':' + object ] ) {
     318                                        itemTypes.splice(index)
     319                                } else {
     320                                        availableMenuItemContainer[type + ':' + object] = $( '#available-menu-items-' + type + '-' + object );
     321                                        availableMenuItemContainer[type + ':' + object].find( '.accordion-section-title' ).addClass( 'loading' );
     322                                }
     323
     324                        } );
    314325                        self.loading = true;
    315326                        params = {
    316327                                'customize-menus-nonce': api.settings.nonce['customize-menus'],
    317328                                'wp_customize': 'on',
    318                                 'type': type,
    319                                 'object': object,
    320                                 'page': self.pages[ type + ':' + object ]
     329                                'itemTypes': itemTypes,
     330                                'page': page
    321331                        };
    322332                        request = wp.ajax.post( 'load-available-menu-items-customizer', params );
    323333
    324334                        request.done(function( data ) {
    325335                                var items, typeInner;
    326336                                items = data.items;
    327                                 if ( 0 === items.length ) {
    328                                         if ( 0 === self.pages[ type + ':' + object ] ) {
    329                                                 availableMenuItemContainer
    330                                                         .addClass( 'cannot-expand' )
    331                                                         .removeClass( 'loading' )
    332                                                         .find( '.accordion-section-title > button' )
    333                                                         .prop( 'tabIndex', -1 );
     337
     338                                _.each( items, function( item, name ){
     339
     340                                        var nameArr = name.split(':'),
     341                                                type = nameArr[0],
     342                                                object = nameArr[1]
     343
     344
     345                                        if ( 0 === items.length ) {
     346                                                if ( 0 === self.pages[ type + ':' + object ] ) {
     347                                                        availableMenuItemContainer[type + ':' + object].find( '.accordion-section-title' )
     348                                                                .addClass( 'cannot-expand' )
     349                                                                .removeClass( 'loading' )
     350                                                                .find( '.accordion-section-title > button' )
     351                                                                .prop( 'tabIndex', -1 );
     352                                                }
     353                                                self.pages[ type + ':' + object ] = -1;
     354                                                return;
    334355                                        }
    335                                         self.pages[ type + ':' + object ] = -1;
    336                                         return;
    337                                 }
    338                                 items = new api.Menus.AvailableItemCollection( items ); // @todo Why is this collection created and then thrown away?
    339                                 self.collection.add( items.models );
    340                                 typeInner = availableMenuItemContainer.find( '.accordion-section-content' );
    341                                 items.each(function( menuItem ) {
    342                                         typeInner.append( itemTemplate( menuItem.attributes ) );
    343                                 });
    344                                 self.pages[ type + ':' + object ] += 1;
     356                                        item = new api.Menus.AvailableItemCollection( item ); // @todo Why is this collection created and then thrown away?
     357                                        self.collection.add( item.models );
     358                                        typeInner = availableMenuItemContainer[type + ':' + object].find( '.accordion-section-content' );
     359                                        item.each(function( menuItem ) {
     360                                                typeInner.append( itemTemplate( menuItem.attributes ) );
     361                                        });
     362                                        self.pages[ type + ':' + object ] += 1;
     363
     364                                })
     365
    345366                        });
    346367                        request.fail(function( data ) {
    347368                                if ( typeof console !== 'undefined' && console.error ) {
     
    349370                                }
    350371                        });
    351372                        request.always(function() {
    352                                 availableMenuItemContainer.find( '.accordion-section-title' ).removeClass( 'loading' );
     373                                for (var key in availableMenuItemContainer ) {
     374                                        availableMenuItemContainer[key].find( '.accordion-section-title' ).removeClass( 'loading' );
     375                                }
    353376                                self.loading = false;
    354377                        });
    355378                },
  • src/wp-includes/class-wp-customize-nav-menus.php

    diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
    index f9832a6..29434a2 100644
    final class WP_Customize_Nav_Menus { 
    9898                        wp_die( -1 );
    9999                }
    100100
    101                 if ( empty( $_POST['type'] ) || empty( $_POST['object'] ) ) {
    102                         wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' );
    103                 }
     101                if ( empty( $_POST['itemTypes'] ) ) {
     102                        wp_send_json_error( 'nav_menus_missing_post_types_parameter' );
     103                } else {
     104                        $all_items = [];
     105                        foreach ( $_POST['itemTypes'] as $itemType ) {
    104106
    105                 $type = sanitize_key( $_POST['type'] );
    106                 $object = sanitize_key( $_POST['object'] );
    107                 $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );
    108                 $items = $this->load_available_items_query( $type, $object, $page );
     107                                if ( empty( $itemType['type'] ) || empty( $itemType['object'] ) ) {
     108                                        wp_send_json_error( 'nav_menus_missing_post_or_object_parameter' );
     109                                }
     110
     111                                $type = sanitize_key( $itemType['type'] );
     112                                $object = sanitize_key( $itemType['object'] );
     113
     114                                $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );
     115                                $items = $this->load_available_items_query( $type, $object, $page );
     116                                if ( is_wp_error( $items ) ) {
     117                                        wp_send_json_error( $items->get_error_code() );
     118                                        wp_die( -1 );
     119                                }
     120                                $all_items[$itemType['type'] . ":" . $itemType['object']] = $items;
     121                        }
     122                        wp_send_json_success( array( 'items' => $all_items ) );
    109123
    110                 if ( is_wp_error( $items ) ) {
    111                         wp_send_json_error( $items->get_error_code() );
    112                 } else {
    113                         wp_send_json_success( array( 'items' => $items ) );
    114124                }
    115125        }
    116126