From 4983de5aba88c3f152499744d7681d1909cc2e1c Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Wed, 29 Nov 2023 15:32:04 +0800 Subject: [PATCH 1/4] Fix fatal error when using a navigation block fallback that returns an empty result --- .../wordpress-6.5/class-wp-navigation-block-renderer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php b/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php index 52ec4f508246a..1aa7951b03f4a 100644 --- a/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php +++ b/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php @@ -185,7 +185,7 @@ private static function get_inner_blocks_html( $attributes, $inner_blocks ) { private static function get_inner_blocks_from_navigation_post( $attributes ) { $navigation_post = get_post( $attributes['ref'] ); if ( ! isset( $navigation_post ) ) { - return ''; + return array(); } // Only published posts are valid. If this is changed then a corresponding change @@ -214,7 +214,7 @@ private static function get_inner_blocks_from_fallback( $attributes ) { // Fallback my have been filtered so do basic test for validity. if ( empty( $fallback_blocks ) || ! is_array( $fallback_blocks ) ) { - return ''; + return array(); } return new WP_Block_List( $fallback_blocks, $attributes ); From 843d4340aa864a1e5e653a409ebafb9a890d9894 Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Wed, 29 Nov 2023 15:39:34 +0800 Subject: [PATCH 2/4] Fix get_inner_blocks_from_unstable_location function --- packages/block-library/src/navigation/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/block-library/src/navigation/index.php b/packages/block-library/src/navigation/index.php index 6550d896656b1..46a881b7050ba 100644 --- a/packages/block-library/src/navigation/index.php +++ b/packages/block-library/src/navigation/index.php @@ -75,7 +75,7 @@ function block_core_navigation_sort_menu_items_by_parent_id( $menu_items ) { function block_core_navigation_get_inner_blocks_from_unstable_location( $attributes ) { $menu_items = block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ); if ( empty( $menu_items ) ) { - return ''; + return array(); } $menu_items_by_parent_id = block_core_navigation_sort_menu_items_by_parent_id( $menu_items ); From 46306424a340f43f95ce3f2992eeb130beee6a33 Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Wed, 29 Nov 2023 16:32:31 +0800 Subject: [PATCH 3/4] Use an empty WP_Block_List as a return value --- .../wordpress-6.5/class-wp-navigation-block-renderer.php | 4 ++-- packages/block-library/src/navigation/index.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php b/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php index 1aa7951b03f4a..b2b40229b3afc 100644 --- a/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php +++ b/lib/compat/wordpress-6.5/class-wp-navigation-block-renderer.php @@ -185,7 +185,7 @@ private static function get_inner_blocks_html( $attributes, $inner_blocks ) { private static function get_inner_blocks_from_navigation_post( $attributes ) { $navigation_post = get_post( $attributes['ref'] ); if ( ! isset( $navigation_post ) ) { - return array(); + return new WP_Block_List( array(), $attributes ); } // Only published posts are valid. If this is changed then a corresponding change @@ -214,7 +214,7 @@ private static function get_inner_blocks_from_fallback( $attributes ) { // Fallback my have been filtered so do basic test for validity. if ( empty( $fallback_blocks ) || ! is_array( $fallback_blocks ) ) { - return array(); + return new WP_Block_List( array(), $attributes ); } return new WP_Block_List( $fallback_blocks, $attributes ); diff --git a/packages/block-library/src/navigation/index.php b/packages/block-library/src/navigation/index.php index 46a881b7050ba..6fb55efe9f8b9 100644 --- a/packages/block-library/src/navigation/index.php +++ b/packages/block-library/src/navigation/index.php @@ -75,7 +75,7 @@ function block_core_navigation_sort_menu_items_by_parent_id( $menu_items ) { function block_core_navigation_get_inner_blocks_from_unstable_location( $attributes ) { $menu_items = block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ); if ( empty( $menu_items ) ) { - return array(); + return new WP_Block_List( array(), $attributes ); } $menu_items_by_parent_id = block_core_navigation_sort_menu_items_by_parent_id( $menu_items ); From c23ede6dd5095721549d18010cafe393f0d65dba Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Mon, 11 Dec 2023 12:05:05 +0800 Subject: [PATCH 4/4] Add a unit test for get_inner_blocks_from_navigation_post --- ...lass-wp-navigation-block-renderer-test.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/phpunit/class-wp-navigation-block-renderer-test.php b/phpunit/class-wp-navigation-block-renderer-test.php index 73f3c89d79883..124e0fe91bd1e 100644 --- a/phpunit/class-wp-navigation-block-renderer-test.php +++ b/phpunit/class-wp-navigation-block-renderer-test.php @@ -62,4 +62,23 @@ public function test_gutenberg_get_markup_for_inner_block_site_title() { $expected = '
  • Test Blog

  • '; $this->assertEquals( $expected, $result ); } + + /** + * Test that the `get_inner_blocks_from_navigation_post` method returns an empty block list for a non-existent post. + * + * @group navigation-renderer + * + * @covers WP_Navigation_Block_Renderer::get_inner_blocks_from_navigation_post + */ + public function test_gutenberg_get_inner_blocks_from_navigation_post_returns_empty_block_list() { + $reflection = new ReflectionClass( 'WP_Navigation_Block_Renderer' ); + $method = $reflection->getMethod( 'get_inner_blocks_from_navigation_post' ); + $method->setAccessible( true ); + $attributes = array( 'ref' => 0 ); + + $actual = $method->invoke( $reflection, $attributes ); + $expected = new WP_Block_List( array(), $attributes ); + $this->assertEquals( $actual, $expected ); + $this->assertCount( 0, $actual ); + } }