Menus: Allow larger menus to be created in the Edit Menu screen.
In the Edit Menu screen, each menu item creates 11 form input elements. In menus with more than 71 menu items, often items after the 71st weren't saved. This was because PHP's runtime configuration `max_input_vars` default value is 1000. Large menus exceed this, so PHP didn't populate the `$_POST` superglobal for the latter menu items. The entire form is now JSON-encoded into a single input which populates `$_POST` manually on form submission. See #14134. Built from https://develop.svn.wordpress.org/trunk@36506 git-svn-id: http://core.svn.wordpress.org/trunk@36473 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
cbe5fc6fb8
commit
48fdbf96de
|
@ -43,6 +43,7 @@ var wpNavMenu;
|
|||
|
||||
this.attachQuickSearchListeners();
|
||||
this.attachThemeLocationsListeners();
|
||||
this.attachMenuSaveSubmitListeners();
|
||||
|
||||
this.attachTabsPanelListeners();
|
||||
|
||||
|
@ -834,6 +835,30 @@ var wpNavMenu;
|
|||
});
|
||||
},
|
||||
|
||||
attachMenuSaveSubmitListeners : function() {
|
||||
/*
|
||||
* When a navigation menu is saved, store a JSON representation of all form data
|
||||
* in a single input to avoid PHP `max_input_vars` limitations. See #14134.
|
||||
*/
|
||||
$('#update-nav-menu').submit(function() {
|
||||
var navMenuData = {};
|
||||
$('#update-nav-menu input').each(function(index, element) {
|
||||
var name = $(element).attr('name');
|
||||
var regex = /(.*)(?:\[(\d+)\])/;
|
||||
if ( regex.test( name ) ) {
|
||||
var matches = regex.exec(name);
|
||||
if ( ! navMenuData[matches[1]] ) {
|
||||
navMenuData[matches[1]] = [];
|
||||
}
|
||||
navMenuData[matches[1]][matches[2]] = $(element).val();
|
||||
} else {
|
||||
navMenuData[name] = $(element).val();
|
||||
}
|
||||
});
|
||||
$('[name="nav-menu-data"]').val( JSON.stringify( navMenuData ) );
|
||||
});
|
||||
},
|
||||
|
||||
attachThemeLocationsListeners : function() {
|
||||
var loc = $('#nav-menu-theme-locations'), params = {};
|
||||
params.action = 'menu-locations-save';
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -49,6 +49,19 @@ $num_locations = count( array_keys( $locations ) );
|
|||
// Allowed actions: add, update, delete
|
||||
$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';
|
||||
|
||||
/*
|
||||
* If a JSON blob of navigation menu data is found, expand it and inject it
|
||||
* into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
|
||||
*/
|
||||
if ( isset( $_POST['nav-menu-data'] ) ) {
|
||||
$data = json_decode( stripslashes( $_POST['nav-menu-data'] ) );
|
||||
if ( ! is_null( $data ) && $data ) {
|
||||
foreach ( $data as $post_var => $post_data ) {
|
||||
$_POST[$post_var] = $post_data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch ( $action ) {
|
||||
case 'add-menu-item':
|
||||
check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );
|
||||
|
@ -731,6 +744,7 @@ require_once( ABSPATH . 'wp-admin/admin-header.php' );
|
|||
<div id="menu-management">
|
||||
<form id="update-nav-menu" method="post" enctype="multipart/form-data">
|
||||
<div class="menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>">
|
||||
<input type="hidden" name="nav-menu-data">
|
||||
<?php
|
||||
wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
|
||||
wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* @global string $wp_version
|
||||
*/
|
||||
$wp_version = '4.5-alpha-36505';
|
||||
$wp_version = '4.5-alpha-36506';
|
||||
|
||||
/**
|
||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||
|
|
Loading…
Reference in New Issue