WP_Theme_JSON::get_feature_declarations_for_node( object $metadata, object $node ): array

Generates style declarations for a node’s features e.g., color, border, typography etc. that have custom selectors in their related block’s metadata.


Parameters

$metadata object Required
The related block metadata containing selectors.
$node object Required
A merged theme.json node for block or variation.

Top ↑

Return

array The style declarations for the node's features with custom selectors.


Top ↑

Source

File: wp-includes/class-wp-theme-json.php. View all references

		$element_selector = array();
		foreach ( $block_selectors as $selector ) {
			if ( $selector === $el_selector ) {
				$element_selector = array( $el_selector );
				break;
			}
			$element_selector[] = static::prepend_to_selector( $el_selector, $selector . ' ' );
		}
		$element_selectors[ $el_name ] = implode( ',', $element_selector );
	}

	return $element_selectors;
}

/**
 * Generates style declarations for a node's features e.g., color, border,
 * typography etc. that have custom selectors in their related block's
 * metadata.
 *
 * @since 6.3.0
 *
 * @param object $metadata The related block metadata containing selectors.
 * @param object $node     A merged theme.json node for block or variation.
 *
 * @return array The style declarations for the node's features with custom
 * selectors.
 */
protected function get_feature_declarations_for_node( $metadata, &$node ) {
	$declarations = array();

	if ( ! isset( $metadata['selectors'] ) ) {
		return $declarations;
	}

	$settings = isset( $this->theme_json['settings'] )
		? $this->theme_json['settings']
		: array();

	foreach ( $metadata['selectors'] as $feature => $feature_selectors ) {
		/*
		 * Skip if this is the block's root selector or the block doesn't
		 * have any styles for the feature.
		 */
		if ( 'root' === $feature || empty( $node[ $feature ] ) ) {
			continue;
		}

		if ( is_array( $feature_selectors ) ) {
			foreach ( $feature_selectors as $subfeature => $subfeature_selector ) {
				if ( 'root' === $subfeature || empty( $node[ $feature ][ $subfeature ] ) ) {
					continue;
				}

				/*
				 * Create temporary node containing only the subfeature data
				 * to leverage existing `compute_style_properties` function.
				 */
				$subfeature_node = array(
					$feature => array(
						$subfeature => $node[ $feature ][ $subfeature ],
					),
				);

				// Generate style declarations.
				$new_declarations = static::compute_style_properties( $subfeature_node, $settings, null, $this->theme_json );

				// Merge subfeature declarations into feature declarations.
				if ( isset( $declarations[ $subfeature_selector ] ) ) {
					foreach ( $new_declarations as $new_declaration ) {
						$declarations[ $subfeature_selector ][] = $new_declaration;
					}
				} else {
					$declarations[ $subfeature_selector ] = $new_declarations;
				}

				/*
				 * Remove the subfeature from the block's node now its
				 * styles will be included under its own selector not the
				 * block's.
				 */
				unset( $node[ $feature ][ $subfeature ] );
			}
		}

		/*
		 * Now subfeatures have been processed and removed we can process
		 * feature root selector or simple string selector.
		 */
		if (
			is_string( $feature_selectors ) ||
			( isset( $feature_selectors['root'] ) && $feature_selectors['root'] )
		) {
			$feature_selector = is_string( $feature_selectors ) ? $feature_selectors : $feature_selectors['root'];

			/*
			 * Create temporary node containing only the feature data
			 * to leverage existing `compute_style_properties` function.

Top ↑

Changelog

Changelog
Version Description
6.3.0 Introduced.

Top ↑

User Contributed Notes

You must log in before being able to contribute a note or feedback.