Make WordPress Core

Ticket #33665: 33665.2.diff

File 33665.2.diff, 6.1 KB (added by westonruter, 10 years ago)

Additional change: https://github.com/xwp/wordpress-develop/commit/b8642aeb602c11430de9fed6f041e1e187709ce0

  • src/wp-admin/js/customize-nav-menus.js

    diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
    index 628ffa8..b4e7be5 100644
     
    12501250                                        return;
    12511251                                }
    12521252
    1253                                 var titleEl = control.container.find( '.menu-item-title' );
     1253                                var titleEl = control.container.find( '.menu-item-title' ),
     1254                                    titleText = item.title || api.Menus.data.l10n.untitled;
     1255
     1256                                if ( item._invalid ) {
     1257                                        titleText = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', titleText );
     1258                                }
    12541259
    12551260                                // Don't update to an empty title.
    12561261                                if ( item.title ) {
    12571262                                        titleEl
    1258                                                 .text( item.title )
     1263                                                .text( titleText )
    12591264                                                .removeClass( 'no-title' );
    12601265                                } else {
    12611266                                        titleEl
    1262                                                 .text( api.Menus.data.l10n.untitled )
     1267                                                .text( titleText )
    12631268                                                .addClass( 'no-title' );
    12641269                                }
    12651270                        } );
     
    13031308                                'menu-item-edit-inactive'
    13041309                        ];
    13051310
    1306                         if ( settingValue.invalid ) {
    1307                                 containerClasses.push( 'invalid' );
    1308                                 control.params.title = api.Menus.data.invalidTitleTpl.replace( '%s', control.params.title );
     1311                        if ( settingValue._invalid ) {
     1312                                containerClasses.push( 'menu-item-invalid' );
     1313                                control.params.title = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', control.params.title );
    13091314                        } else if ( 'draft' === settingValue.status ) {
    13101315                                containerClasses.push( 'pending' );
    13111316                                control.params.title = api.Menus.data.pendingTitleTpl.replace( '%s', control.params.title );
  • src/wp-includes/class-wp-customize-setting.php

    diff --git src/wp-includes/class-wp-customize-setting.php src/wp-includes/class-wp-customize-setting.php
    index 01b84c8..65fa2e2 100644
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    885885                'status'           => 'publish',
    886886                'original_title'   => '',
    887887                'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item().
    888                 // @todo also expose invalid?
     888                '_invalid'         => false,
    889889        );
    890890
    891891        /**
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    11441144                        }
    11451145                }
    11461146
     1147                if ( ! isset( $this->value['_invalid'] ) ) {
     1148                        $this->value['_invalid'] = (
     1149                                ( 'post_type' === $this->value['type'] && ! post_type_exists( $this->value['object'] ) )
     1150                                ||
     1151                                ( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) )
     1152                        );
     1153                }
     1154
    11471155                // Remove remaining properties available on a setup nav_menu_item post object which aren't relevant to the setting value.
    11481156                $irrelevant_properties = array(
    11491157                        'ID',
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    12461254                $should_remove = (
    12471255                        false === $this_item
    12481256                        ||
     1257                        true === $this_item['_invalid']
     1258                        ||
    12491259                        (
    12501260                                $this->original_nav_menu_term_id === $menu->term_id
    12511261                                &&
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    14171427                        'status'           => 'publish',
    14181428                        'original_title'   => '',
    14191429                        'nav_menu_term_id' => 0,
     1430                        '_invalid'         => false,
    14201431                );
    14211432                $menu_item_value = array_merge( $default, $menu_item_value );
    14221433                $menu_item_value = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) );
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    14491460                        $menu_item_value['status'] = 'publish';
    14501461                }
    14511462
     1463                $menu_item_value['_invalid'] = (bool) $menu_item_value['_invalid'];
     1464
    14521465                /** This filter is documented in wp-includes/class-wp-customize-setting.php */
    14531466                return apply_filters( "customize_sanitize_{$this->id}", $menu_item_value, $this );
    14541467        }
  • tests/phpunit/tests/customize/nav-menu-item-setting.php

    diff --git tests/phpunit/tests/customize/nav-menu-item-setting.php tests/phpunit/tests/customize/nav-menu-item-setting.php
    index ad2e7d2..367d947 100644
    class Test_WP_Customize_Nav_Menu_Item_Setting extends WP_UnitTestCase { 
    9292                        'status' => 'publish',
    9393                        'original_title' => '',
    9494                        'nav_menu_term_id' => 0,
     95                        '_invalid' => false,
    9596                );
    9697                $this->assertEquals( $default, $setting->default );
    9798
    class Test_WP_Customize_Nav_Menu_Item_Setting extends WP_UnitTestCase { 
    458459                        'status' => 'forbidden',
    459460                        'original_title' => 'Hi<script>alert(1)</script>',
    460461                        'nav_menu_term_id' => 'heilo',
     462                        '_invalid' => false,
    461463                );
    462464
    463465                $sanitized = $setting->sanitize( $unsanitized );
    class Test_WP_Customize_Nav_Menu_Item_Setting extends WP_UnitTestCase { 
    664666                $this->assertEquals( 'deleted', $update_result['status'] );
    665667        }
    666668
     669        /**
     670         * @ticket 33665
     671         */
     672        function test_invalid_nav_menu_item() {
     673                $menu_id = wp_create_nav_menu( 'Primary' );
     674                register_post_type( 'poem', array(
     675                        'public' => true,
     676                ) );
     677
     678                $post_id = self::factory()->post->create( array( 'post_type' => 'poem', 'post_title' => 'Code is poetry.' ) );
     679                $post = get_post( $post_id );
     680                $item_id = wp_update_nav_menu_item( $menu_id, 0, array(
     681                        'menu-item-type' => 'post_type',
     682                        'menu-item-object' => 'poem',
     683                        'menu-item-object-id' => $post_id,
     684                        'menu-item-title' => $post->post_title,
     685                        'menu-item-status' => 'publish',
     686                        'menu-item-position' => 1,
     687                ) );
     688                $setting_id = "nav_menu_item[$item_id]";
     689
     690                do_action( 'customize_register', $this->wp_customize );
     691                $setting = $this->wp_customize->get_setting( $setting_id );
     692                $this->assertNotEmpty( $setting );
     693                $value = $setting->value();
     694                $this->assertFalse( $value['_invalid'] );
     695                $value_object = $setting->value_as_wp_post_nav_menu_item();
     696                $this->assertFalse( $value_object->_invalid );
     697
     698                $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
     699                $value = $setting->value();
     700                $this->assertFalse( $value['_invalid'] );
     701                $value_object = $setting->value_as_wp_post_nav_menu_item();
     702                $this->assertFalse( $value_object->_invalid );
     703
     704                _unregister_post_type( 'poem' );
     705                $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
     706                $value = $setting->value();
     707                $this->assertTrue( $value['_invalid'] );
     708                $value_object = $setting->value_as_wp_post_nav_menu_item();
     709                $this->assertTrue( $value_object->_invalid );
     710        }
     711
    667712}