From e534c73c34cddbd1331bc0bbdbed9581fe9107e9 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Sun, 27 Nov 2016 03:19:32 +0000 Subject: [PATCH] Customize: Fix logic for previewing the URL for `nav_menu_item` settings for terms and post type archives. Fixes typo in args passed to `get_term_link()` which caused a fatal error due to this call returning a `WP_Error` which was set to `url`. Also fixes never-satisfiable condition for obtaining post type archive URL. Also ensures that `WP_Error` never leaks through as `url` by setting it to an empty string. Adds missing unit tests. Amends [38991]. See #38114. Fixes #38945 for 4.7. git-svn-id: https://develop.svn.wordpress.org/branches/4.7@39366 602fd350-edb4-49c9-b593-d223f7449a82 --- ...ass-wp-customize-nav-menu-item-setting.php | 17 +++--- .../tests/customize/nav-menu-item-setting.php | 61 +++++++++++++++++++ 2 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php b/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php index 8bffb0ee2a..802d67e9c4 100644 --- a/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php +++ b/src/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php @@ -604,14 +604,15 @@ class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { } // Ensure nav menu item URL is set according to linked object. - if ( ! empty( $post->object_id ) ) { - if ( 'post_type' === $post->type ) { - $post->url = get_permalink( $post->object_id ); - } elseif ( 'post_type_archive' === $post->type && ! empty( $post->object ) ) { - $post->url = get_post_type_archive_link( $post->object ); - } elseif ( 'taxonomy' == $post->type && ! empty( $post->object ) ) { - $post->url = get_term_link( (int) $post->object, $post->object ); - } + if ( 'post_type' === $post->type && ! empty( $post->object_id ) ) { + $post->url = get_permalink( $post->object_id ); + } elseif ( 'taxonomy' === $post->type && ! empty( $post->object ) && ! empty( $post->object_id ) ) { + $post->url = get_term_link( (int) $post->object_id, $post->object ); + } elseif ( 'post_type_archive' === $post->type && ! empty( $post->object ) ) { + $post->url = get_post_type_archive_link( $post->object ); + } + if ( is_wp_error( $post->url ) ) { + $post->url = ''; } /** This filter is documented in wp-includes/nav-menu.php */ diff --git a/tests/phpunit/tests/customize/nav-menu-item-setting.php b/tests/phpunit/tests/customize/nav-menu-item-setting.php index ebb9748fa3..45aefb97a2 100644 --- a/tests/phpunit/tests/customize/nav-menu-item-setting.php +++ b/tests/phpunit/tests/customize/nav-menu-item-setting.php @@ -833,6 +833,67 @@ class Test_WP_Customize_Nav_Menu_Item_Setting extends WP_UnitTestCase { $this->assertEquals( 'Attempted \o/ o’o markup', $nav_menu_item->description ); } + /** + * Test WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() to set url for posts, terms, and post type archives. + * + * @ticket 38945 + * @covers WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() + */ + function test_value_as_wp_post_nav_menu_item_term_urls() { + $term_id = self::factory()->term->create( array( 'taxonomy' => 'category' ) ); + register_post_type( 'press_release', array( + 'has_archive' => true, + ) ); + $post_id = self::factory()->post->create( array( 'post_type' => 'press_release' ) ); + + // Term. + $setting = new WP_Customize_Nav_Menu_Item_Setting( + $this->wp_customize, + 'nav_menu_item[-1]' + ); + $this->wp_customize->set_post_value( $setting->id, array( + 'type' => 'taxonomy', + 'object' => 'category', + 'object_id' => $term_id, + 'title' => 'Category', + 'url' => '', + ) ); + $setting->preview(); + $nav_menu_item = $setting->value_as_wp_post_nav_menu_item(); + $this->assertEquals( get_term_link( $term_id ), $nav_menu_item->url ); + + // Post. + $setting = new WP_Customize_Nav_Menu_Item_Setting( + $this->wp_customize, + 'nav_menu_item[-2]' + ); + $this->wp_customize->set_post_value( $setting->id, array( + 'type' => 'post_type', + 'object' => 'press_release', + 'object_id' => $post_id, + 'title' => 'PR', + 'url' => '', + ) ); + $setting->preview(); + $nav_menu_item = $setting->value_as_wp_post_nav_menu_item(); + $this->assertEquals( get_permalink( $post_id ), $nav_menu_item->url ); + + // Post type archive. + $setting = new WP_Customize_Nav_Menu_Item_Setting( + $this->wp_customize, + 'nav_menu_item[-3]' + ); + $this->wp_customize->set_post_value( $setting->id, array( + 'type' => 'post_type_archive', + 'object' => 'press_release', + 'title' => 'PR', + 'url' => '', + ) ); + $setting->preview(); + $nav_menu_item = $setting->value_as_wp_post_nav_menu_item(); + $this->assertEquals( get_post_type_archive_link( 'press_release' ), $nav_menu_item->url ); + } + /** * Test WP_Customize_Nav_Menu_Item_Setting::value_as_wp_post_nav_menu_item() where title is empty. *