Make WordPress Core

Ticket #14134: 14134.5.diff

File 14134.5.diff, 3.4 KB (added by ericlewis, 9 years ago)
  • src/wp-admin/js/nav-menu.js

     
    4343
    4444                        this.attachQuickSearchListeners();
    4545                        this.attachThemeLocationsListeners();
     46                        this.attachMenuSaveSubmitListeners();
    4647
    4748                        this.attachTabsPanelListeners();
    4849
     
    834835                        });
    835836                },
    836837
     838                attachMenuSaveSubmitListeners : function() {
     839                        /*
     840                         * When a navigation menu is saved, store a JSON representation of all form data
     841                         * in a single input to avoid PHP `max_input_vars` limitations. See #14134.
     842                         */
     843                        $('#update-nav-menu').submit(function() {
     844                                var navMenuData = $('#update-nav-menu').serializeArray();
     845                                $('[name="nav-menu-data"]').val( JSON.stringify( navMenuData ) );
     846                        });
     847                },
     848
    837849                attachThemeLocationsListeners : function() {
    838850                        var loc = $('#nav-menu-theme-locations'), params = {};
    839851                        params.action = 'menu-locations-save';
  • src/wp-admin/nav-menus.php

     
    4949// Allowed actions: add, update, delete
    5050$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';
    5151
     52/*
     53 * If a JSON blob of navigation menu data is found, expand it and inject it
     54 * into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
     55 */
     56if ( isset( $_POST['nav-menu-data'] ) ) {
     57        $data = json_decode( stripslashes( $_POST['nav-menu-data'] ) );
     58        if ( ! is_null( $data ) && $data ) {
     59                foreach ( $data as $post_input_data ) {
     60                        // For input names that are arrays (e.g. `menu-item-db-id[3]`), derive the array path keys via regex.
     61                        if ( preg_match( '#(.*)(?:\[(\d+)\])#', $post_input_data->name, $matches ) ) {
     62                                if ( empty( $_POST[$matches[1]] ) ) {
     63                                        $_POST[$matches[1]] = array();
     64                                }
     65                                $_POST[$matches[1]][(int)$matches[2]] = $post_input_data->value;
     66                        } else {
     67                                $_POST[$post_input_data->name] = $post_input_data->value;
     68                        }
     69                }
     70        }
     71}
    5272switch ( $action ) {
    5373        case 'add-menu-item':
    5474                check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );
     
    731751                <div id="menu-management">
    732752                        <form id="update-nav-menu" method="post" enctype="multipart/form-data">
    733753                                <div class="menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>">
     754                                        <input type="hidden" name="nav-menu-data">
    734755                                        <?php
    735756                                        wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
    736757                                        wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
  • src/wp-includes/script-loader.php

     
    642642                ) );
    643643
    644644                // Navigation Menus
    645                 $scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-lists', 'postbox' ) );
     645                $scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-lists', 'postbox', 'json2' ) );
    646646                did_action( 'init' ) && $scripts->localize( 'nav-menu', 'navMenuL10n', array(
    647647                        'noResultsFound' => __( 'No results found.' ),
    648648                        'warnDeleteMenu' => __( "You are about to permanently delete this menu. \n 'Cancel' to stop, 'OK' to delete." ),