diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php index dae7ed7e4c..7d1669caf1 100644 --- a/src/wp-includes/theme.php +++ b/src/wp-includes/theme.php @@ -966,23 +966,31 @@ function validate_theme_requirements( $stylesheet ) { * Retrieves all theme modifications. * * @since 3.1.0 + * @since 5.9.0 The return value is always an array. * - * @return array|void Theme modifications. + * @return array Theme modifications. */ function get_theme_mods() { $theme_slug = get_option( 'stylesheet' ); $mods = get_option( "theme_mods_$theme_slug" ); + if ( false === $mods ) { $theme_name = get_option( 'current_theme' ); if ( false === $theme_name ) { $theme_name = wp_get_theme()->get( 'Name' ); } + $mods = get_option( "mods_$theme_name" ); // Deprecated location. if ( is_admin() && false !== $mods ) { update_option( "theme_mods_$theme_slug", $mods ); delete_option( "mods_$theme_name" ); } } + + if ( ! is_array( $mods ) ) { + $mods = array(); + } + return $mods; } diff --git a/tests/phpunit/tests/option/themeMods.php b/tests/phpunit/tests/option/themeMods.php index 53683f72a0..2ed14f194f 100644 --- a/tests/phpunit/tests/option/themeMods.php +++ b/tests/phpunit/tests/option/themeMods.php @@ -19,6 +19,15 @@ class Tests_Option_Theme_Mods extends WP_UnitTestCase { $this->assertSame( $expected, get_theme_mod( 'test_name' ) ); } + /** + * @ticket 51423 + */ + function test_theme_mod_set_with_invalid_theme_mods_option() { + $theme_slug = get_option( 'stylesheet' ); + update_option( 'theme_mods_' . $theme_slug, '' ); + self::test_theme_mod_set(); + } + function test_theme_mod_update() { set_theme_mod( 'test_update', 'first_value' ); $expected = 'updated_value';