WordPress.org

Make WordPress Core

Ticket #14134: 14134.2.diff

File 14134.2.diff, 2.6 KB (added by ericlewis, 5 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 = {};
     845                                $('#update-nav-menu input').each(function(index, element) {
     846                                        var name = $(element).attr('name');
     847                                        var regex = /(.*)(?:\[(\d+)\])/;
     848                                        if ( regex.test( name ) ) {
     849                                                var matches = regex.exec(name);
     850                                                if ( ! navMenuData[matches[1]] ) {
     851                                                        navMenuData[matches[1]] = [];
     852                                                }
     853                                                navMenuData[matches[1]][matches[2]] = $(element).val();
     854                                        } else {
     855                                                navMenuData[name] = $(element).val();
     856                                        }
     857                                });
     858                                $('[name="nav-menu-data"]').val( JSON.stringify( navMenuData ) );
     859                        });
     860                },
     861
    837862                attachThemeLocationsListeners : function() {
    838863                        var loc = $('#nav-menu-theme-locations'), params = {};
    839864                        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 fill PHP $_POST
     54 * vars 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_var => $post_data ) {
     60                        $_POST[$post_var] = $post_data;
     61                }
     62        }
     63}
    5264switch ( $action ) {
    5365        case 'add-menu-item':
    5466                check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );
     
    731743                <div id="menu-management">
    732744                        <form id="update-nav-menu" method="post" enctype="multipart/form-data">
    733745                                <div class="menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>">
     746                                        <input type="hidden" name="nav-menu-data">
    734747                                        <?php
    735748                                        wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
    736749                                        wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );