Make WordPress Core


Ignore:
Timestamp:
11/04/2016 06:03:51 AM (7 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.