diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index b59a30ad22b03..7fc107447056f 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -1438,6 +1438,8 @@ function get_preview_post_link( $post = null, $query_args = array(), $preview_li * pages, posts, attachments, revisions, global styles, templates, and template parts. * * @since 2.3.0 + * @since 6.3.0 Adds custom link for wp_navigation post types. + * Adds custom links for wp_template_part and wp_template post types. * * @param int|WP_Post $post Optional. Post ID or post object. Default is the global `$post`. * @param string $context Optional. How to output the '&' character. Default '&'. @@ -1474,6 +1476,8 @@ function get_edit_post_link( $post = 0, $context = 'display' ) { if ( 'wp_template' === $post->post_type || 'wp_template_part' === $post->post_type ) { $slug = urlencode( get_stylesheet() . '//' . $post->post_name ); $link = admin_url( sprintf( $post_type_object->_edit_link, $post->post_type, $slug ) ); + } elseif ( 'wp_navigation' === $post->post_type ) { + $link = admin_url( sprintf( $post_type_object->_edit_link, (string) $post->ID ) ); } elseif ( $post_type_object->_edit_link ) { $link = admin_url( sprintf( $post_type_object->_edit_link . $action, $post->ID ) ); } diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index abf94bcbe5aa9..d6ab4db603a89 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -491,6 +491,14 @@ function create_initial_post_types() { ) ); + $navigation_post_edit_link = 'site-editor.php?' . build_query( + array( + 'postId' => '%s', + 'postType' => 'wp_navigation', + 'canvas' => 'edit', + ) + ); + register_post_type( 'wp_navigation', array( @@ -517,6 +525,7 @@ function create_initial_post_types() { 'description' => __( 'Navigation menus that can be inserted into your site.' ), 'public' => false, '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + '_edit_link' => $navigation_post_edit_link, /* internal use only. don't use this when registering your own post type. */ 'has_archive' => false, 'show_ui' => true, 'show_in_menu' => false, diff --git a/tests/phpunit/tests/link/getEditPostLink.php b/tests/phpunit/tests/link/getEditPostLink.php index 4236e7a335acf..2a17e69f75ebb 100644 --- a/tests/phpunit/tests/link/getEditPostLink.php +++ b/tests/phpunit/tests/link/getEditPostLink.php @@ -131,4 +131,29 @@ public function test_get_edit_post_link_for_wp_template_part_post_type() { $this->assertSame( $link_default_context, get_edit_post_link( $template_part_post ), 'Second argument `$context` has a default context of `"display"`.' ); $this->assertSame( $link_custom_context, get_edit_post_link( $template_part_post, 'something-else' ), 'Pass non-default value in second argument.' ); } + + /** + * Tests getting the edit post link for a wp_navigation post type. + * + * @ticket 58589 + * */ + public function test_get_edit_post_link_for_wp_navigation_post_type() { + $navigation_post = self::factory()->post->create_and_get( + array( + 'post_type' => 'wp_navigation', + 'post_name' => 'my_navigation', + 'post_title' => 'My Navigation', + 'post_content' => '', + 'post_excerpt' => 'Description of my Navigation', + ) + ); + + $post_type_object = get_post_type_object( $navigation_post->post_type ); + + $link_default_context = admin_url( sprintf( $post_type_object->_edit_link, $navigation_post->ID ) ); + $link_custom_context = admin_url( sprintf( $post_type_object->_edit_link, $navigation_post->ID ) ); + + $this->assertSame( $link_default_context, get_edit_post_link( $navigation_post ), 'Second argument `$context` has a default context of `"display"`.' ); + $this->assertSame( $link_custom_context, get_edit_post_link( $navigation_post, 'something-else' ), 'Pass non-default value in second argument.' ); + } }