Skip to content

Commit 830d66c

Browse files
committed
Background images: resolve theme.json dynamic ref values and ensure appropriate style default values
The commit syncs the following changes from Gutenberg: - Background images: add support for theme.json ref value resolution gutenberg#64128 - Background images: ensure appropriate default values gutenberg#64192 - Background image: ensure consistency with defaults and fix reset/remove functionality gutenberg#64328 These changes brings consistency to the default background image styles WordPress applies to user uploaded images, and adds support for ref resolution to "background" style properties. Props andrewserong, aaronrobertshaw. Fixes #61858 git-svn-id: https://develop.svn.wordpress.org/trunk@58936 602fd350-edb4-49c9-b593-d223f7449a82
1 parent a3520d2 commit 830d66c

4 files changed

Lines changed: 258 additions & 26 deletions

File tree

src/wp-includes/block-supports/background.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function wp_render_background_support( $block_content, $block ) {
7575

7676
// If the background size is set to `contain` and no position is set, set the position to `center`.
7777
if ( 'contain' === $background_styles['backgroundSize'] && ! $background_styles['backgroundPosition'] ) {
78-
$background_styles['backgroundPosition'] = 'center';
78+
$background_styles['backgroundPosition'] = '50% 50%';
7979
}
8080
}
8181

src/wp-includes/class-wp-theme-json.php

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,14 +2295,15 @@ protected static function flatten_tree( $tree, $prefix = '', $token = '--' ) {
22952295
*
22962296
* array(
22972297
* 'name' => 'property_name',
2298-
* 'value' => 'property_value,
2298+
* 'value' => 'property_value',
22992299
* )
23002300
*
23012301
* @since 5.8.0
23022302
* @since 5.9.0 Added the `$settings` and `$properties` parameters.
23032303
* @since 6.1.0 Added `$theme_json`, `$selector`, and `$use_root_padding` parameters.
23042304
* @since 6.5.0 Output a `min-height: unset` rule when `aspect-ratio` is set.
23052305
* @since 6.6.0 Pass current theme JSON settings to wp_get_typography_font_size_value(), and process background properties.
2306+
* @since 6.7.0 `ref` resolution of background properties, and assigning custom default values.
23062307
*
23072308
* @param array $styles Styles to process.
23082309
* @param array $settings Theme settings.
@@ -2356,10 +2357,27 @@ protected static function compute_style_properties( $styles, $settings = array()
23562357
}
23572358
}
23582359

2359-
// Processes background styles.
2360-
if ( 'background' === $value_path[0] && isset( $styles['background'] ) ) {
2361-
$background_styles = wp_style_engine_get_styles( array( 'background' => $styles['background'] ) );
2362-
$value = isset( $background_styles['declarations'][ $css_property ] ) ? $background_styles['declarations'][ $css_property ] : $value;
2360+
/*
2361+
* Processes background image styles.
2362+
* If the value is a URL, it will be converted to a CSS `url()` value.
2363+
* For uploaded image (images with a database ID), apply size and position defaults,
2364+
* equal to those applied in block supports in lib/background.php.
2365+
*/
2366+
if ( 'background-image' === $css_property && ! empty( $value ) ) {
2367+
$background_styles = wp_style_engine_get_styles(
2368+
array( 'background' => array( 'backgroundImage' => $value ) )
2369+
);
2370+
$value = $background_styles['declarations'][ $css_property ];
2371+
}
2372+
if ( empty( $value ) && static::ROOT_BLOCK_SELECTOR !== $selector && ! empty( $styles['background']['backgroundImage']['id'] ) ) {
2373+
if ( 'background-size' === $css_property ) {
2374+
$value = 'cover';
2375+
}
2376+
// If the background size is set to `contain` and no position is set, set the position to `center`.
2377+
if ( 'background-position' === $css_property ) {
2378+
$background_size = $styles['background']['backgroundSize'] ?? null;
2379+
$value = 'contain' === $background_size ? '50% 50%' : null;
2380+
}
23632381
}
23642382

23652383
// Skip if empty and not "0" or value represents array of longhand values.
@@ -2421,6 +2439,7 @@ protected static function compute_style_properties( $styles, $settings = array()
24212439
* to the standard form "--wp--preset--color--secondary".
24222440
* This is already done by the sanitize method,
24232441
* so every property will be in the standard form.
2442+
* @since 6.7.0 Added support for background image refs.
24242443
*
24252444
* @param array $styles Styles subtree.
24262445
* @param array $path Which property to process.
@@ -2437,14 +2456,18 @@ protected static function get_property_value( $styles, $path, $theme_json = null
24372456

24382457
/*
24392458
* This converts references to a path to the value at that path
2440-
* where the values is an array with a "ref" key, pointing to a path.
2459+
* where the value is an array with a "ref" key, pointing to a path.
24412460
* For example: { "ref": "style.color.background" } => "#fff".
2461+
* In the case of backgroundImage, if both a ref and a URL are present in the value,
2462+
* the URL takes precedence and the ref is ignored.
24422463
*/
24432464
if ( is_array( $value ) && isset( $value['ref'] ) ) {
24442465
$value_path = explode( '.', $value['ref'] );
24452466
$ref_value = _wp_array_get( $theme_json, $value_path );
2467+
// Background Image refs can refer to a string or an array containing a URL string.
2468+
$ref_value_url = $ref_value['url'] ?? null;
24462469
// Only use the ref value if we find anything.
2447-
if ( ! empty( $ref_value ) && is_string( $ref_value ) ) {
2470+
if ( ! empty( $ref_value ) && ( is_string( $ref_value ) || is_string( $ref_value_url ) ) ) {
24482471
$value = $ref_value;
24492472
}
24502473

@@ -3083,6 +3106,7 @@ protected static function get_metadata_boolean( $data, $path, $default_value = f
30833106
*
30843107
* @since 5.8.0
30853108
* @since 5.9.0 Duotone preset also has origins.
3109+
* @since 6.7.0 Replace background image objects during merge.
30863110
*
30873111
* @param WP_Theme_JSON $incoming Data to merge.
30883112
*/
@@ -3206,6 +3230,25 @@ public function merge( $incoming ) {
32063230
}
32073231
}
32083232
}
3233+
3234+
/*
3235+
* Style values are merged at the leaf level, however
3236+
* some values provide exceptions, namely style values that are
3237+
* objects and represent unique definitions for the style.
3238+
*/
3239+
$style_nodes = static::get_styles_block_nodes();
3240+
foreach ( $style_nodes as $style_node ) {
3241+
$path = $style_node['path'];
3242+
/*
3243+
* Background image styles should be replaced, not merged,
3244+
* as they themselves are specific object definitions for the style.
3245+
*/
3246+
$background_image_path = array_merge( $path, static::PROPERTIES_METADATA['background-image'] );
3247+
$content = _wp_array_get( $incoming_data, $background_image_path, null );
3248+
if ( isset( $content ) ) {
3249+
_wp_array_set( $this->theme_json, $background_image_path, $content );
3250+
}
3251+
}
32093252
}
32103253

32113254
/**

tests/phpunit/tests/block-supports/wpRenderBackgroundSupport.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public function filter_set_theme_root() {
7070
* @ticket 60175
7171
* @ticket 61123
7272
* @ticket 61720
73+
* @ticket 61858
7374
*
7475
* @covers ::wp_render_background_support
7576
*
@@ -154,7 +155,7 @@ public function data_background_block_support() {
154155
'backgroundSize' => 'contain',
155156
'backgroundAttachment' => 'fixed',
156157
),
157-
'expected_wrapper' => '<div class="has-background" style="background-image:url(&#039;https://example.com/image.jpg&#039;);background-position:center;background-repeat:no-repeat;background-size:contain;background-attachment:fixed;">Content</div>',
158+
'expected_wrapper' => '<div class="has-background" style="background-image:url(&#039;https://example.com/image.jpg&#039;);background-position:50% 50%;background-repeat:no-repeat;background-size:contain;background-attachment:fixed;">Content</div>',
158159
'wrapper' => '<div>Content</div>',
159160
),
160161
'background image style is appended if a style attribute already exists' => array(

0 commit comments

Comments
 (0)