Make WordPress Core


Ignore:
Timestamp:
11/04/2016 06:03:51 AM (10 years ago)
Author:
westonruter
Message:

Customize: Combine Ajax requests for initial load of available nav menu items into a single request.

When there are many post types registered, prevent Ajax requests from piling up and slamming WordPress with concurrent requests.

Props curdin, westonruter.
Fixes #36697.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-customize-nav-menus.php

    r39038 r39137  
    101101                }
    102102
    103                 if ( empty( $_POST['type'] ) || empty( $_POST['object'] ) ) {
     103                $all_items = array();
     104                $item_types = array();
     105                if ( isset( $_POST['item_types'] ) && is_array( $_POST['item_types'] ) ) {
     106                        $item_types = wp_unslash( $_POST['item_types'] );
     107                } elseif ( isset( $_POST['type'] ) && isset( $_POST['object'] ) ) { // Back compat.
     108                        $item_types[] = array(
     109                                'type' => wp_unslash( $_POST['type'] ),
     110                                'object' => wp_unslash( $_POST['object'] ),
     111                                'page' => empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ),
     112                        );
     113                } else {
    104114                        wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' );
    105115                }
    106116
    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 );
    111 
    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 ) );
    116                 }
     117                foreach ( $item_types as $item_type ) {
     118                        if ( empty( $item_type['type'] ) || empty( $item_type['object'] ) ) {
     119                                wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' );
     120                        }
     121                        $type = sanitize_key( $item_type['type'] );
     122                        $object = sanitize_key( $item_type['object'] );
     123                        $page = empty( $item_type['page'] ) ? 0 : absint( $item_type['page'] );
     124                        $items = $this->load_available_items_query( $type, $object, $page );
     125                        if ( is_wp_error( $items ) ) {
     126                                wp_send_json_error( $items->get_error_code() );
     127                        }
     128                        $all_items[ $item_type['type'] . ':' . $item_type['object'] ] = $items;
     129                }
     130
     131                wp_send_json_success( array( 'items' => $all_items ) );
    117132        }
    118133
Note: See TracChangeset for help on using the changeset viewer.