WordPress.org

Make WordPress Core

Ticket #36697: 36697.2.diff

File 36697.2.diff, 6.1 KB (added by curdin, 4 years ago)

Refreshed patch

  • 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 e514a0a..7b71c96 100644
    (this hunk was shorter than expected) 
    336336
    337337                // Render the individual items.
    338338                initList: function() {
    339                         var self = this;
     339                        var self = this,
     340                        itemTypes = [];
    340341
    341342                        // Render the template for each item by type.
    342343                        _.each( api.Menus.data.itemTypes, function( itemType ) {
    343344                                self.pages[ itemType.type + ':' + itemType.object ] = 0;
    344                                 self.loadItems( itemType.type, itemType.object ); // @todo we need to combine these Ajax requests.
     345                                itemTypes.push({
     346                                        type: itemType.type,
     347                                        object: itemType.object
     348                                });
    345349                        } );
     350                        self.loadItems( itemTypes, self.pages.menu || 0 ); // @todo we need to combine these Ajax requests.
    346351                },
    347352
    348353                // Load available menu items.
    349                 loadItems: function( type, object ) {
    350                         var self = this, params, request, itemTemplate, availableMenuItemContainer;
     354                loadItems: function( itemTypes, page ) {
     355                        var self = this, params, request, itemTemplate, availableMenuItemContainer = [];
    351356                        itemTemplate = wp.template( 'available-menu-item' );
     357                        _.each( itemTypes, function( itemType, index ) {
     358                                var type = itemType.type,
     359                                        object = itemType.object
    352360
    353                         if ( -1 === self.pages[ type + ':' + object ] ) {
    354                                 return;
    355                         }
    356                         availableMenuItemContainer = $( '#available-menu-items-' + type + '-' + object );
    357                         availableMenuItemContainer.find( '.accordion-section-title' ).addClass( 'loading' );
     361                                if ( -1 === self.pages[ type + ':' + object ] ) {
     362                                        itemTypes.splice(index)
     363                                } else {
     364                                        availableMenuItemContainer[type + ':' + object] = $( '#available-menu-items-' + type + '-' + object );
     365                                        availableMenuItemContainer[type + ':' + object].find( '.accordion-section-title' ).addClass( 'loading' );
     366                                }
     367
     368                        } );
    358369                        self.loading = true;
    359370                        params = {
    360371                                'customize-menus-nonce': api.settings.nonce['customize-menus'],
    361372                                'wp_customize': 'on',
    362                                 'type': type,
    363                                 'object': object,
    364                                 'page': self.pages[ type + ':' + object ]
     373                                'itemTypes': itemTypes,
     374                                'page': page
    365375                        };
    366376                        request = wp.ajax.post( 'load-available-menu-items-customizer', params );
    367377
    368378                        request.done(function( data ) {
    369379                                var items, typeInner;
    370380                                items = data.items;
    371                                 if ( 0 === items.length ) {
    372                                         if ( 0 === self.pages[ type + ':' + object ] ) {
    373                                                 availableMenuItemContainer
    374                                                         .addClass( 'cannot-expand' )
    375                                                         .removeClass( 'loading' )
    376                                                         .find( '.accordion-section-title > button' )
    377                                                         .prop( 'tabIndex', -1 );
     381
     382                                _.each( items, function( item, name ){
     383
     384                                        var nameArr = name.split(':'),
     385                                                type = nameArr[0],
     386                                                object = nameArr[1]
     387
     388                                        if ( 0 === items.length ) {
     389                                                if ( 0 === self.pages[ type + ':' + object ] ) {
     390                                                        availableMenuItemContainer[type + ':' + object].find( '.accordion-section-title' )
     391                                                                .addClass( 'cannot-expand' )
     392                                                                .removeClass( 'loading' )
     393                                                                .find( '.accordion-section-title > button' )
     394                                                                .prop( 'tabIndex', -1 );
     395                                                }
     396                                                self.pages[ type + ':' + object ] = -1;
     397                                                return;
    378398                                        }
    379                                         self.pages[ type + ':' + object ] = -1;
    380                                         return;
    381                                 }
    382                                 items = new api.Menus.AvailableItemCollection( items ); // @todo Why is this collection created and then thrown away?
    383                                 self.collection.add( items.models );
    384                                 typeInner = availableMenuItemContainer.find( '.available-menu-items-list' );
    385                                 items.each(function( menuItem ) {
    386                                         typeInner.append( itemTemplate( menuItem.attributes ) );
    387                                 });
    388                                 self.pages[ type + ':' + object ] += 1;
     399                                        item = new api.Menus.AvailableItemCollection( item ); // @todo Why is this collection created and then thrown away?
     400                                        self.collection.add( item.models );
     401                                        typeInner = availableMenuItemContainer[type + ':' + object].find( '.accordion-section-content' );
     402                                        item.each(function( menuItem ) {
     403                                                typeInner.append( itemTemplate( menuItem.attributes ) );
     404                                        });
     405                                        self.pages[ type + ':' + object ] += 1;
     406
     407                                })
     408
    389409                        });
    390410                        request.fail(function( data ) {
    391411                                if ( typeof console !== 'undefined' && console.error ) {
     
    393414                                }
    394415                        });
    395416                        request.always(function() {
    396                                 availableMenuItemContainer.find( '.accordion-section-title' ).removeClass( 'loading' );
     417                                for (var key in availableMenuItemContainer ) {
     418                                        availableMenuItemContainer[key].find( '.accordion-section-title' ).removeClass( 'loading' );
     419                                }
    397420                                self.loading = false;
    398421                        });
    399422                },
  • 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 898152d..77509ce 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        }