WordPress.org

Make WordPress Core

Changeset 38618


Ignore:
Timestamp:
09/17/2016 09:49:49 PM (22 months ago)
Author:
westonruter
Message:

Customize: Ensure nav menu items lacking a label use the title from the original object.

Use original title as placeholder for label and in control title. Prevent original title from overriding empty label in initial setting values.

Fixes #38015.

Location:
trunk
Files:
5 edited

Legend:

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

    r38436 r38618  
    13981398
    13991399                var titleEl = control.container.find( '.menu-item-title' ),
    1400                     titleText = item.title || api.Menus.data.l10n.untitled;
     1400                    titleText = item.title || item.original_title || api.Menus.data.l10n.untitled;
    14011401
    14021402                if ( item._invalid ) {
     
    14051405
    14061406                // Don't update to an empty title.
    1407                 if ( item.title ) {
     1407                if ( item.title || item.original_title ) {
    14081408                    titleEl
    14091409                        .text( titleText )
  • trunk/src/wp-includes/class-wp-customize-nav-menus.php

    r38479 r38618  
    588588
    589589                $value = (array) $item;
     590                if ( empty( $value['post_title'] ) ) {
     591                    $value['title'] = '';
     592                }
     593
    590594                $value['nav_menu_term_id'] = $menu_id;
    591595                $this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array(
  • trunk/src/wp-includes/customize/class-wp-customize-nav-menu-item-control.php

    r37153 r38618  
    7070                <span class="item-title" aria-hidden="true">
    7171                    <span class="spinner"></span>
    72                     <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span>
     72                    <span class="menu-item-title<# if ( ! data.title && ! data.original_title ) { #> no-title<# } #>">{{ data.title || data.original_title || wp.customize.Menus.data.l10n.untitled }}</span>
    7373                </span>
    7474                <span class="item-controls">
     
    9797                <label for="edit-menu-item-title-{{ data.menu_item_id }}">
    9898                    <?php _e( 'Navigation Label' ); ?><br />
    99                     <input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" class="widefat edit-menu-item-title" name="menu-item-title" />
     99                    <input type="text" id="edit-menu-item-title-{{ data.menu_item_id }}" placeholder="{{ data.original_title }}" class="widefat edit-menu-item-title" name="menu-item-title" />
    100100                </label>
    101101            </p>
  • trunk/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php

    r37539 r38618  
    234234                $value = $post_value;
    235235            }
    236         } else if ( isset( $this->value ) ) {
     236        } elseif ( isset( $this->value ) ) {
    237237            $value = $this->value;
    238238        } else {
     
    243243                $post = get_post( $this->post_id );
    244244                if ( $post && self::POST_TYPE === $post->post_type ) {
     245                    $is_title_empty = empty( $post->post_title );
    245246                    $value = (array) wp_setup_nav_menu_item( $post );
     247                    if ( $is_title_empty ) {
     248                        $value['title'] = '';
     249                    }
    246250                }
    247251            }
     
    261265
    262266    /**
     267     * Get original title.
     268     *
     269     * @since 4.7.0
     270     *
     271     * @param object $item Nav menu item.
     272     * @return string The original title.
     273     */
     274    protected function get_original_title( $item ) {
     275        if ( empty( $item->object_id ) ) {
     276            return '';
     277        }
     278        $original_title = '';
     279        if ( 'post_type' === $item->type ) {
     280            $original_object = get_post( $item->object_id );
     281            if ( $original_object ) {
     282                /** This filter is documented in wp-includes/post-template.php */
     283                $original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID );
     284
     285                if ( '' === $original_title ) {
     286                    /* translators: %d: ID of a post */
     287                    $original_title = sprintf( __( '#%d (no title)' ), $original_object->ID );
     288                }
     289            }
     290        } elseif ( 'taxonomy' === $item->type ) {
     291            $original_term_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
     292            if ( ! is_wp_error( $original_term_title ) ) {
     293                $original_title = $original_term_title;
     294            }
     295        }
     296        $original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) );
     297        return $original_title;
     298    }
     299
     300    /**
    263301     * Ensure that the value is fully populated with the necessary properties.
    264302     *
     
    285323
    286324        if ( ! isset( $this->value['original_title'] ) ) {
    287             $original_title = '';
    288             if ( 'post_type' === $this->value['type'] ) {
    289                 $original_title = get_the_title( $this->value['object_id'] );
    290             } elseif ( 'taxonomy' === $this->value['type'] ) {
    291                 $original_title = get_term_field( 'name', $this->value['object_id'], $this->value['object'], 'raw' );
    292                 if ( is_wp_error( $original_title ) ) {
    293                     $original_title = '';
    294                 }
    295             }
    296             $this->value['original_title'] = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) );
     325            $this->value['original_title'] = $this->get_original_title( (object) $this->value );
    297326        }
    298327
     
    535564        unset( $item->position );
    536565
     566        if ( empty( $item->original_title ) ) {
     567            $item->original_title = $this->get_original_title( $item );
     568        }
     569        if ( empty( $item->title ) && ! empty( $item->original_title ) ) {
     570            $item->title = $item->original_title;
     571        }
    537572        if ( $item->title ) {
    538573            $item->post_title = $item->title;
     
    555590                    $post->type_label = $post->object;
    556591                }
    557             } elseif ( 'taxonomy' == $post->type ) {
     592            } elseif ( 'taxonomy' === $post->type ) {
    558593                $object = get_taxonomy( $post->object );
    559594                if ( $object ) {
  • trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php

    r37405 r38618  
    186186
    187187    /**
     188     * Test value method with post without nav menu item title (label).
     189     *
     190     * @see WP_Customize_Nav_Menu_Item_Setting::value()
     191     */
     192    function test_value_type_post_type_without_label() {
     193        do_action( 'customize_register', $this->wp_customize );
     194
     195        $original_title = 'Hello World';
     196        $post_id = self::factory()->post->create( array( 'post_title' => $original_title ) );
     197
     198        $menu_id = wp_create_nav_menu( 'Menu' );
     199        $item_id = wp_update_nav_menu_item( $menu_id, 0, array(
     200            'menu-item-type' => 'post_type',
     201            'menu-item-object' => 'post',
     202            'menu-item-object-id' => $post_id,
     203            'menu-item-title' => '',
     204            'menu-item-status' => 'publish',
     205        ) );
     206
     207        $setting_id = "nav_menu_item[$item_id]";
     208        $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
     209
     210        $value = $setting->value();
     211        $this->assertEquals( '', $value['title'] );
     212        $this->assertEquals( $original_title, $value['original_title'] );
     213    }
     214
     215    /**
    188216     * Test value method with taxonomy.
    189217     *
     
    805833        $this->assertEquals( 'Attempted \o/ o&#8217;o markup', $nav_menu_item->description );
    806834    }
     835
     836    /**
     837     * Test WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() where title is empty.
     838     *
     839     * @ticket 38015
     840     * @see WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item()
     841     */
     842    function test_value_as_wp_post_nav_menu_item_with_empty_title() {
     843        $original_title = 'The Original Title';
     844        $post_id = self::factory()->post->create( array( 'post_title' => $original_title ) );
     845
     846        $setting = new WP_Customize_Nav_Menu_Item_Setting(
     847            $this->wp_customize,
     848            'nav_menu_item[123]'
     849        );
     850
     851        $post_value = array_merge(
     852            $setting->default,
     853            array(
     854                'object_id'        => $post_id,
     855                'object'           => 'post',
     856                'type'             => 'post_type',
     857                'status'           => 'publish',
     858                'nav_menu_term_id' => 0,
     859            )
     860        );
     861        $this->wp_customize->set_post_value( $setting->id, $post_value );
     862
     863        $setting->preview();
     864
     865        $nav_menu_item = $setting->value_as_wp_post_nav_menu_item();
     866        $this->assertEquals( $original_title, $nav_menu_item->title );
     867    }
    807868}
Note: See TracChangeset for help on using the changeset viewer.