WP_Theme_JSON::compute_style_properties()protected staticWP 5.8.0

Given a styles array, it extracts the style properties and adds them to the $declarations array following the format:

array( 'name' => 'property_name', 'value' => 'property_value,

)

Method of the class: WP_Theme_JSON{}

No Hooks.

Return

Array. Returns the modified $declarations.

Usage

$result = WP_Theme_JSON::compute_style_properties( $styles, $settings, $properties, $theme_json, $selector, $use_root_padding );
$styles(array) (required)
Styles to process.
$settings(array)
Theme settings.
Default: array()
$properties(array)
Properties metadata.
Default: null
$theme_json(array)
Theme JSON array.
Default: null
$selector(string)
The style block selector.
Default: null
$use_root_padding(true|false)
Whether to add custom properties at root level.
Default: null

Changelog

Since 5.8.0 Introduced.
Since 5.9.0 Added the $settings and $properties parameters.
Since 6.1.0 Added $theme_json, $selector, and $use_root_padding parameters.
Since 6.5.0 Output a min-height: unset rule when aspect-ratio is set.

WP_Theme_JSON::compute_style_properties() code WP 6.5.2

protected static function compute_style_properties( $styles, $settings = array(), $properties = null, $theme_json = null, $selector = null, $use_root_padding = null ) {
	if ( null === $properties ) {
		$properties = static::PROPERTIES_METADATA;
	}

	$declarations = array();
	if ( empty( $styles ) ) {
		return $declarations;
	}

	$root_variable_duplicates = array();

	foreach ( $properties as $css_property => $value_path ) {
		$value = static::get_property_value( $styles, $value_path, $theme_json );

		if ( str_starts_with( $css_property, '--wp--style--root--' ) && ( static::ROOT_BLOCK_SELECTOR !== $selector || ! $use_root_padding ) ) {
			continue;
		}
		/*
		 * Root-level padding styles don't currently support strings with CSS shorthand values.
		 * This may change: https://github.com/WordPress/gutenberg/issues/40132.
		 */
		if ( '--wp--style--root--padding' === $css_property && is_string( $value ) ) {
			continue;
		}

		if ( str_starts_with( $css_property, '--wp--style--root--' ) && $use_root_padding ) {
			$root_variable_duplicates[] = substr( $css_property, strlen( '--wp--style--root--' ) );
		}

		/*
		 * Look up protected properties, keyed by value path.
		 * Skip protected properties that are explicitly set to `null`.
		 */
		if ( is_array( $value_path ) ) {
			$path_string = implode( '.', $value_path );
			if (
				isset( static::PROTECTED_PROPERTIES[ $path_string ] ) &&
				_wp_array_get( $settings, static::PROTECTED_PROPERTIES[ $path_string ], null ) === null
			) {
				continue;
			}
		}

		// Skip if empty and not "0" or value represents array of longhand values.
		$has_missing_value = empty( $value ) && ! is_numeric( $value );
		if ( $has_missing_value || is_array( $value ) ) {
			continue;
		}

		// Calculates fluid typography rules where available.
		if ( 'font-size' === $css_property ) {
			/*
			 * wp_get_typography_font_size_value() will check
			 * if fluid typography has been activated and also
			 * whether the incoming value can be converted to a fluid value.
			 * Values that already have a clamp() function will not pass the test,
			 * and therefore the original $value will be returned.
			 */
			$value = wp_get_typography_font_size_value( array( 'size' => $value ) );
		}

		if ( 'aspect-ratio' === $css_property ) {
			// For aspect ratio to work, other dimensions rules must be unset.
			// This ensures that a fixed height does not override the aspect ratio.
			$declarations[] = array(
				'name'  => 'min-height',
				'value' => 'unset',
			);
		}

		$declarations[] = array(
			'name'  => $css_property,
			'value' => $value,
		);
	}

	// If a variable value is added to the root, the corresponding property should be removed.
	foreach ( $root_variable_duplicates as $duplicate ) {
		$discard = array_search( $duplicate, array_column( $declarations, 'name' ), true );
		if ( is_numeric( $discard ) ) {
			array_splice( $declarations, $discard, 1 );
		}
	}

	return $declarations;
}