WordPress.org

Make WordPress Core

Ticket #36697: 36697.4.diff

File 36697.4.diff, 6.1 KB (added by westonruter, 3 years ago)

https://github.com/xwp/wordpress-develop/pull/189

  • 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 58af669..c323735 100644
     
    360360                        // Render the template for each item by type.
    361361                        _.each( api.Menus.data.itemTypes, function( itemType ) {
    362362                                self.pages[ itemType.type + ':' + itemType.object ] = 0;
    363                                 self.loadItems( itemType.type, itemType.object ); // @todo we need to combine these Ajax requests.
    364363                        } );
     364                        self.loadItems( api.Menus.data.itemTypes, self.pages.menu || 0 );
    365365                },
    366366
    367367                // Load available menu items.
    368                 loadItems: function( type, object ) {
    369                         var self = this, params, request, itemTemplate, availableMenuItemContainer;
     368                loadItems: function( itemTypes, page ) {
     369                        var self = this, params, request, itemTemplate, availableMenuItemContainers = {};
    370370                        itemTemplate = wp.template( 'available-menu-item' );
     371                        _.each( itemTypes, function( itemType, index ) {
     372                                var type, object, container;
     373                                type = itemType.type;
     374                                object = itemType.object;
    371375
    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' );
     376                                if ( -1 === self.pages[ type + ':' + object ] ) {
     377                                        itemTypes.splice( index );
     378                                } else {
     379                                        container = $( '#available-menu-items-' + type + '-' + object );
     380                                        container.find( '.accordion-section-title' ).addClass( 'loading' );
     381                                        availableMenuItemContainers[ type + ':' + object ] = container;
     382                                }
     383
     384                        } );
    377385                        self.loading = true;
    378386                        params = {
    379387                                'customize-menus-nonce': api.settings.nonce['customize-menus'],
    380388                                'wp_customize': 'on',
    381                                 'type': type,
    382                                 'object': object,
    383                                 'page': self.pages[ type + ':' + object ]
     389                                'item_types': itemTypes,
     390                                'page': page
    384391                        };
    385392                        request = wp.ajax.post( 'load-available-menu-items-customizer', params );
    386393
    387394                        request.done(function( data ) {
    388395                                var items, typeInner;
    389396                                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 );
     397
     398                                _.each( items, function( item, name ) {
     399                                        if ( 0 === items.length ) {
     400                                                if ( 0 === self.pages[ name ] ) {
     401                                                        availableMenuItemContainers[ name ].find( '.accordion-section-title' )
     402                                                                .addClass( 'cannot-expand' )
     403                                                                .removeClass( 'loading' )
     404                                                                .find( '.accordion-section-title > button' )
     405                                                                .prop( 'tabIndex', -1 );
     406                                                }
     407                                                self.pages[ name ] = -1;
     408                                                return;
     409                                        } else if ( ( 'post_type:page' === name ) && ( ! availableMenuItemContainers[ name ].hasClass( 'open' ) ) ) {
     410                                                availableMenuItemContainers[ name ].find( '.accordion-section-title > button' ).click();
    397411                                        }
    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 ) );
     412                                        item = new api.Menus.AvailableItemCollection( item ); // @todo Why is this collection created and then thrown away?
     413                                        self.collection.add( item.models );
     414                                        typeInner = availableMenuItemContainers[ name ].find( '.available-menu-items-list' );
     415                                        item.each( function( menuItem ) {
     416                                                typeInner.append( itemTemplate( menuItem.attributes ) );
     417                                        } );
     418                                        self.pages[ name ] += 1;
    408419                                });
    409                                 self.pages[ type + ':' + object ] += 1;
    410420                        });
    411421                        request.fail(function( data ) {
    412422                                if ( typeof console !== 'undefined' && console.error ) {
     
    414424                                }
    415425                        });
    416426                        request.always(function() {
    417                                 availableMenuItemContainer.find( '.accordion-section-title' ).removeClass( 'loading' );
     427                                _.each( availableMenuItemContainers, function( container ) {
     428                                        container.find( '.accordion-section-title' ).removeClass( 'loading' );
     429                                } );
    418430                                self.loading = false;
    419431                        });
    420432                },
  • 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 ec60c2f..172c2bd 100644
    final class WP_Customize_Nav_Menus { 
    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['item_types'] ) ) {
     104                        wp_send_json_error( 'nav_menus_missing_post_types_parameter' );
     105                } else {
     106                        $all_items = [];
     107                        foreach ( $_POST['item_types'] as $item_types ) {
    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( $item_types['type'] ) || empty( $item_types['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( $item_types['type'] );
     114                                $object = sanitize_key( $item_types['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[ $item_types['type'] . ":" . $item_types['object'] ] = $items;
     123                        }
     124                        wp_send_json_success( array( 'items' => $all_items ) );
    116125                }
    117126        }
    118127