Make WordPress Core

Changeset 35302


Ignore:
Timestamp:
10/20/2015 07:07:58 PM (9 years ago)
Author:
westonruter
Message:

Customizer: Implement indicators for invalid nav menu items.

The same indicator on the nav menus admin page is now present for nav menu items in the Customizer. When a menu item is present for a post type that is no longer registered, the menu item will appear with the indicator.

Props kucrut, westonruter.
Fixes #33665.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/js/customize-nav-menus.js

    r34834 r35302  
    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                }
     
    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' );
  • trunk/src/wp-includes/class-wp-customize-setting.php

    r35007 r35302  
    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
     
    11431143                $this->value[ $key ] = intval( $this->value[ $key ] );
    11441144            }
     1145        }
     1146
     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            );
    11451153        }
    11461154
     
    12471255            false === $this_item
    12481256            ||
     1257            true === $this_item['_invalid']
     1258            ||
    12491259            (
    12501260                $this->original_nav_menu_term_id === $menu->term_id
     
    14181428            'original_title'   => '',
    14191429            'nav_menu_term_id' => 0,
     1430            '_invalid'         => false,
    14201431        );
    14211432        $menu_item_value = array_merge( $default, $menu_item_value );
     
    14491460            $menu_item_value['status'] = 'publish';
    14501461        }
     1462
     1463        $menu_item_value['_invalid'] = (bool) $menu_item_value['_invalid'];
    14511464
    14521465        /** This filter is documented in wp-includes/class-wp-customize-setting.php */
  • trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php

    r35242 r35302  
    9393            'original_title' => '',
    9494            'nav_menu_term_id' => 0,
     95            '_invalid' => false,
    9596        );
    9697        $this->assertEquals( $default, $setting->default );
     
    459460            'original_title' => 'Hi<script>alert(1)</script>',
    460461            'nav_menu_term_id' => 'heilo',
     462            '_invalid' => false,
    461463        );
    462464
     
    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}
Note: See TracChangeset for help on using the changeset viewer.