WP_Theme_JSON::get_from_editor_settings( array $settings ): array

In this article

Transforms the given editor settings according the add_theme_support format to the theme.json format.

Parameters

$settingsarrayrequired
Existing editor settings.

Return

array Config that adheres to the theme.json schema.

Source


	$spacing_scale = _wp_array_get( $incoming_data, $scale_path, null );
	if ( ! isset( $spacing_scale ) ) {
		continue;
	}

	// Allow partial scale settings by merging with lower layers.
	$flattened_spacing_scale = array_replace( $flattened_spacing_scale, $spacing_scale );

	// Generate and merge the scales for this layer.
	$sizes_path           = array( 'settings', 'spacing', 'spacingSizes', $origin );
	$spacing_sizes        = _wp_array_get( $incoming_data, $sizes_path, array() );
	$spacing_scale_sizes  = static::compute_spacing_sizes( $flattened_spacing_scale );
	$merged_spacing_sizes = static::merge_spacing_sizes( $spacing_scale_sizes, $spacing_sizes );

	_wp_array_set( $incoming_data, $sizes_path, $merged_spacing_sizes );
}

/*
 * The array_replace_recursive algorithm merges at the leaf level,
 * but we don't want leaf arrays to be merged, so we overwrite it.
 *
 * For leaf values that are sequential arrays it will use the numeric indexes for replacement.
 * We rather replace the existing with the incoming value, if it exists.
 * This is the case of spacing.units.
 *
 * For leaf values that are associative arrays it will merge them as expected.
 * This is also not the behavior we want for the current associative arrays (presets).
 * We rather replace the existing with the incoming value, if it exists.
 * This happens, for example, when we merge data from theme.json upon existing
 * theme supports or when we merge anything coming from the same source twice.
 * This is the case of color.palette, color.gradients, color.duotone,
 * typography.fontSizes, or typography.fontFamilies.
 *
 * Additionally, for some preset types, we also want to make sure the
 * values they introduce don't conflict with default values. We do so
 * by checking the incoming slugs for theme presets and compare them
 * with the equivalent default presets: if a slug is present as a default
 * we remove it from the theme presets.
 */
$nodes        = static::get_setting_nodes( $incoming_data );
$slugs_global = static::get_default_slugs( $this->theme_json, array( 'settings' ) );
foreach ( $nodes as $node ) {
	// Replace the spacing.units.
	$path   = $node['path'];
	$path[] = 'spacing';
	$path[] = 'units';

	$content = _wp_array_get( $incoming_data, $path, null );
	if ( isset( $content ) ) {
		_wp_array_set( $this->theme_json, $path, $content );
	}

	// Replace the presets.
	foreach ( static::PRESETS_METADATA as $preset_metadata ) {
		$prevent_override = $preset_metadata['prevent_override'];
		if ( is_array( $prevent_override ) ) {
			$prevent_override = _wp_array_get( $this->theme_json['settings'], $preset_metadata['prevent_override'] );
		}

		foreach ( static::VALID_ORIGINS as $origin ) {
			$base_path = $node['path'];
			foreach ( $preset_metadata['path'] as $leaf ) {
				$base_path[] = $leaf;
			}

			$path   = $base_path;
			$path[] = $origin;

			$content = _wp_array_get( $incoming_data, $path, null );
			if ( ! isset( $content ) ) {
				continue;
			}

			// Set names for theme presets based on the slug if they are not set and can use default names.
			if ( 'theme' === $origin && $preset_metadata['use_default_names'] ) {
				foreach ( $content as $key => $item ) {
					if ( ! isset( $item['name'] ) ) {
						$name = static::get_name_from_defaults( $item['slug'], $base_path );
						if ( null !== $name ) {
							$content[ $key ]['name'] = $name;

Changelog

VersionDescription
5.8.0Introduced.

User Contributed Notes

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