WordPress.org

Make WordPress Core

Ticket #36697: 36697.3.diff

File 36697.3.diff, 6.3 KB (added by curdin, 3 years ago)

Refreshed corrupted patch 36697.2.diff

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

     
    355355
    356356                // Render the individual items.
    357357                initList: function() {
    358                         var self = this;
     358                        var self = this,
     359                        itemTypes = [];
    359360
    360361                        // Render the template for each item by type.
    361362                        _.each( api.Menus.data.itemTypes, function( itemType ) {
    362363                                self.pages[ itemType.type + ':' + itemType.object ] = 0;
    363                                 self.loadItems( itemType.type, itemType.object ); // @todo we need to combine these Ajax requests.
     364                                itemTypes.push({
     365                                        type: itemType.type,
     366                                        object: itemType.object
     367                                        });
    364368                        } );
     369                        self.loadItems( itemTypes, self.pages.menu || 0 ); // @todo we need to combine these Ajax requests.
    365370                },
    366371
    367372                // Load available menu items.
    368                 loadItems: function( type, object ) {
    369                         var self = this, params, request, itemTemplate, availableMenuItemContainer;
     373                loadItems: function( itemTypes, page ) {
     374                        var self = this, params, request, itemTemplate, availableMenuItemContainer = [];
    370375                        itemTemplate = wp.template( 'available-menu-item' );
     376                        _.each( itemTypes, function( itemType, index ) {
     377                                var type = itemType.type,
     378                                object = itemType.object
    371379
    372                         if ( -1 === self.pages[ type + ':' + object ] ) {
    373                                 return;
    374                         }
    375                         availableMenuItemContainer = $( '#available-menu-items-' + type + '-' + object );
    376                         availableMenuItemContainer.find( '.accordion-section-title' ).addClass( 'loading' );
     380                                if ( -1 === self.pages[ type + ':' + object ] ) {
     381                                        itemTypes.splice(index)
     382                                } else {
     383                                        availableMenuItemContainer[type + ':' + object] = $( '#available-menu-items-' + type + '-' + object );
     384                                        availableMenuItemContainer[type + ':' + object].find( '.accordion-section-title' ).addClass( 'loading' );
     385                                }
     386
     387                        } );
    377388                        self.loading = true;
    378389                        params = {
    379390                                'customize-menus-nonce': api.settings.nonce['customize-menus'],
    380391                                'wp_customize': 'on',
    381                                 'type': type,
    382                                 'object': object,
    383                                 'page': self.pages[ type + ':' + object ]
     392                                'itemTypes': itemTypes,
     393                                'page': page
    384394                        };
    385395                        request = wp.ajax.post( 'load-available-menu-items-customizer', params );
    386396
     
    387397                        request.done(function( data ) {
    388398                                var items, typeInner;
    389399                                items = data.items;
    390                                 if ( 0 === items.length ) {
    391                                         if ( 0 === self.pages[ type + ':' + object ] ) {
    392                                                 availableMenuItemContainer
    393                                                         .addClass( 'cannot-expand' )
    394                                                         .removeClass( 'loading' )
    395                                                         .find( '.accordion-section-title > button' )
    396                                                         .prop( 'tabIndex', -1 );
     400
     401                                _.each( items, function( item, name ){
     402                                var nameArr = name.split(':'),
     403                                        type = nameArr[0],
     404                                        object = nameArr[1]
     405
     406                                        if ( 0 === items.length ) {
     407                                                if ( 0 === self.pages[ type + ':' + object ] ) {
     408                                                        availableMenuItemContainer[type + ':' + object].find( '.accordion-section-title' )
     409                                                                .addClass( 'cannot-expand' )
     410                                                                .removeClass( 'loading' )
     411                                                                .find( '.accordion-section-title > button' )
     412                                                                .prop( 'tabIndex', -1 );
     413                                                }
     414                                                self.pages[ type + ':' + object ] = -1;
     415                                                return;
    397416                                        }
    398                                         self.pages[ type + ':' + object ] = -1;
    399                                         return;
    400                                 } else if ( ( 'page' === object ) && ( ! availableMenuItemContainer.hasClass( 'open' ) ) ) {
    401                                         availableMenuItemContainer.find( '.accordion-section-title > button' ).click();
    402                                 }
    403                                 items = new api.Menus.AvailableItemCollection( items ); // @todo Why is this collection created and then thrown away?
    404                                 self.collection.add( items.models );
    405                                 typeInner = availableMenuItemContainer.find( '.available-menu-items-list' );
    406                                 items.each(function( menuItem ) {
    407                                         typeInner.append( itemTemplate( menuItem.attributes ) );
    408                                 });
    409                                 self.pages[ type + ':' + object ] += 1;
     417                                        item = new api.Menus.AvailableItemCollection( item ); // @todo Why is this collection created and then thrown away?
     418                                        self.collection.add( item.models );
     419                                        typeInner = availableMenuItemContainer[type + ':' + object].find( '.accordion-section-content' );
     420                                        item.each(function( menuItem ) {
     421                                                typeInner.append( itemTemplate( menuItem.attributes ) );
     422                                        });
     423                                        self.pages[ type + ':' + object ] += 1;
     424
     425                                })
     426
    410427                        });
    411428                        request.fail(function( data ) {
    412429                                if ( typeof console !== 'undefined' && console.error ) {
     
    414431                                }
    415432                        });
    416433                        request.always(function() {
    417                                 availableMenuItemContainer.find( '.accordion-section-title' ).removeClass( 'loading' );
     434                                for (var key in availableMenuItemContainer ) {
     435                                        availableMenuItemContainer[key].find( '.accordion-section-title' ).removeClass( 'loading' );
     436                                }
    418437                                self.loading = false;
    419438                        });
    420439                },
  • src/wp-includes/class-wp-customize-nav-menus.php

     
    100100                        wp_die( -1 );
    101101                }
    102102
    103                 if ( empty( $_POST['type'] ) || empty( $_POST['object'] ) ) {
    104                         wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' );
    105                 }
     103                if ( empty( $_POST['itemTypes'] ) ) {
     104                        wp_send_json_error( 'nav_menus_missing_post_types_parameter' );
     105                } else {
     106                        $all_items = [];
     107                        foreach ( $_POST['itemTypes'] as $itemType ) {
    106108
    107                 $type = sanitize_key( $_POST['type'] );
    108                 $object = sanitize_key( $_POST['object'] );
    109                 $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );
    110                 $items = $this->load_available_items_query( $type, $object, $page );
     109                                if ( empty( $itemType['type'] ) || empty( $itemType['object'] ) ) {
     110                                        wp_send_json_error( 'nav_menus_missing_post_or_object_parameter' );
     111                                }
    111112
    112                 if ( is_wp_error( $items ) ) {
    113                         wp_send_json_error( $items->get_error_code() );
    114                 } else {
    115                         wp_send_json_success( array( 'items' => $items ) );
     113                                $type = sanitize_key( $itemType['type'] );
     114                                $object = sanitize_key( $itemType['object'] );
     115
     116                                $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );
     117                                $items = $this->load_available_items_query( $type, $object, $page );
     118                                if ( is_wp_error( $items ) ) {
     119                                        wp_send_json_error( $items->get_error_code() );
     120                                        wp_die( -1 );
     121                                }
     122                                $all_items[$itemType['type'] . ":" . $itemType['object']] = $items;
     123                        }
     124                        wp_send_json_success( array( 'items' => $all_items ) );
    116125                }
    117126        }
    118127