Make WordPress Core

Ticket #41502: 41502.diff

File 41502.diff, 3.9 KB (added by dd32, 7 years ago)
  • src/wp-admin/includes/nav-menu.php

    function wp_nav_menu_update_menu_items(  
    12231223 * If a JSON blob of navigation menu data is in POST data, expand it and inject
    12241224 * it into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134.
    12251225 *
    12261226 * @ignore
    12271227 * @since 4.5.3
    12281228 * @access private
    12291229 */
    12301230function _wp_expand_nav_menu_post_data() {
    12311231        if ( ! isset( $_POST['nav-menu-data'] ) ) {
    12321232                return;
    12331233        }
    12341234
    12351235        $data = json_decode( stripslashes( $_POST['nav-menu-data'] ) );
    12361236
    12371237        if ( ! is_null( $data ) && $data ) {
     1238                $seen_empty_data_keys = array();
    12381239                foreach ( $data as $post_input_data ) {
    12391240                        // For input names that are arrays (e.g. `menu-item-db-id[3][4][5]`),
    12401241                        // derive the array path keys via regex and set the value in $_POST.
    1241                         preg_match( '#([^\[]*)(\[(.+)\])?#', $post_input_data->name, $matches );
     1242                        preg_match( '#([^\[]*)(\[(.*)\])?#', $post_input_data->name, $matches );
    12421243
    12431244                        $array_bits = array( $matches[1] );
    12441245
    1245                         if ( isset( $matches[3] ) ) {
     1246                        if ( !empty( $matches[3] ) ) {
     1247                                // $name[..]
    12461248                                $array_bits = array_merge( $array_bits, explode( '][', $matches[3] ) );
     1249                        } elseif ( isset( $matches[2] ) ) {
     1250                                // $name[]
     1251                                if ( ! isset( $seen_empty_data_keys[ $matches[1] ] ) ) {
     1252                                        $seen_empty_data_keys[ $matches[1] ] = 0;
     1253                                }
     1254
     1255                                $array_bits[] = $seen_empty_data_keys[ $matches[1] ]++;
    12471256                        }
    12481257
    12491258                        $new_post_data = array();
    12501259
    12511260                        // Build the new array value from leaf to trunk.
    12521261                        for ( $i = count( $array_bits ) - 1; $i >= 0; $i -- ) {
    12531262                                if ( $i == count( $array_bits ) - 1 ) {
    12541263                                        $new_post_data[ $array_bits[ $i ] ] = wp_slash( $post_input_data->value );
    12551264                                } else {
    12561265                                        $new_post_data = array( $array_bits[ $i ] => $new_post_data );
    12571266                                }
    12581267                        }
    12591268
    12601269                        $_POST = array_replace_recursive( $_POST, $new_post_data );
    12611270                }
  • tests/phpunit/tests/menu/wpExpandNavMenuPostData.php

    class Tests_Menu_WpExpandNavMenuPostData 
    1616                $data[0]                = new StdClass;
    1717                $data[0]->name          = 'yesorno';
    1818                $data[0]->value         = 'yes';
    1919                $_POST['nav-menu-data'] = addslashes( json_encode( $data ) );
    2020
    2121                _wp_expand_nav_menu_post_data();
    2222
    2323                $expected = array(
    2424                        'nav-menu-data' => $_POST['nav-menu-data'],
    2525                        'yesorno'       => 'yes',
    2626                );
    2727
    2828                $this->assertEquals( $expected, $_POST );
    2929        }
    3030
     31        /**
     32         * @ticket 41502
     33         */
     34        public function test_ungrouped_data_should_expand() {
     35                include_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
     36
     37                if ( empty( $_POST ) ) {
     38                        $_POST = array();
     39                }
     40
     41                $data                   = array();
     42                $data[0]                = new StdClass;
     43                $data[0]->name          = 'yesorno[]';
     44                $data[0]->value         = 'yes';
     45                $data[1]                = new StdClass;
     46                $data[1]->name          = 'yesorno[]';
     47                $data[1]->value         = 'maybe';
     48                $_POST['nav-menu-data'] = addslashes( json_encode( $data ) );
     49
     50                _wp_expand_nav_menu_post_data();
     51
     52                $expected = array(
     53                        'nav-menu-data' => $_POST['nav-menu-data'],
     54                        'yesorno'       => array(
     55                                'yes',
     56                                'maybe'
     57                        ),
     58                );
     59
     60                $this->assertEquals( $expected, $_POST );
     61        }
     62
    3163        public function test_multidimensional_nested_array_should_expand() {
    3264                include_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
    3365
    3466                if ( empty( $_POST ) ) {
    3567                        $_POST = array();
    3668                }
    3769
    3870                $data                   = array();
    3971                $data[0]                = new StdClass;
    4072                $data[0]->name          = 'would[1][do][the][trick]';
    4173                $data[0]->value         = 'yes';
    4274                $_POST['nav-menu-data'] = addslashes( json_encode( $data ) );
    4375
    4476                _wp_expand_nav_menu_post_data();
    4577