diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index 749ee90c0c..4f5627a790 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -1709,7 +1709,12 @@ class WP_Theme_JSON { * @return string|array Style property value. */ protected static function get_property_value( $styles, $path, $theme_json = null ) { - $value = _wp_array_get( $styles, $path ); + $value = _wp_array_get( $styles, $path, '' ); + + if ( '' === $value || null === $value ) { + // No need to process the value further. + return ''; + } /* * This converts references to a path to the value at that path diff --git a/tests/phpunit/tests/theme/wpThemeJson.php b/tests/phpunit/tests/theme/wpThemeJson.php index 4cc81c98b2..1eb8bb4f6e 100644 --- a/tests/phpunit/tests/theme/wpThemeJson.php +++ b/tests/phpunit/tests/theme/wpThemeJson.php @@ -2996,6 +2996,54 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase { $this->assertSame( $expected, $theme_json->get_stylesheet() ); } + /** + * Tests that get_property_value() static method returns an empty string + * if the path is invalid or the value is null. + * + * Also, tests that PHP 8.1 "passing null to non-nullable" deprecation notice + * is not thrown when passing the value to strncmp() in the method. + * + * The notice that we should not see: + * `Deprecated: strncmp(): Passing null to parameter #1 ($string1) of type string is deprecated`. + * + * @dataProvider data_get_property_value_should_return_string_for_invalid_paths_or_null_values + * + * @ticket 56620 + * + * @covers WP_Theme_JSON::get_property_value + * + * @param array $styles An array with style definitions. + * @param array $path Path to the desired properties. + * + */ + public function test_get_property_value_should_return_string_for_invalid_paths_or_null_values( $styles, $path ) { + $reflection_class = new ReflectionClass( WP_Theme_JSON::class ); + + $get_property_value_method = $reflection_class->getMethod( 'get_property_value' ); + $get_property_value_method->setAccessible( true ); + $result = $get_property_value_method->invoke( null, $styles, $path ); + + $this->assertSame( '', $result ); + } + + /** + * Data provider for test_get_property_value_should_return_string_for_invalid_paths_or_null_values(). + * + * @return array + */ + public function data_get_property_value_should_return_string_for_invalid_paths_or_null_values() { + return array( + 'empty string' => array( + 'styles' => array(), + 'path' => array( 'non_existent_path' ), + ), + 'null' => array( + 'styles' => array( 'some_null_value' => null ), + 'path' => array( 'some_null_value' ), + ), + ); + } + /** * Testing that dynamic properties in theme.json that refer to other dynamic properties in a loop * should be left untouched. @@ -3084,7 +3132,6 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase { $this->assertSame( $expected, $theme_json->get_stylesheet() ); } - /** * @dataProvider data_get_layout_definitions *