--- a/wp/wp-includes/class-wp-theme-json-resolver.php Fri Sep 05 18:40:08 2025 +0200
+++ b/wp/wp-includes/class-wp-theme-json-resolver.php Fri Sep 05 18:52:52 2025 +0200
@@ -848,6 +848,7 @@
* as the value of `_link` object in REST API responses.
*
* @since 6.6.0
+ * @since 6.7.0 Resolve relative paths in block styles.
*
* @param WP_Theme_JSON $theme_json A theme json instance.
* @return array An array of resolved paths.
@@ -860,15 +861,14 @@
}
$theme_json_data = $theme_json->get_raw_data();
-
- // Top level styles.
- $background_image_url = isset( $theme_json_data['styles']['background']['backgroundImage']['url'] ) ? $theme_json_data['styles']['background']['backgroundImage']['url'] : null;
-
/*
* The same file convention when registering web fonts.
* See: WP_Font_Face_Resolver::to_theme_file_uri.
*/
$placeholder = 'file:./';
+
+ // Top level styles.
+ $background_image_url = $theme_json_data['styles']['background']['backgroundImage']['url'] ?? null;
if (
isset( $background_image_url ) &&
is_string( $background_image_url ) &&
@@ -888,6 +888,33 @@
$resolved_theme_uris[] = $resolved_theme_uri;
}
+ // Block styles.
+ if ( ! empty( $theme_json_data['styles']['blocks'] ) ) {
+ foreach ( $theme_json_data['styles']['blocks'] as $block_name => $block_styles ) {
+ if ( ! isset( $block_styles['background']['backgroundImage']['url'] ) ) {
+ continue;
+ }
+ $background_image_url = $block_styles['background']['backgroundImage']['url'];
+ if (
+ is_string( $background_image_url ) &&
+ // Skip if the src doesn't start with the placeholder, as there's nothing to replace.
+ str_starts_with( $background_image_url, $placeholder )
+ ) {
+ $file_type = wp_check_filetype( $background_image_url );
+ $src_url = str_replace( $placeholder, '', $background_image_url );
+ $resolved_theme_uri = array(
+ 'name' => $background_image_url,
+ 'href' => sanitize_url( get_theme_file_uri( $src_url ) ),
+ 'target' => "styles.blocks.{$block_name}.background.backgroundImage.url",
+ );
+ if ( isset( $file_type['type'] ) ) {
+ $resolved_theme_uri['type'] = $file_type['type'];
+ }
+ $resolved_theme_uris[] = $resolved_theme_uri;
+ }
+ }
+ }
+
return $resolved_theme_uris;
}
@@ -906,18 +933,14 @@
return $theme_json;
}
- $resolved_theme_json_data = array(
- 'version' => WP_Theme_JSON::LATEST_SCHEMA,
- );
+ $resolved_theme_json_data = $theme_json->get_raw_data();
foreach ( $resolved_urls as $resolved_url ) {
$path = explode( '.', $resolved_url['target'] );
_wp_array_set( $resolved_theme_json_data, $path, $resolved_url['href'] );
}
- $theme_json->merge( new WP_Theme_JSON( $resolved_theme_json_data ) );
-
- return $theme_json;
+ return new WP_Theme_JSON( $resolved_theme_json_data );
}
/**